From 4f056672f9d66fe6e676fd64efc86b9344c47efc Mon Sep 17 00:00:00 2001 From: cool dolphin <36332236+Afrokada@users.noreply.github.com> Date: Fri, 26 Apr 2024 01:18:39 +0200 Subject: [PATCH 01/66] Glasses in loadouts (#27286) * loadouts now have aaall the glasses * cheap sunglasses dont exist at all * empty commit to rerun tests, there's no way i fucked something up --- .../en-US/preferences/loadout-groups.ftl | 1 + .../Loadouts/Miscellaneous/glasses.yml | 56 +++++++++++++++++++ .../Prototypes/Loadouts/loadout_groups.yml | 11 +++- .../Prototypes/Loadouts/role_loadouts.yml | 27 +++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml diff --git a/Resources/Locale/en-US/preferences/loadout-groups.ftl b/Resources/Locale/en-US/preferences/loadout-groups.ftl index cdad0f72e6..a093a8463a 100644 --- a/Resources/Locale/en-US/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/preferences/loadout-groups.ftl @@ -1,5 +1,6 @@ # Miscellaneous loadout-group-trinkets = Trinkets +loadout-group-glasses = Glasses # Command loadout-group-captain-head = Captain head diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml b/Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml new file mode 100644 index 0000000000..605e0e66d2 --- /dev/null +++ b/Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml @@ -0,0 +1,56 @@ +# Timers +- type: loadoutEffectGroup + id: JamjarTimer + effects: + - !type:JobRequirementLoadoutEffect + requirement: + !type:RoleTimeRequirement + role: JobLibrarian + time: 3600 # 1 hour of being the biggest nerd on the station + +- type: loadoutEffectGroup + id: JensenTimer + effects: + - !type:JobRequirementLoadoutEffect + requirement: + !type:DepartmentTimeRequirement + department: Cargo + time: 36000 #10 hours of being a space trucker + +# Basic options +# Glasses +- type: loadout + id: Glasses + equipment: Glasses + +- type: startingGear + id: Glasses + equipment: + eyes: ClothingEyesGlasses + +# Special options +# Jamjar +- type: loadout + id: GlassesJamjar + equipment: GlassesJamjar + effects: + - !type:GroupLoadoutEffect + proto: JamjarTimer + +- type: startingGear + id: GlassesJamjar + equipment: + eyes: ClothingEyesGlassesJamjar + +# Jensen +- type: loadout + id: GlassesJensen + equipment: GlassesJensen + effects: + - !type:GroupLoadoutEffect + proto: JensenTimer + +- type: startingGear + id: GlassesJensen + equipment: + eyes: ClothingEyesGlassesJensen diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index a50e9ceb71..acec697da2 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -17,7 +17,16 @@ - ClothingNeckTransPin - ClothingNeckAutismPin - ClothingNeckGoldAutismPin - + +- type: loadoutGroup + id: Glasses + name: loadout-group-glasses + minLimit: 0 + loadouts: + - Glasses + - GlassesJamjar + - GlassesJensen + # Command - type: loadoutGroup id: CaptainHead diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index c5fb042d0c..a5aeda58b5 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -17,6 +17,7 @@ - HoPJumpsuit - HoPBackpack - HoPOuterClothing + - Glasses - Trinkets # Civilian @@ -29,6 +30,7 @@ - PassengerGloves - PassengerOuterClothing - PassengerShoes + - Glasses - Trinkets - type: roleLoadout @@ -38,6 +40,7 @@ - BartenderJumpsuit - CommonBackpack - BartenderOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -45,6 +48,7 @@ groups: - BartenderJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -55,6 +59,7 @@ - ChefJumpsuit - CommonBackpack - ChefOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -62,6 +67,7 @@ groups: - LibrarianJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -70,6 +76,7 @@ - LawyerNeck - LawyerJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -81,6 +88,7 @@ - ChaplainJumpsuit - ChaplainBackpack - ChaplainOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -91,6 +99,7 @@ - JanitorGloves - CommonBackpack - JanitorOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -100,6 +109,7 @@ - BotanistJumpsuit - BotanistBackpack - BotanistOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -110,6 +120,7 @@ - ClownBackpack - ClownOuterClothing - ClownShoes + - Glasses - Trinkets - type: roleLoadout @@ -120,6 +131,7 @@ - MimeJumpsuit - MimeBackpack - MimeOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -127,6 +139,7 @@ groups: - MusicianBackpack - MusicianOuterClothing + - Glasses - Trinkets # Cargo @@ -139,6 +152,7 @@ - QuartermasterBackpack - QuartermasterOuterClothing - QuartermasterShoes + - Glasses - Trinkets - type: roleLoadout @@ -149,6 +163,7 @@ - CargoTechnicianBackpack - CargoTechnicianOuterClothing - CargoTechnicianShoes + - Glasses - Trinkets - type: roleLoadout @@ -157,6 +172,7 @@ - SalvageSpecialistBackpack - SalvageSpecialistOuterClothing - SalvageSpecialistShoes + - Glasses - Trinkets # Engineering @@ -209,6 +225,7 @@ - ResearchDirectorOuterClothing - ScientistGloves - ResearchDirectorShoes + - Glasses - Trinkets - type: roleLoadout @@ -222,6 +239,7 @@ - ScientistGloves - ScientistShoes - ScientistPDA + - Glasses - Trinkets - type: roleLoadout @@ -229,6 +247,7 @@ groups: - ResearchAssistantJumpsuit - ScientistBackpack + - Glasses - Trinkets # Security @@ -297,6 +316,7 @@ - ChiefMedicalOfficerOuterClothing - ChiefMedicalOfficerNeck - ChiefMedicalOfficerShoes + - Glasses - Trinkets - type: roleLoadout @@ -310,6 +330,7 @@ - MedicalDoctorOuterClothing - MedicalShoes - MedicalDoctorPDA + - Glasses - Trinkets - type: roleLoadout @@ -317,6 +338,7 @@ groups: - MedicalInternJumpsuit - MedicalBackpack + - Glasses - Trinkets - type: roleLoadout @@ -340,6 +362,7 @@ - ParamedicBackpack - ParamedicOuterClothing - ParamedicShoes + - Glasses - Trinkets # Wildcards @@ -347,6 +370,7 @@ id: JobZookeeper groups: - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -354,12 +378,14 @@ groups: - ReporterJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout id: JobPsychologist groups: - MedicalBackpack + - Glasses - Trinkets - type: roleLoadout @@ -368,4 +394,5 @@ - BoxerJumpsuit - BoxerGloves - CommonBackpack + - Glasses - Trinkets From 281e5fa448dd9c3ed12182cebddf3acc523d1058 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 25 Apr 2024 23:19:46 +0000 Subject: [PATCH 02/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a357848aa5..3feb6f6275 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Darkness is coming. A new shadow anomaly added. - type: Add - id: 5935 - time: '2024-02-13T22:12:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24629 - author: jamessimo changes: - message: Microwave UI enhancements @@ -3850,3 +3843,10 @@ id: 6434 time: '2024-04-25T02:19:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/25912 +- author: cooldolphin + changes: + - message: Three variants of glasses are now available in the loadout menu. + type: Add + id: 6435 + time: '2024-04-25T23:18:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27286 From a0b3a6b679fb164fdf25ade01f549a5e9409b68f Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 25 Apr 2024 20:25:57 -0400 Subject: [PATCH 03/66] fix antag bugs (#27319) * fix antag bugs * Update NukeopsRuleComponent.cs --- .../Antag/AntagSelectionPlayerPool.cs | 8 ++- Content.Server/Antag/AntagSelectionSystem.cs | 49 +++++++++++++------ .../Rules/Components/TraitorRuleComponent.cs | 2 +- .../Rules/GameRuleSystem.Utility.cs | 8 +++ .../GameTicking/Rules/GameRuleSystem.cs | 4 +- .../GameTicking/Rules/NukeopsRuleSystem.cs | 10 ++-- .../GameTicking/Rules/ThiefRuleSystem.cs | 1 + Content.Shared/Roles/SharedRoleSystem.cs | 33 +++++++++++++ 8 files changed, 86 insertions(+), 29 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionPlayerPool.cs b/Content.Server/Antag/AntagSelectionPlayerPool.cs index 054292dcf9..87873e96d1 100644 --- a/Content.Server/Antag/AntagSelectionPlayerPool.cs +++ b/Content.Server/Antag/AntagSelectionPlayerPool.cs @@ -5,15 +5,13 @@ using Robust.Shared.Random; namespace Content.Server.Antag; -public sealed class AntagSelectionPlayerPool(params List[] sessions) +public sealed class AntagSelectionPlayerPool (List> orderedPools) { - private readonly List> _orderedPools = sessions.ToList(); - public bool TryPickAndTake(IRobustRandom random, [NotNullWhen(true)] out ICommonSession? session) { session = null; - foreach (var pool in _orderedPools) + foreach (var pool in orderedPools) { if (pool.Count == 0) continue; @@ -25,5 +23,5 @@ public sealed class AntagSelectionPlayerPool(params List[] sessi return session != null; } - public int Count => _orderedPools.Sum(p => p.Count); + public int Count => orderedPools.Sum(p => p.Count); } diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index eb68e077b1..6bfb7394f5 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -35,7 +35,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem + /// Tries to makes a given player into the specified antagonist. + /// + public bool TryMakeAntag(Entity ent, ICommonSession? session, AntagSelectionDefinition def, bool ignoreSpawner = false) + { + if (!IsSessionValid(ent, session, def) || + !IsEntityValid(session?.AttachedEntity, def)) + { + return false; + } + + MakeAntag(ent, session, def, ignoreSpawner); + return true; + } + /// /// Makes a given player into the specified antagonist. /// @@ -262,7 +277,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem public AntagSelectionPlayerPool GetPlayerPool(Entity ent, List sessions, AntagSelectionDefinition def) { - var primaryList = new List(); - var secondaryList = new List(); - var fallbackList = new List(); - var rawList = new List(); + var preferredList = new List(); + var secondBestList = new List(); + var unwantedList = new List(); + var invalidList = new List(); foreach (var session in sessions) { if (!IsSessionValid(ent, session, def) || !IsEntityValid(session.AttachedEntity, def)) { - rawList.Add(session); + 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))) + if (def.PrefRoles.Count != 0 && pref.AntagPreferences.Any(p => def.PrefRoles.Contains(p))) { - primaryList.Add(session); + preferredList.Add(session); } - else if (def.PrefRoles.Count == 0 || pref.AntagPreferences.Any(p => def.FallbackRoles.Contains(p))) + else if (def.FallbackRoles.Count != 0 && pref.AntagPreferences.Any(p => def.FallbackRoles.Contains(p))) { - secondaryList.Add(session); + secondBestList.Add(session); } else { - fallbackList.Add(session); + unwantedList.Add(session); } } - return new AntagSelectionPlayerPool(primaryList, secondaryList, fallbackList, rawList); + return new AntagSelectionPlayerPool(new() { preferredList, secondBestList, unwantedList, invalidList }); } /// /// Checks if a given session is valid for an antagonist. /// - public bool IsSessionValid(Entity ent, ICommonSession session, AntagSelectionDefinition def, EntityUid? mind = null) + public bool IsSessionValid(Entity ent, ICommonSession? session, AntagSelectionDefinition def, EntityUid? mind = null) { + if (session == null) + return true; + mind ??= session.GetMind(); if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) diff --git a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs index ea5c9a830b..0db9d195dc 100644 --- a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs @@ -71,5 +71,5 @@ public sealed partial class TraitorRuleComponent : Component public int StartingBalance = 20; [DataField] - public int MaxDifficulty = 20; + public int MaxDifficulty = 5; } diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs index 4534333417..27a9edbad7 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs @@ -16,6 +16,14 @@ public abstract partial class GameRuleSystem where T: IComponent return EntityQueryEnumerator(); } + /// + /// Queries all gamerules, regardless of if they're active or not. + /// + protected EntityQueryEnumerator QueryAllRules() + { + return EntityQueryEnumerator(); + } + /// /// Utility function for finding a random event-eligible station entity /// diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.cs index bcad146c22..c167ae7b6c 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.cs @@ -34,8 +34,8 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon if (args.Forced || args.Cancelled) return; - var query = QueryActiveRules(); - while (query.MoveNext(out var uid, out _, out _, out var gameRule)) + var query = QueryAllRules(); + while (query.MoveNext(out var uid, out _, out var gameRule)) { var minPlayers = gameRule.MinPlayers; if (args.Players.Length >= minPlayers) diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index 2f8b9dc927..232d24004b 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -344,7 +344,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem var timeRemain = nukeops.WarNukieArriveDelay + Timing.CurTime; ev.DeclaratorEntity.Comp.ShuttleDisabledTime = timeRemain; - DistributeExtraTc(nukeops); + DistributeExtraTc((uid, nukeops)); } } } @@ -371,7 +371,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem return WarConditionStatus.YesWar; } - private void DistributeExtraTc(NukeopsRuleComponent nukieRule) + private void DistributeExtraTc(Entity nukieRule) { var enumerator = EntityQueryEnumerator(); while (enumerator.MoveNext(out var uid, out var component)) @@ -379,13 +379,13 @@ public sealed class NukeopsRuleSystem : GameRuleSystem if (!_tag.HasTag(uid, NukeOpsUplinkTagPrototype)) continue; - if (GetOutpost(uid) is not {} outpost) + if (GetOutpost(nukieRule.Owner) is not { } outpost) continue; if (Transform(uid).MapID != Transform(outpost).MapID) // Will receive bonus TC only on their start outpost continue; - _store.TryAddCurrency(new () { { TelecrystalCurrencyPrototype, nukieRule.WarTcAmountPerNukie } }, uid, component); + _store.TryAddCurrency(new () { { TelecrystalCurrencyPrototype, nukieRule.Comp.WarTcAmountPerNukie } }, uid, component); var msg = Loc.GetString("store-currency-war-boost-given", ("target", uid)); _popupSystem.PopupEntity(msg, uid); @@ -510,7 +510,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem if (!Resolve(ent, ref ent.Comp, false)) return null; - return ent.Comp.MapGrids.FirstOrNull(); + return ent.Comp.MapGrids.Where(e => HasComp(e) && !HasComp(e)).FirstOrNull(); } /// diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index b778f7c645..083085fa0d 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -34,6 +34,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem //Generate objectives GenerateObjectives(mindId, mind, ent); + _antag.SendBriefing(args.EntityUid, MakeBriefing(args.EntityUid), null, null); } private void GenerateObjectives(EntityUid mindId, MindComponent mind, ThiefRuleComponent thiefRule) diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index 1a732eb750..d5ac2e5923 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Mind; @@ -62,6 +63,38 @@ public abstract class SharedRoleSystem : EntitySystem _antagTypes.Add(typeof(T)); } + public void MindAddRoles(EntityUid mindId, ComponentRegistry components, MindComponent? mind = null, bool silent = false) + { + if (!Resolve(mindId, ref mind)) + return; + + EntityManager.AddComponents(mindId, components); + var antagonist = false; + foreach (var compReg in components.Values) + { + var compType = compReg.Component.GetType(); + + var comp = EntityManager.ComponentFactory.GetComponent(compType); + if (IsAntagonistRole(comp.GetType())) + { + antagonist = true; + break; + } + } + + var mindEv = new MindRoleAddedEvent(silent); + RaiseLocalEvent(mindId, ref mindEv); + + var message = new RoleAddedEvent(mindId, mind, antagonist, silent); + if (mind.OwnedEntity != null) + { + RaiseLocalEvent(mind.OwnedEntity.Value, message, true); + } + + _adminLogger.Add(LogType.Mind, LogImpact.Low, + $"Role components {string.Join(components.Keys.ToString(), ", ")} added to mind of {_minds.MindOwnerLoggingString(mind)}"); + } + public void MindAddRole(EntityUid mindId, Component component, MindComponent? mind = null, bool silent = false) { if (!Resolve(mindId, ref mind)) From 0aee198adf06e72014300f1f9a9d373112ce7a6b Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 00:27:03 +0000 Subject: [PATCH 04/66] Automatic changelog update --- Resources/Changelog/Admin.yml | 7 +++++++ Resources/Changelog/Changelog.yml | 23 ++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index d4ffb79e92..186b0500ae 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -168,5 +168,12 @@ Entries: id: 22 time: '2024-04-20T16:18:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27168 +- author: EmoGarbage404 + changes: + - message: Fixed antag status being broken in overlay and UI. + type: Fix + id: 23 + time: '2024-04-26T00:25:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27319 Name: Admin Order: 1 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3feb6f6275..2b5b326b23 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: jamessimo - changes: - - message: Microwave UI enhancements - type: Tweak - - message: Microwaves now tell you how much time is left when cooking - type: Tweak - - message: Microwaves UI now uses prediction for user inputs. - type: Fix - id: 5936 - time: '2024-02-13T22:16:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24547 - author: TheShuEd changes: - message: Remote signallers are now limited to a 15-tile radius @@ -3850,3 +3839,15 @@ id: 6435 time: '2024-04-25T23:18:39.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27286 +- author: EmoGarbage404 + changes: + - message: Traitors now have the correct number of objectives. + type: Fix + - message: Declaring war now gives TC again. + type: Fix + - message: Latejoining antagonists will now properly exclude command and security + staff. + type: Fix + id: 6436 + time: '2024-04-26T00:25:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27319 From b292905216948e0c85b04e8ef65a5291dd868eee Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Thu, 25 Apr 2024 22:25:52 -0400 Subject: [PATCH 05/66] Expand UseDelay to support multiple delays per entity; fix bible healing and bag pickup (#27234) * Upgraded UseDelay to support multiple delays per entity * Implement secondary delay for bibles. Also some improvements to make it work nicely. * Documentation is good * Reserve the previous change; now Storage uses the special ID and Bible uses the default. * .0 * Added VV support to UseDelayInfo * Serialize better * No register, just setlength --- .../Systems/Hands/HandsUIController.cs | 7 +- .../Fluids/EntitySystems/SpraySystem.cs | 2 +- .../Storage/EntitySystems/StorageSystem.cs | 15 +- .../EntitySystems/SharedStorageSystem.cs | 11 +- Content.Shared/Storage/StorageComponent.cs | 13 ++ Content.Shared/Timing/UseDelayComponent.cs | 53 +++--- Content.Shared/Timing/UseDelaySystem.cs | 154 ++++++++++++++---- 7 files changed, 193 insertions(+), 62 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs index 99d7bc77b8..9ee429ba7e 100644 --- a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs +++ b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs @@ -22,6 +22,7 @@ public sealed class HandsUIController : UIController, IOnStateEntered _handsContainers = new(); private readonly Dictionary _handContainerIndices = new(); @@ -450,15 +451,15 @@ public sealed class HandsUIController : UIController, IOnStateEntered(OnStorageFillMapInit); } + protected override void OnMapInit(Entity entity, ref MapInitEvent args) + { + base.OnMapInit(entity, ref args); + + if (TryComp(entity, out var useDelay)) + UseDelay.SetLength((entity, useDelay), entity.Comp.OpenUiCooldown, OpenUiUseDelayID); + } + private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent args) { var silent = false; @@ -120,13 +129,13 @@ public sealed partial class StorageSystem : SharedStorageSystem return; // prevent spamming bag open / honkerton honk sound - silent |= TryComp(uid, out var useDelay) && _useDelay.IsDelayed((uid, useDelay)); + silent |= TryComp(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay), OpenUiUseDelayID); if (!silent) { if (!storageComp.IsUiOpen) _audio.PlayPvs(storageComp.StorageOpenSound, uid); if (useDelay != null) - _useDelay.TryResetDelay((uid, useDelay)); + UseDelay.TryResetDelay((uid, useDelay), id: OpenUiUseDelayID); } Log.Debug($"Storage (UID {uid}) \"used\" by player session (UID {player.PlayerSession.AttachedEntity})."); diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 2021dfe2de..3bec0e1d01 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -72,6 +72,8 @@ public abstract class SharedStorageSystem : EntitySystem private readonly List _sortedSizes = new(); private FrozenDictionary _nextSmallest = FrozenDictionary.Empty; + private const string QuickInsertUseDelayID = "quickInsert"; + protected readonly List CantFillReasons = []; /// @@ -84,6 +86,7 @@ public abstract class SharedStorageSystem : EntitySystem _xformQuery = GetEntityQuery(); _prototype.PrototypesReloaded += OnPrototypesReloaded; + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnStorageGetState); SubscribeLocalEvent(OnStorageHandleState); SubscribeLocalEvent(OnComponentInit, before: new[] { typeof(SharedContainerSystem) }); @@ -118,6 +121,12 @@ public abstract class SharedStorageSystem : EntitySystem UpdatePrototypeCache(); } + protected virtual void OnMapInit(Entity entity, ref MapInitEvent args) + { + if (TryComp(entity, out var useDelayComp)) + UseDelay.SetLength((entity, useDelayComp), entity.Comp.QuickInsertCooldown, QuickInsertUseDelayID); + } + private void OnStorageGetState(EntityUid uid, StorageComponent component, ref ComponentGetState args) { var storedItems = new Dictionary(); @@ -275,7 +284,7 @@ public abstract class SharedStorageSystem : EntitySystem /// private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInteractEvent args) { - if (args.Handled || !args.CanReach || !UseDelay.TryResetDelay(uid, checkDelayed: true)) + if (args.Handled || !args.CanReach || !UseDelay.TryResetDelay(uid, checkDelayed: true, id: QuickInsertUseDelayID)) return; // Pick up all entities in a radius around the clicked location. diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index 16987f1de0..43a93e4b0f 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -57,6 +57,19 @@ namespace Content.Shared.Storage [DataField] public bool QuickInsert; // Can insert storables by clicking them with the storage entity + /// + /// Minimum delay between quick/area insert actions. + /// + /// Used to prevent autoclickers spamming server with individual pickup actions. + public TimeSpan QuickInsertCooldown = TimeSpan.FromSeconds(0.5); + + /// + /// Minimum delay between UI open actions. + /// Used to spamming opening sounds. + /// + [DataField] + public TimeSpan OpenUiCooldown = TimeSpan.Zero; + [DataField] public bool ClickInsert = true; // Can insert stuff by clicking the storage entity with it diff --git a/Content.Shared/Timing/UseDelayComponent.cs b/Content.Shared/Timing/UseDelayComponent.cs index 1560d4dd0b..c7b21bd1fe 100644 --- a/Content.Shared/Timing/UseDelayComponent.cs +++ b/Content.Shared/Timing/UseDelayComponent.cs @@ -1,38 +1,47 @@ using Robust.Shared.GameStates; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization; namespace Content.Shared.Timing; /// -/// Timer that creates a cooldown each time an object is activated/used +/// Timer that creates a cooldown each time an object is activated/used. +/// Can support additional, separate cooldown timers on the object by passing a unique ID with the system methods. /// -/// -/// Currently it only supports a single delay per entity, this means that for things that have two delay interactions they will share one timer, so this can cause issues. For example, the bible has a delay when opening the storage UI and when applying it's interaction effect, and they share the same delay. -/// [RegisterComponent] -[NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +[NetworkedComponent, AutoGenerateComponentState] [Access(typeof(UseDelaySystem))] public sealed partial class UseDelayComponent : Component { - /// - /// When the delay starts. - /// - [ViewVariables(VVAccess.ReadWrite), DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [AutoPausedField] - public TimeSpan DelayStartTime; + [DataField, AutoNetworkedField] + public Dictionary Delays = []; /// - /// When the delay ends. - /// - [ViewVariables(VVAccess.ReadWrite), DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [AutoPausedField] - public TimeSpan DelayEndTime; - - /// - /// Default delay time + /// Default delay time. /// + /// + /// This is only used at MapInit and should not be expected + /// to reflect the length of the default delay after that. + /// Use instead. + /// [DataField] - [ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] public TimeSpan Delay = TimeSpan.FromSeconds(1); } + +[Serializable, NetSerializable] +[DataDefinition] +public sealed partial class UseDelayInfo +{ + [DataField] + public TimeSpan Length { get; set; } + [DataField] + public TimeSpan StartTime { get; set; } + [DataField] + public TimeSpan EndTime { get; set; } + + public UseDelayInfo(TimeSpan length, TimeSpan startTime = default, TimeSpan endTime = default) + { + Length = length; + StartTime = startTime; + EndTime = endTime; + } +} diff --git a/Content.Shared/Timing/UseDelaySystem.cs b/Content.Shared/Timing/UseDelaySystem.cs index 388f31079c..3d2498203c 100644 --- a/Content.Shared/Timing/UseDelaySystem.cs +++ b/Content.Shared/Timing/UseDelaySystem.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Robust.Shared.Timing; namespace Content.Shared.Timing; @@ -7,53 +8,142 @@ public sealed class UseDelaySystem : EntitySystem [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; - public void SetDelay(Entity ent, TimeSpan delay) - { - if (ent.Comp.Delay == delay) - return; + private const string DefaultId = "default"; - ent.Comp.Delay = delay; - Dirty(ent); + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + // Set default delay length from the prototype + // This makes it easier for simple use cases that only need a single delay + SetLength(ent, ent.Comp.Delay, DefaultId); + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + // We have to do this manually, since it's not just a single field. + foreach (var entry in ent.Comp.Delays.Values) + { + entry.EndTime += args.PausedTime; + } } /// - /// Returns true if the entity has a currently active UseDelay. + /// Sets the length of the delay with the specified ID. /// - public bool IsDelayed(Entity ent) + public bool SetLength(Entity ent, TimeSpan length, string id = DefaultId) { - return ent.Comp.DelayEndTime >= _gameTiming.CurTime; - } + if (ent.Comp.Delays.TryGetValue(id, out var entry)) + { + if (entry.Length == length) + return true; - /// - /// Cancels the current delay. - /// - public void CancelDelay(Entity ent) - { - ent.Comp.DelayEndTime = _gameTiming.CurTime; - Dirty(ent); - } + entry.Length = length; + } + else + { + ent.Comp.Delays.Add(id, new UseDelayInfo(length)); + } - /// - /// Resets the UseDelay entirely for this entity if possible. - /// - /// Check if the entity has an ongoing delay, return false if it does, return true if it does not. - public bool TryResetDelay(Entity ent, bool checkDelayed = false) - { - if (checkDelayed && IsDelayed(ent)) - return false; - - var curTime = _gameTiming.CurTime; - ent.Comp.DelayStartTime = curTime; - ent.Comp.DelayEndTime = curTime - _metadata.GetPauseTime(ent) + ent.Comp.Delay; Dirty(ent); return true; } - public bool TryResetDelay(EntityUid uid, bool checkDelayed = false, UseDelayComponent? component = null) + /// + /// Returns true if the entity has a currently active UseDelay with the specified ID. + /// + public bool IsDelayed(Entity ent, string id = DefaultId) + { + if (!ent.Comp.Delays.TryGetValue(id, out var entry)) + return false; + + return entry.EndTime >= _gameTiming.CurTime; + } + + /// + /// Cancels the delay with the specified ID. + /// + public void CancelDelay(Entity ent, string id = DefaultId) + { + if (!ent.Comp.Delays.TryGetValue(id, out var entry)) + return; + + entry.EndTime = _gameTiming.CurTime; + Dirty(ent); + } + + /// + /// Tries to get info about the delay with the specified ID. See . + /// + /// + /// + /// + /// + public bool TryGetDelayInfo(Entity ent, [NotNullWhen(true)] out UseDelayInfo? info, string id = DefaultId) + { + return ent.Comp.Delays.TryGetValue(id, out info); + } + + /// + /// Returns info for the delay that will end farthest in the future. + /// + public UseDelayInfo GetLastEndingDelay(Entity ent) + { + var last = ent.Comp.Delays[DefaultId]; + foreach (var entry in ent.Comp.Delays) + { + if (entry.Value.EndTime > last.EndTime) + last = entry.Value; + } + return last; + } + + /// + /// Resets the delay with the specified ID for this entity if possible. + /// + /// Check if the entity has an ongoing delay with the specified ID. + /// If it does, return false and don't reset it. + /// Otherwise reset it and return true. + public bool TryResetDelay(Entity ent, bool checkDelayed = false, string id = DefaultId) + { + if (checkDelayed && IsDelayed(ent, id)) + return false; + + if (!ent.Comp.Delays.TryGetValue(id, out var entry)) + return false; + + var curTime = _gameTiming.CurTime; + entry.StartTime = curTime; + entry.EndTime = curTime - _metadata.GetPauseTime(ent) + entry.Length; + Dirty(ent); + return true; + } + + public bool TryResetDelay(EntityUid uid, bool checkDelayed = false, UseDelayComponent? component = null, string id = DefaultId) { if (!Resolve(uid, ref component, false)) return false; - return TryResetDelay((uid, component), checkDelayed); + return TryResetDelay((uid, component), checkDelayed, id); + } + + /// + /// Resets all delays on the entity. + /// + public void ResetAllDelays(Entity ent) + { + var curTime = _gameTiming.CurTime; + foreach (var entry in ent.Comp.Delays.Values) + { + entry.StartTime = curTime; + entry.EndTime = curTime - _metadata.GetPauseTime(ent) + entry.Length; + } + Dirty(ent); } } From de965416bd90479dca330d8471555104d59418dd Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 02:26:58 +0000 Subject: [PATCH 06/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2b5b326b23..1d4a8b118d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Remote signallers are now limited to a 15-tile radius - type: Tweak - - message: Added an advanced remote signaler, with a range of 30 tiles. - type: Add - - message: the anomaly synchronizer consumes much less power, and no longer causes - the anomaly pulses when powering down. - type: Tweak - id: 5937 - time: '2024-02-13T22:19:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24461 - author: joshepvodka changes: - message: Fax machines can now print text files from your computer. @@ -3851,3 +3839,12 @@ id: 6436 time: '2024-04-26T00:25:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27319 +- author: Tayrtahn + changes: + - message: Fixed Bibles not healing. + type: Fix + - message: Fixed quick insert and area insert not working on ore/plant/trash bags. + type: Fix + id: 6437 + time: '2024-04-26T02:25:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27234 From 735eeefa03c85924b01b3210ad462acbc1a71c87 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 26 Apr 2024 00:22:49 -0400 Subject: [PATCH 07/66] Migrate out rubber bullets/mags (#27329) --- .../Catalog/Fills/Boxes/ammunition.yml | 78 ------------------- .../VendingMachines/Inventories/ammo.yml | 15 ++-- .../Guns/Ammunition/Boxes/caseless_rifle.yml | 36 --------- .../Guns/Ammunition/Boxes/light_rifle.yml | 17 +--- .../Weapons/Guns/Ammunition/Boxes/magnum.yml | 15 ---- .../Weapons/Guns/Ammunition/Boxes/pistol.yml | 15 ---- .../Weapons/Guns/Ammunition/Boxes/rifle.yml | 36 --------- .../Ammunition/Cartridges/caseless_rifle.yml | 15 ---- .../Ammunition/Cartridges/light_rifle.yml | 15 ---- .../Guns/Ammunition/Cartridges/magnum.yml | 15 ---- .../Guns/Ammunition/Cartridges/pistol.yml | 15 ---- .../Guns/Ammunition/Cartridges/rifle.yml | 16 ---- .../Ammunition/Magazines/caseless_rifle.yml | 49 ------------ .../Guns/Ammunition/Magazines/light_rifle.yml | 14 ---- .../Guns/Ammunition/Magazines/magnum.yml | 28 ------- .../Guns/Ammunition/Magazines/pistol.yml | 28 ------- .../Guns/Ammunition/Magazines/rifle.yml | 14 ---- .../Ammunition/Projectiles/caseless_rifle.yml | 11 --- .../Ammunition/Projectiles/light_rifle.yml | 11 --- .../Guns/Ammunition/Projectiles/magnum.yml | 15 +--- .../Guns/Ammunition/Projectiles/pistol.yml | 11 --- .../Guns/Ammunition/Projectiles/rifle.yml | 15 +--- .../Guns/Ammunition/SpeedLoaders/magnum.yml | 20 ----- .../Guns/Ammunition/SpeedLoaders/pistol.yml | 19 ----- .../Objects/Weapons/Guns/Pistols/pistols.yml | 51 +----------- .../Weapons/Guns/Projectiles/projectiles.yml | 19 ----- .../Objects/Weapons/Guns/Rifles/rifles.yml | 25 ------ .../Objects/Weapons/Guns/SMGs/smgs.yml | 56 +------------ .../Roles/Jobs/Fun/emergencyresponseteam.yml | 8 +- Resources/migration.yml | 44 +++++++++++ 30 files changed, 60 insertions(+), 666 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml b/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml index ba8fd6fb25..a9fffddd2a 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml @@ -33,17 +33,6 @@ - id: MagazinePistolCaselessRiflePractice amount: 4 -- type: entity - name: box of .25 caseless (rubber) magazines - parent: BoxMagazine - id: BoxMagazineCaselessRifleRubber - description: A box full of - components: - - type: StorageFill - contents: - - id: MagazineCaselessRifleRubber - amount: 4 - # LightRifle - type: entity name: box of .30 rifle magazines @@ -67,17 +56,6 @@ - id: MagazineLightRiflePractice amount: 4 -- type: entity - name: box of .30 rifle (rubber) magazines - parent: BoxMagazine - id: BoxMagazineLightRifleRubber - description: A box full of .30 rifle (practice) magazines. - components: - - type: StorageFill - contents: - - id: MagazineLightRifleRubber - amount: 4 - - type: entity name: box of Vector magazines parent: BoxMagazine @@ -100,17 +78,6 @@ - id: MagazineMagnumSubMachineGunPractice amount: 3 -- type: entity - name: box of Vector (rubber) magazines - parent: BoxMagazine - id: BoxMagazineMagnumSubMachineGunRubber - description: A box full of Vector (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazineMagnumSubMachineGunRubber - amount: 3 - # Pistol - type: entity name: box of WT550 .35 auto magazines @@ -145,17 +112,6 @@ - id: MagazinePistolPractice amount: 4 -- type: entity - name: box of pistol .35 auto (rubber) magazines - parent: BoxMagazine - id: BoxMagazinePistolRubber - description: A box full of pistol .35 auto (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazinePistolRubber - amount: 4 - - type: entity name: box of machine pistol .35 auto magazines parent: BoxMagazine @@ -178,18 +134,6 @@ - id: MagazinePistolHighCapacityPractice amount: 4 -- type: entity - name: box of machine pistol .35 auto (rubber) magazines - parent: BoxMagazine - id: BoxMagazinePistolHighCapacityRubber - description: A box full of machine pistol .35 auto (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazinePistolHighCapacityRubber - amount: 4 - - - type: entity name: box of SMG .35 auto magazines parent: BoxMagazine @@ -212,17 +156,6 @@ - id: MagazinePistolSubMachineGunPractice amount: 3 -- type: entity - name: box of SMG .35 auto (rubber) magazines - parent: BoxMagazine - id: BoxMagazinePistolSubMachineGunRubber - description: A box full of SMG .35 auto (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazinePistolSubMachineGunRubber - amount: 3 - # Shotgun - type: entity name: box of (.50 pellet) ammo drums @@ -290,14 +223,3 @@ contents: - id: MagazineRiflePractice amount: 4 - -- type: entity - name: box of .20 rifle (rubber) magazines - parent: BoxMagazine - id: BoxMagazineRifleRubber - description: A box full of .20 rifle (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazineRifleRubber - amount: 4 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml index 3c539243c9..f767e95e11 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml @@ -1,22 +1,17 @@ - type: vendingMachineInventory id: AmmoVendInventory startingInventory: - MagazineBoxCaselessRifle: 3 + MagazineBoxCaselessRifle: 6 MagazineBoxCaselessRiflePractice: 3 - MagazineBoxCaselessRifleRubber: 3 - MagazineBoxLightRifleBig: 3 + MagazineBoxLightRifleBig: 6 MagazineBoxLightRiflePractice: 3 - MagazineBoxLightRifleRubber: 3 - MagazineBoxMagnum: 3 + MagazineBoxMagnum: 6 MagazineBoxMagnumPractice: 3 - MagazineBoxMagnumRubber: 3 - MagazineBoxPistol: 3 + MagazineBoxPistol: 6 MagazineBoxPistolPractice: 3 - MagazineBoxPistolRubber: 3 - MagazineBoxRifle: 3 + MagazineBoxRifle: 6 MagazineBoxRiflePractice: 3 - MagazineBoxRifleRubber: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml index 063268d8b5..98ad35b70d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml @@ -65,27 +65,6 @@ zeroVisible: false - type: Appearance -- type: entity - parent: BaseMagazineBoxCaselessRifle - id: MagazineBoxCaselessRifleBigRubber - name: ammunition box (.25 caseless rubber) - components: - - type: BallisticAmmoProvider - capacity: 200 - proto: CartridgeCaselessRifleRubber - - type: Sprite - layers: - - state: base-b - map: ["enum.GunVisualLayers.Base"] - - state: magb-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber-b - - type: MagazineVisuals - magState: magb - steps: 2 - zeroVisible: false - - type: Appearance - - type: entity parent: BaseMagazineBoxCaselessRifle id: MagazineBoxCaselessRifle @@ -114,18 +93,3 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - state: practice - -- type: entity - parent: BaseMagazineBoxCaselessRifle - id: MagazineBoxCaselessRifleRubber - name: ammunition box (.25 caseless rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml index 0670e37636..5b2ec79491 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml @@ -74,21 +74,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxLightRifle - id: MagazineBoxLightRifleRubber - name: ammunition box (.30 rifle rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeLightRifleRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxLightRifleIncendiary parent: BaseMagazineBoxLightRifle @@ -117,4 +102,4 @@ map: ["enum.GunVisualLayers.Base"] - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - - state: uranium \ No newline at end of file + - state: uranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml index 65f6bff00e..f5b2955e08 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml @@ -53,21 +53,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxMagnum - id: MagazineBoxMagnumRubber - name: ammunition box (.45 magnum rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxMagnumIncendiary parent: BaseMagazineBoxMagnum diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml index 9f6a8e8257..fbd2044690 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml @@ -54,21 +54,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxPistol - id: MagazineBoxPistolRubber - name: ammunition box (.35 auto rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxPistolIncendiary parent: BaseMagazineBoxPistol diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml index c321b77d10..54d5327dda 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml @@ -44,27 +44,6 @@ zeroVisible: false - type: Appearance -- type: entity - parent: BaseMagazineBoxRifle - id: MagazineBoxRifleBigRubber - name: ammunition box (.20 rifle rubber) - components: - - type: BallisticAmmoProvider - capacity: 200 - proto: CartridgeRiflePractice - - type: Sprite - layers: - - state: base-b - map: ["enum.GunVisualLayers.Base"] - - state: magb-1 - map: ["enum.GunVisualLayers.Mag"] - - state: practice-b - - type: MagazineVisuals - magState: magb - steps: 2 - zeroVisible: false - - type: Appearance - - type: entity parent: BaseMagazineBoxRifle id: MagazineBoxRifle @@ -94,21 +73,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxRifle - id: MagazineBoxRifleRubber - name: ammunition box (.20 rifle rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeRifleRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxRifleIncendiary parent: BaseMagazineBoxRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml index 8d7b94a50a..9e46725b94 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml @@ -43,18 +43,3 @@ - state: tip map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" - -- type: entity - id: CartridgeCaselessRifleRubber - name: cartridge (.25 caseless rubber) - parent: BaseCartridgeCaselessRifle - components: - - type: CartridgeAmmo - proto: BulletCaselessRifleRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml index cda812ed03..80623f874e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml @@ -41,21 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" -- type: entity - id: CartridgeLightRifleRubber - name: cartridge (.30 rifle rubber) - parent: BaseCartridgeLightRifle - components: - - type: CartridgeAmmo - proto: BulletLightRifleRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgeLightRifleIncendiary name: cartridge (.30 rifle incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml index c5c5ad1f8d..b6cb65db05 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml @@ -41,21 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" -- type: entity - id: CartridgeMagnumRubber - name: cartridge (.45 magnum rubber) - parent: BaseCartridgeMagnum - components: - - type: CartridgeAmmo - proto: BulletMagnumRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgeMagnumIncendiary name: cartridge (.45 magnum incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml index 69aa8664aa..c097d7746e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml @@ -41,21 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" -- type: entity - id: CartridgePistolRubber - name: cartridge (.35 auto rubber) - parent: BaseCartridgePistol - components: - - type: CartridgeAmmo - proto: BulletPistolRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgePistolIncendiary name: cartridge (.35 auto incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml index c47688ab01..21e6daa2b8 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml @@ -41,22 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" - -- type: entity - id: CartridgeRifleRubber - name: cartridge (.20 rifle rubber) - parent: BaseCartridgeRifle - components: - - type: CartridgeAmmo - proto: BulletRifleRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgeRifleIncendiary name: cartridge (.20 rifle incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml index 0d16f1e966..2c23d803e2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml @@ -132,26 +132,6 @@ zeroVisible: false - type: Appearance -- type: entity - id: MagazinePistolCaselessRifleRubber - name: "pistol magazine (.25 caseless rubber)" - parent: BaseMagazinePistolCaselessRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - capacity: 10 - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: MagazineVisuals - magState: mag - steps: 6 - zeroVisible: false - - type: Appearance - - type: entity id: MagazineCaselessRifle name: "magazine (.25 caseless)" @@ -180,20 +160,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineCaselessRifleRubber - name: "magazine (.25 caseless rubber)" - parent: BaseMagazineCaselessRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineCaselessRifleShort name: "short magazine (.25 caseless)" @@ -223,18 +189,3 @@ map: ["enum.GunVisualLayers.Base"] - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - -- type: entity - id: MagazineCaselessRifleShortRubber - name: "short magazine (.25 caseless rubber)" - parent: BaseMagazineCaselessRifleShort - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - capacity: 20 - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml index d420a5c3d8..ebb98b879c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml @@ -82,20 +82,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineLightRifleRubber - name: "magazine (.30 rifle rubber)" - parent: BaseMagazineLightRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeLightRifleRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineLightRifleUranium name: "magazine (.30 rifle uranium)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml index 6a1cc041de..1d8437a884 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml @@ -75,20 +75,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineMagnumRubber - name: pistol magazine (.45 magnum rubber) - parent: BaseMagazineMagnum - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineMagnumUranium name: pistol magazine (.45 magnum uranium) @@ -145,20 +131,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineMagnumSubMachineGunRubber - name: "Vector magazine (.45 magnum rubber)" - parent: BaseMagazineMagnumSubMachineGun - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineMagnumSubMachineGunUranium name: "Vector magazine (.45 magnum uranium)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml index 679acd299c..3526281907 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml @@ -156,20 +156,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazinePistolRubber - name: pistol magazine (.35 auto rubber) - parent: BaseMagazinePistol - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazinePistolHighCapacity name: machine pistol magazine (.35 auto) @@ -246,20 +232,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazinePistolSubMachineGunRubber - name: SMG magazine (.35 auto rubber) - parent: BaseMagazinePistolSubMachineGun - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazinePistolSubMachineGunUranium name: SMG magazine (.35 auto rubber) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml index 5ba57dce4e..d060af2c21 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml @@ -61,20 +61,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineRifleRubber - name: "magazine (.20 rifle rubber)" - parent: BaseMagazineRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeRifleRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineRifleUranium name: "magazine (.20 rifle uranium)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml index 5ce0bf82fe..741f0a4e1a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml @@ -19,14 +19,3 @@ damage: types: Blunt: 2 - -- type: entity - id: BulletCaselessRifleRubber - name: bullet (.25 caseless rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml index 3a0df2ac6c..c6a4808b77 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml @@ -20,17 +20,6 @@ types: Blunt: 2 -- type: entity - id: BulletLightRifleRubber - name: bullet (.20 rifle rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: entity id: BulletLightRifleIncendiary parent: BaseBulletIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml index 1b5cf7890b..798de9fa85 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml @@ -20,19 +20,6 @@ types: Blunt: 1 -- type: entity - id: BulletMagnumRubber - name: bullet (.45 magnum rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: StaminaDamageOnCollide - damage: 35 # 3 hits to stun cuz revolver - - type: entity id: BulletMagnumIncendiary parent: BaseBulletIncendiary @@ -44,7 +31,7 @@ types: Blunt: 3 Heat: 32 - + - type: entity id: BulletMagnumAP name: bullet (.45 magnum armor-piercing) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml index 086a8dc914..3cfcc0cf20 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml @@ -20,17 +20,6 @@ types: Blunt: 2 -- type: entity - id: BulletPistolRubber - name: bullet (.35 auto rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: entity id: BulletPistolIncendiary parent: BaseBulletIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml index 2113916cf5..6f6fa0f907 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml @@ -20,17 +20,6 @@ types: Blunt: 2 -- type: entity - id: BulletRifleRubber - name: bullet (0.20 rifle rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: entity id: BulletRifleIncendiary parent: BaseBulletIncendiary @@ -42,7 +31,7 @@ types: Blunt: 2 Heat: 15 - + - type: entity id: BulletRifleUranium parent: BaseBulletUranium @@ -54,4 +43,4 @@ types: Radiation: 7 Piercing: 8 - + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml index b06ca64d8f..fda8046cc6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml @@ -59,26 +59,6 @@ zeroVisible: false - type: Appearance -- type: entity - id: SpeedLoaderMagnumRubber - name: "speed loader (.45 magnum rubber)" - parent: BaseSpeedLoaderMagnum - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - sprite: Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi - layers: - - state: base - map: [ "enum.GunVisualLayers.Base" ] - - state: rubber-6 - map: [ "enum.GunVisualLayers.Mag" ] - - type: MagazineVisuals - magState: rubber - steps: 7 - zeroVisible: false - - type: Appearance - - type: entity id: SpeedLoaderMagnumAP name: "speed loader (.45 magnum armor-piercing)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml index 1fef25f16f..3ce419b2c3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml @@ -57,22 +57,3 @@ steps: 7 zeroVisible: false - type: Appearance - -- type: entity - id: SpeedLoaderPistolRubber - name: "speed loader (.35 auto rubber)" - parent: BaseSpeedLoaderPistol - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: rubber-6 - map: ["enum.GunVisualLayers.Mag"] - - type: MagazineVisuals - magState: rubber - steps: 7 - zeroVisible: false - - type: Appearance diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 9507eada3b..f3a8215e3d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -171,35 +171,11 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg -- type: entity - id: WeaponPistolMk58Nonlethal - parent: WeaponPistolMk58 - suffix: Non-lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazinePistolRubber - insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg - priority: 2 - whitelist: - tags: - - MagazinePistol - gun_chamber: - name: Chamber - startingItem: CartridgePistolRubber - priority: 1 - whitelist: - tags: - - CartridgePistol - - type: entity name: N1984 parent: BaseWeaponPistol id: WeaponPistolN1984 # the spaces in description are for formatting. - description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. + description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi @@ -238,28 +214,3 @@ whitelist: tags: - CartridgeMagnum - -- type: entity - name: N1984 - parent: WeaponPistolN1984 - id: WeaponPistolN1984Nonlethal - suffix: Non-lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazineMagnumRubber - insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg - priority: 2 - whitelist: - tags: - - MagazineMagnum - gun_chamber: - name: Chamber - startingItem: CartridgeMagnumRubber - priority: 1 - whitelist: - tags: - - CartridgeMagnum diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 91fdaa6481..825d3cc4a7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -104,25 +104,6 @@ types: Blunt: 1 -- type: entity - id: BaseBulletRubber - name: base bullet rubber - parent: BaseBullet - noSpawn: true - components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - layers: - - state: rubber - - type: Projectile - damage: - types: - Blunt: 3 - soundHit: - path: /Audio/Weapons/Guns/Hits/snap.ogg - - type: StaminaDamageOnCollide - damage: 22 # 5 hits to stun sounds reasonable - - type: entity id: BaseBulletIncendiary name: base bullet incendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index 5bc8125eba..bc3b65ff3a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -186,28 +186,3 @@ steps: 1 zeroVisible: true - type: Appearance - -- type: entity - name: Lecter - parent: WeaponRifleLecter - id: WeaponRifleLecterRubber - suffix: Non-lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazineRifleRubber - insertSound: /Audio/Weapons/Guns/MagIn/ltrifle_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/ltrifle_magout.ogg - priority: 2 - whitelist: - tags: - - MagazineRifle - gun_chamber: - name: Chamber - startingItem: CartridgeRifleRubber - priority: 1 - whitelist: - tags: - - CartridgeRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 7398374e86..2d6e768c41 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -20,7 +20,7 @@ maxAngle: 16 fireRate: 8 angleIncrease: 3 - angleDecay: 16 + angleDecay: 16 selectedMode: FullAuto availableModes: - SemiAuto @@ -230,7 +230,7 @@ minAngle: 1 maxAngle: 6 angleIncrease: 1.5 - angleDecay: 6 + angleDecay: 6 selectedMode: FullAuto shotsPerBurst: 5 availableModes: @@ -260,55 +260,3 @@ steps: 6 zeroVisible: true - type: Appearance - -# Rubber -- type: entity - name: Drozd - parent: WeaponSubMachineGunDrozd - id: WeaponSubMachineGunDrozdRubber - suffix: Non-Lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazinePistolSubMachineGunRubber - insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg - priority: 2 - whitelist: - tags: - - MagazinePistolSubMachineGun - gun_chamber: - name: Chamber - startingItem: CartridgePistolRubber - priority: 1 - whitelist: - tags: - - CartridgePistol - -- type: entity - name: Vector - parent: WeaponSubMachineGunVector - id: WeaponSubMachineGunVectorRubber - description: An excellent fully automatic Heavy SMG. Uses .45 magnum ammo. - suffix: Non-Lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazineMagnumSubMachineGunRubber - insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg - priority: 2 - whitelist: - tags: - - MagazineMagnumSubMachineGun - gun_chamber: - name: Chamber - startingItem: CartridgeMagnumRubber - priority: 1 - whitelist: - tags: - - CartridgeMagnum diff --git a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml index 22d0a4d77f..f37085e005 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml @@ -27,7 +27,7 @@ id: ERTLeaderPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolN1984Nonlethal + pocket1: WeaponPistolN1984 pocket2: FlashlightSeclite - type: startingGear @@ -44,7 +44,7 @@ id: ERTLeaderPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolN1984Nonlethal + pocket1: WeaponPistolN1984 pocket2: FlashlightSeclite - type: startingGear @@ -199,7 +199,7 @@ id: ERTSecurityPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolMk58Nonlethal + pocket1: WeaponPistolMk58 pocket2: FlashlightSeclite - type: startingGear @@ -216,7 +216,7 @@ id: ERTSecurityPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolMk58Nonlethal + pocket1: WeaponPistolMk58 pocket2: FlashlightSeclite - type: startingGear diff --git a/Resources/migration.yml b/Resources/migration.yml index 934c3a10f0..04e4f4b080 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -283,3 +283,47 @@ BriefcaseSyndieBase: null # 2024-04-08 BodyBag_Container: BodyBag BodyBag_Folded: BodyBagFolded + +# 2024-04-26 +BaseBulletRubber: null +BulletPistolRubber: BulletPistol +BulletMagnumRubber: BulletMagnum +BulletLightRifleRubber: BulletLightRifle +BulletRifleRubber: BulletRifle +BulletCaselessRifleRubber: BulletCaselessRifle +CartridgePistolRubber: CartridgePistol +CartridgeMagnumRubber: CartridgeMagnum +CartridgeLightRifleRubber: CartridgeLightRifle +CartridgeRifleRubber: CartridgeRifle +CartridgeCaselessRifleRubber: CartridgeCaselessRifle +MagazinePistolRubber: MagazinePistol +MagazinePistolSubMachineGunRubber: MagazinePistolSubMachineGun +MagazinePistolCaselessRifleRubber: MagazinePistolCaselessRifle +MagazineMagnumRubber: MagazineMagnum +MagazineMagnumSubMachineGunRubber: MagazineMagnumSubMachineGun +MagazineLightRifleRubber: MagazineLightRifle +MagazineRifleRubber: MagazineRifle +MagazineCaselessRifleRubber: MagazineCaselessRifle +MagazineCaselessRifleShortRubber: MagazineCaselessRifleShort +SpeedLoaderPistolRubber: SpeedLoaderPistol +SpeedLoaderMagnumRubber: SpeedLoaderMagnum +MagazineBoxPistolRubber: MagazineBoxPistol +# RIP box of magnum rubbers 202X to 2024 +MagazineBoxMagnumRubber: MagazineBoxMagnum +MagazineBoxLightRifleRubber: MagazineBoxLightRifle +MagazineBoxRifleRubber: MagazineBoxRifle +MagazineBoxRifleBigRubber: MagazineBoxRifleBig +MagazineBoxCaselessRifleRubber: MagazineBoxCaselessRifle +MagazineBoxCaselessRifleBigRubber: MagazineBoxCaselessRifle10x24 +BoxMagazinePistolRubber: BoxMagazinePistol +BoxMagazinePistolHighCapacityRubber: BoxMagazinePistolHighCapacity +BoxMagazinePistolSubMachineGunRubber: BoxMagazinePistolSubMachineGun +BoxMagazineLightRifleRubber: BoxMagazineLightRifle +BoxMagazineRifleRubber: BoxMagazineRifle +BoxMagazineCaselessRifleRubber: BoxMagazinePistolCaselessRifle +BoxMagazineMagnumSubMachineGunRubber: BoxMagazineMagnumSubMachineGun +WeaponPistolMk58Nonlethal: WeaponPistolMk58 +WeaponPistolN1984Nonlethal: WeaponPistolN1984 +WeaponSubMachineGunVectorRubber: WeaponSubMachineGunVector +WeaponSubMachineGunDrozdRubber: WeaponSubMachineGunDrozd +WeaponRifleLecterRubber: WeaponRifleLecter From 0ae942101a9f79ff49c3ffb3bfe257daa76719ff Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 26 Apr 2024 19:30:03 +1200 Subject: [PATCH 08/66] Fix client-side replay error (#27332) --- .../Replay/Spectator/ReplaySpectatorSystem.Position.cs | 7 +++++++ .../UserInterface/Systems/Alerts/Controls/AlertControl.cs | 3 +-- .../UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs index 2ee7e30ec9..24f0e8a1d3 100644 --- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs +++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs @@ -198,6 +198,13 @@ public sealed partial class ReplaySpectatorSystem if (args.Transform.MapUid != null || args.OldMapId == MapId.Nullspace) return; + if (_spectatorData != null) + { + // Currently scrubbing/setting the replay tick + // the observer will get respawned once the state was applied + return; + } + // The entity being spectated from was moved to null-space. // This was probably because they were spectating some entity in a client-side replay that left PVS range. // Simple respawn the ghost. diff --git a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs index 9423f7288d..af93033a9d 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs @@ -117,8 +117,7 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls protected override void Dispose(bool disposing) { base.Dispose(disposing); - - _entityManager.DeleteEntity(_spriteViewEntity); + _entityManager.QueueDeleteEntity(_spriteViewEntity); } } diff --git a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs index 189de50407..a1a494c47b 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs @@ -97,7 +97,8 @@ public sealed partial class AlertsUI : UIWidget } else { - if (existingAlertControl != null) AlertContainer.Children.Remove(existingAlertControl); + if (existingAlertControl != null) + AlertContainer.Children.Remove(existingAlertControl); // this is a new alert + alert key or just a different alert with the same // key, create the control and add it in the appropriate order From 9378688ffc15fc5ffbbf6d1a4b9ce61a2a813c20 Mon Sep 17 00:00:00 2001 From: SkaldetSkaeg Date: Fri, 26 Apr 2024 14:34:20 +0700 Subject: [PATCH 09/66] No echo from handheld radio (#27046) I found the echo from my own radio very annoying. --- Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs | 3 +++ Content.Server/Radio/EntitySystems/RadioSystem.cs | 2 +- Content.Server/Radio/RadioEvent.cs | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index ace7d8ae31..d115ec991a 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -201,6 +201,9 @@ public sealed class RadioDeviceSystem : EntitySystem private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref RadioReceiveEvent args) { + if (uid == args.RadioSource) + return; + var nameEv = new TransformSpeakerNameEvent(args.MessageSource, Name(args.MessageSource)); RaiseLocalEvent(args.MessageSource, nameEv); diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 5d3074b06b..4341746aaf 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -112,7 +112,7 @@ public sealed class RadioSystem : EntitySystem NetEntity.Invalid, null); var chatMsg = new MsgChatMessage { Message = chat }; - var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); + var ev = new RadioReceiveEvent(message, messageSource, channel, radioSource, chatMsg); var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource); RaiseLocalEvent(ref sendAttemptEv); diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs index 69d764ffe6..fafa66674e 100644 --- a/Content.Server/Radio/RadioEvent.cs +++ b/Content.Server/Radio/RadioEvent.cs @@ -4,7 +4,7 @@ using Content.Shared.Radio; namespace Content.Server.Radio; [ByRefEvent] -public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg); +public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, EntityUid RadioSource, MsgChatMessage ChatMsg); /// /// Use this event to cancel sending message per receiver From 1dca65defd9de497308fcd0a560ddb8d4a409328 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 07:35:26 +0000 Subject: [PATCH 10/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1d4a8b118d..f0d61202ba 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: joshepvodka - changes: - - message: Fax machines can now print text files from your computer. - type: Add - id: 5938 - time: '2024-02-14T01:14:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23262 - author: Plykiya changes: - message: Holosigns can now be placed at range. No more being eaten by forcefields! @@ -3848,3 +3841,10 @@ id: 6437 time: '2024-04-26T02:25:52.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27234 +- author: SkaldetSkaeg + changes: + - message: The handheld radio no longer plays a message spoken into it. + type: Tweak + id: 6438 + time: '2024-04-26T07:34:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27046 From 9b63bb672f8f8a8e46ce68d45ad2ed876025ddc1 Mon Sep 17 00:00:00 2001 From: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Date: Fri, 26 Apr 2024 02:44:40 -0500 Subject: [PATCH 11/66] Whitelisted Sec Webbing (#27303) * Whitelisted Sec / Merc Webbing * Update belts.yml * Misplaced Components fixed * Trying to fix mapped fills * Update belts.yml * Update belts.yml * Removed an Empty line * Update belts.yml --- Resources/Prototypes/Entities/Clothing/Belt/belts.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 1bae86a022..c72a3f3120 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -480,6 +480,8 @@ - SmokeOnTrigger - Flash - Handcuff + - BallisticAmmoProvider + - CartridgeAmmo - type: ItemMapper mapLayers: flashbang: @@ -599,7 +601,7 @@ - CartridgeAmmo - type: entity - parent: ClothingBeltStorageBase + parent: ClothingBeltSecurity id: ClothingBeltSecurityWebbing name: security webbing description: Unique and versatile chest rig, can hold security gear. @@ -608,11 +610,11 @@ sprite: Clothing/Belt/securitywebbing.rsi - type: Clothing sprite: Clothing/Belt/securitywebbing.rsi - + - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMercWebbing - name: mercenarie webbing + name: mercenary webbing description: Ideal for storing everything from ammo to weapons and combat essentials. components: - type: Sprite From d578d293df5b8b6d0981b965b9ae8c1fc83824db Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 07:45:46 +0000 Subject: [PATCH 12/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f0d61202ba..0b39ea2091 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: Holosigns can now be placed at range. No more being eaten by forcefields! - type: Tweak - id: 5939 - time: '2024-02-14T05:25:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25120 - author: Zadeon changes: - message: Disablers now fit inside the suit storage slot. @@ -3848,3 +3841,12 @@ id: 6438 time: '2024-04-26T07:34:20.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27046 +- author: FungiFellow + changes: + - message: Added SecBelt whitelist to Sec webbing + type: Tweak + - message: Added more Ammo holders to SecBelt whitelist + type: Tweak + id: 6439 + time: '2024-04-26T07:44:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27303 From 3847a298c13192ba97364b06b8b55b4fe60deaa7 Mon Sep 17 00:00:00 2001 From: IlyaElDunaev <154531074+IlyaElDunaev@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:47:01 +0300 Subject: [PATCH 13/66] Treatment of blood loss in the Rat King (#26887) Bloodloss-RatKing --- Resources/Prototypes/Reagents/botany.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Reagents/botany.yml b/Resources/Prototypes/Reagents/botany.yml index a03c3826a4..4cb7d0c184 100644 --- a/Resources/Prototypes/Reagents/botany.yml +++ b/Resources/Prototypes/Reagents/botany.yml @@ -247,6 +247,8 @@ groups: Brute: -5 Burn: -5 + types: + Bloodloss: -5 - type: reagent From abc46f171c7d4e4bf9356fac10802a3aa2372d9c Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 07:48:07 +0000 Subject: [PATCH 14/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0b39ea2091..52749f44a1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Zadeon - changes: - - message: Disablers now fit inside the suit storage slot. - type: Fix - id: 5940 - time: '2024-02-14T23:07:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25238 - author: Jezithyr changes: - message: Death Acidifier implants not deleting items when activated @@ -3850,3 +3843,10 @@ id: 6439 time: '2024-04-26T07:44:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27303 +- author: IlyaElDunaev + changes: + - message: Ammonia heal blood loss in the Rat King + type: Add + id: 6440 + time: '2024-04-26T07:47:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26887 From e26662b545b8af2540b65029ae5bc82202a13bf1 Mon Sep 17 00:00:00 2001 From: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Date: Fri, 26 Apr 2024 02:48:15 -0500 Subject: [PATCH 15/66] Quiver Crafting Recipe (#27198) * Update quiver.yml * Create quiver.yml * Update clothing.yml * Update pneumatic_cannon.yml * Update pneumatic_cannon.yml * Update pneumatic_cannon.yml * Update pneumatic_cannon.yml --- .../Entities/Clothing/Belt/quiver.yml | 4 ++++ .../Construction/Graphs/clothing/quiver.yml | 19 +++++++++++++++++++ .../Recipes/Construction/clothing.yml | 13 ++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml diff --git a/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml b/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml index 6cbf5a69ca..bb4e395c4f 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml @@ -18,7 +18,11 @@ whitelist: tags: - Arrow + - Plunger - type: Appearance - type: StorageContainerVisuals maxFillLevels: 3 fillBaseName: fill- + - type: Construction + graph: Quiver + node: Quiver diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml new file mode 100644 index 0000000000..10736a5876 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml @@ -0,0 +1,19 @@ +- type: constructionGraph + id: Quiver + start: start + graph: + - node: start + edges: + - to: Quiver + steps: + - material: Cable + amount: 2 + doAfter: 1 + - material: Cloth + amount: 5 + doAfter: 2 + - material: WoodPlank + amount: 1 + doAfter: 2 + - node: Quiver + entity: ClothingBeltQuiver diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index 8907a47c6b..420f38aab8 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -106,4 +106,15 @@ category: construction-category-clothing description: A pair of sunglasses, modified to have a built-in security HUD. icon: { sprite: Clothing/Eyes/Glasses/secglasses.rsi, state: icon } - objectType: Item \ No newline at end of file + objectType: Item + +- type: construction + name: quiver + id: ClothingBeltQuiver + graph: Quiver + startNode: start + targetNode: Quiver + category: construction-category-clothing + description: Can hold up to 15 arrows, and fits snug around your waist. + icon: { sprite: Clothing/Belt/quiver.rsi, state: icon } + objectType: Item From fe67634397ca346ab0eba320f321121a0e824e2b Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 07:49:21 +0000 Subject: [PATCH 16/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 52749f44a1..9296e17355 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Jezithyr - changes: - - message: Death Acidifier implants not deleting items when activated - type: Fix - id: 5941 - time: '2024-02-15T01:37:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25251 - author: PJB3005 changes: - message: Fixed disposals bins not automatically flushing after an item was inserted. @@ -3850,3 +3843,10 @@ id: 6440 time: '2024-04-26T07:47:02.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/26887 +- author: FungiFellow + changes: + - message: Added Quiver Recipe, go wild Robin Hood. + type: Add + id: 6441 + time: '2024-04-26T07:48:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27198 From d745a788ea33616f06f5301f780e5c7dba3ae6c6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 17:58:06 +1000 Subject: [PATCH 17/66] Fix UseDelay issues (#27336) * Fix UseDelay issues - Fix it not predicting properly by deep-copying the classes (realistically they should be structs). - Fix the `z` path not applying UseDelay similarly to the `e` path. * click --- .../Interaction/SharedInteractionSystem.cs | 4 +-- Content.Shared/Timing/UseDelayComponent.cs | 10 ++++++-- Content.Shared/Timing/UseDelaySystem.cs | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 8d49ce31f0..2eabe14d23 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -973,8 +973,8 @@ namespace Content.Shared.Interaction return false; DoContactInteraction(user, used, activateMsg); - if (delayComponent != null) - _useDelay.TryResetDelay((used, delayComponent)); + // Still need to call this even without checkUseDelay in case this gets relayed from Activate. + _useDelay.TryResetDelay(used, component: delayComponent); if (!activateMsg.WasLogged) _adminLogger.Add(LogType.InteractActivate, LogImpact.Low, $"{ToPrettyString(user):user} activated {ToPrettyString(used):used}"); return true; diff --git a/Content.Shared/Timing/UseDelayComponent.cs b/Content.Shared/Timing/UseDelayComponent.cs index c7b21bd1fe..aa6c66eb81 100644 --- a/Content.Shared/Timing/UseDelayComponent.cs +++ b/Content.Shared/Timing/UseDelayComponent.cs @@ -8,11 +8,11 @@ namespace Content.Shared.Timing; /// Can support additional, separate cooldown timers on the object by passing a unique ID with the system methods. /// [RegisterComponent] -[NetworkedComponent, AutoGenerateComponentState] +[NetworkedComponent] [Access(typeof(UseDelaySystem))] public sealed partial class UseDelayComponent : Component { - [DataField, AutoNetworkedField] + [DataField] public Dictionary Delays = []; /// @@ -27,6 +27,12 @@ public sealed partial class UseDelayComponent : Component public TimeSpan Delay = TimeSpan.FromSeconds(1); } +[Serializable, NetSerializable] +public sealed class UseDelayComponentState : IComponentState +{ + public Dictionary Delays = new(); +} + [Serializable, NetSerializable] [DataDefinition] public sealed partial class UseDelayInfo diff --git a/Content.Shared/Timing/UseDelaySystem.cs b/Content.Shared/Timing/UseDelaySystem.cs index 3d2498203c..bc2a709175 100644 --- a/Content.Shared/Timing/UseDelaySystem.cs +++ b/Content.Shared/Timing/UseDelaySystem.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Robust.Shared.GameStates; using Robust.Shared.Timing; namespace Content.Shared.Timing; @@ -16,6 +17,30 @@ public sealed class UseDelaySystem : EntitySystem SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnUnpaused); + SubscribeLocalEvent(OnDelayGetState); + SubscribeLocalEvent(OnDelayHandleState); + } + + private void OnDelayHandleState(Entity ent, ref ComponentHandleState args) + { + if (args.Current is not UseDelayComponentState state) + return; + + ent.Comp.Delays.Clear(); + + // At time of writing sourcegen networking doesn't deep copy so this will mispredict if you try. + foreach (var (key, delay) in state.Delays) + { + ent.Comp.Delays[key] = new UseDelayInfo(delay.Length, delay.StartTime, delay.EndTime); + } + } + + private void OnDelayGetState(Entity ent, ref ComponentGetState args) + { + args.State = new UseDelayComponentState() + { + Delays = ent.Comp.Delays + }; } private void OnMapInit(Entity ent, ref MapInitEvent args) From c122fdf183a8228ccba69cb747a86626ca9b5391 Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Fri, 26 Apr 2024 01:00:16 -0700 Subject: [PATCH 18/66] Move job info changing methods for id cards to shared (#27337) * Move job info changing methods for id cards to shared * Revert "Move job info changing methods for id cards to shared" This reverts commit 95cbc46b2d1934fa7bf5c72d7d3de9f9168992a1. * Reapply changes --- Content.Client/Access/IdCardSystem.cs | 4 +- Content.Server/Access/Systems/IdCardSystem.cs | 148 ---------------- .../Access/Systems/SharedIdCardSystem.cs | 158 ++++++++++++++++++ 3 files changed, 159 insertions(+), 151 deletions(-) diff --git a/Content.Client/Access/IdCardSystem.cs b/Content.Client/Access/IdCardSystem.cs index fcf2bf57de..e0c02976f7 100644 --- a/Content.Client/Access/IdCardSystem.cs +++ b/Content.Client/Access/IdCardSystem.cs @@ -2,6 +2,4 @@ namespace Content.Client.Access; -public sealed class IdCardSystem : SharedIdCardSystem -{ -} +public sealed class IdCardSystem : SharedIdCardSystem; diff --git a/Content.Server/Access/Systems/IdCardSystem.cs b/Content.Server/Access/Systems/IdCardSystem.cs index 6b3d8db595..9cd9976cea 100644 --- a/Content.Server/Access/Systems/IdCardSystem.cs +++ b/Content.Server/Access/Systems/IdCardSystem.cs @@ -7,8 +7,6 @@ using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Database; using Content.Shared.Popups; -using Content.Shared.Roles; -using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -20,20 +18,13 @@ public sealed class IdCardSystem : SharedIdCardSystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly MetaDataSystem _metaSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnMicrowaved); } - private void OnMapInit(EntityUid uid, IdCardComponent id, MapInitEvent args) - { - UpdateEntityName(uid, id); - } - private void OnMicrowaved(EntityUid uid, IdCardComponent component, BeingMicrowavedEvent args) { if (TryComp(uid, out var access)) @@ -81,143 +72,4 @@ public sealed class IdCardSystem : SharedIdCardSystem $"{ToPrettyString(args.Microwave)} added {random.ID} access to {ToPrettyString(uid):entity}"); } } - - /// - /// Attempts to change the job title of a card. - /// Returns true/false. - /// - /// - /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. - /// - public bool TryChangeJobTitle(EntityUid uid, string? jobTitle, IdCardComponent? id = null, EntityUid? player = null) - { - if (!Resolve(uid, ref id)) - return false; - - if (!string.IsNullOrWhiteSpace(jobTitle)) - { - jobTitle = jobTitle.Trim(); - - if (jobTitle.Length > IdCardConsoleComponent.MaxJobTitleLength) - jobTitle = jobTitle[..IdCardConsoleComponent.MaxJobTitleLength]; - } - else - { - jobTitle = null; - } - - if (id.JobTitle == jobTitle) - return true; - id.JobTitle = jobTitle; - Dirty(uid, id); - UpdateEntityName(uid, id); - - if (player != null) - { - _adminLogger.Add(LogType.Identity, LogImpact.Low, - $"{ToPrettyString(player.Value):player} has changed the job title of {ToPrettyString(uid):entity} to {jobTitle} "); - } - return true; - } - - public bool TryChangeJobIcon(EntityUid uid, StatusIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null) - { - if (!Resolve(uid, ref id)) - { - return false; - } - - if (id.JobIcon == jobIcon.ID) - { - return true; - } - - id.JobIcon = jobIcon.ID; - Dirty(uid, id); - - if (player != null) - { - _adminLogger.Add(LogType.Identity, LogImpact.Low, - $"{ToPrettyString(player.Value):player} has changed the job icon of {ToPrettyString(uid):entity} to {jobIcon} "); - } - - return true; - } - - public bool TryChangeJobDepartment(EntityUid uid, JobPrototype job, IdCardComponent? id = null) - { - if (!Resolve(uid, ref id)) - return false; - - id.JobDepartments.Clear(); - foreach (var department in _prototypeManager.EnumeratePrototypes()) - { - if (department.Roles.Contains(job.ID)) - id.JobDepartments.Add("department-" + department.ID); - } - - Dirty(uid, id); - - return true; - } - - /// - /// Attempts to change the full name of a card. - /// Returns true/false. - /// - /// - /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. - /// - public bool TryChangeFullName(EntityUid uid, string? fullName, IdCardComponent? id = null, EntityUid? player = null) - { - if (!Resolve(uid, ref id)) - return false; - - if (!string.IsNullOrWhiteSpace(fullName)) - { - fullName = fullName.Trim(); - if (fullName.Length > IdCardConsoleComponent.MaxFullNameLength) - fullName = fullName[..IdCardConsoleComponent.MaxFullNameLength]; - } - else - { - fullName = null; - } - - if (id.FullName == fullName) - return true; - id.FullName = fullName; - Dirty(uid, id); - UpdateEntityName(uid, id); - - if (player != null) - { - _adminLogger.Add(LogType.Identity, LogImpact.Low, - $"{ToPrettyString(player.Value):player} has changed the name of {ToPrettyString(uid):entity} to {fullName} "); - } - return true; - } - - /// - /// Changes the name of the id's owner. - /// - /// - /// If either or is empty, it's replaced by placeholders. - /// If both are empty, the original entity's name is restored. - /// - private void UpdateEntityName(EntityUid uid, IdCardComponent? id = null) - { - if (!Resolve(uid, ref id)) - return; - - var jobSuffix = string.IsNullOrWhiteSpace(id.JobTitle) ? string.Empty : $" ({id.JobTitle})"; - - var val = string.IsNullOrWhiteSpace(id.FullName) - ? Loc.GetString("access-id-card-component-owner-name-job-title-text", - ("jobSuffix", jobSuffix)) - : Loc.GetString("access-id-card-component-owner-full-name-job-title-text", - ("fullName", id.FullName), - ("jobSuffix", jobSuffix)); - _metaSystem.SetEntityName(uid, val); - } } diff --git a/Content.Shared/Access/Systems/SharedIdCardSystem.cs b/Content.Shared/Access/Systems/SharedIdCardSystem.cs index 842e7e7e6a..11a61c7bf3 100644 --- a/Content.Shared/Access/Systems/SharedIdCardSystem.cs +++ b/Content.Shared/Access/Systems/SharedIdCardSystem.cs @@ -1,13 +1,32 @@ using Content.Shared.Access.Components; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; using Content.Shared.Hands.Components; using Content.Shared.Inventory; using Content.Shared.PDA; +using Content.Shared.Roles; +using Content.Shared.StatusIcon; +using Robust.Shared.Prototypes; namespace Content.Shared.Access.Systems; public abstract class SharedIdCardSystem : EntitySystem { + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly MetaDataSystem _metaSystem = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(EntityUid uid, IdCardComponent id, MapInitEvent args) + { + UpdateEntityName(uid, id); + } /// /// Attempt to find an ID card on an entity. This will look in the entity itself, in the entity's hands, and @@ -56,4 +75,143 @@ public abstract class SharedIdCardSystem : EntitySystem idCard = default; return false; } + + /// + /// Attempts to change the job title of a card. + /// Returns true/false. + /// + /// + /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. + /// + public bool TryChangeJobTitle(EntityUid uid, string? jobTitle, IdCardComponent? id = null, EntityUid? player = null) + { + if (!Resolve(uid, ref id)) + return false; + + if (!string.IsNullOrWhiteSpace(jobTitle)) + { + jobTitle = jobTitle.Trim(); + + if (jobTitle.Length > IdCardConsoleComponent.MaxJobTitleLength) + jobTitle = jobTitle[..IdCardConsoleComponent.MaxJobTitleLength]; + } + else + { + jobTitle = null; + } + + if (id.JobTitle == jobTitle) + return true; + id.JobTitle = jobTitle; + Dirty(uid, id); + UpdateEntityName(uid, id); + + if (player != null) + { + _adminLogger.Add(LogType.Identity, LogImpact.Low, + $"{ToPrettyString(player.Value):player} has changed the job title of {ToPrettyString(uid):entity} to {jobTitle} "); + } + return true; + } + + public bool TryChangeJobIcon(EntityUid uid, StatusIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null) + { + if (!Resolve(uid, ref id)) + { + return false; + } + + if (id.JobIcon == jobIcon.ID) + { + return true; + } + + id.JobIcon = jobIcon.ID; + Dirty(uid, id); + + if (player != null) + { + _adminLogger.Add(LogType.Identity, LogImpact.Low, + $"{ToPrettyString(player.Value):player} has changed the job icon of {ToPrettyString(uid):entity} to {jobIcon} "); + } + + return true; + } + + public bool TryChangeJobDepartment(EntityUid uid, JobPrototype job, IdCardComponent? id = null) + { + if (!Resolve(uid, ref id)) + return false; + + id.JobDepartments.Clear(); + foreach (var department in _prototypeManager.EnumeratePrototypes()) + { + if (department.Roles.Contains(job.ID)) + id.JobDepartments.Add("department-" + department.ID); + } + + Dirty(uid, id); + + return true; + } + + /// + /// Attempts to change the full name of a card. + /// Returns true/false. + /// + /// + /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. + /// + public bool TryChangeFullName(EntityUid uid, string? fullName, IdCardComponent? id = null, EntityUid? player = null) + { + if (!Resolve(uid, ref id)) + return false; + + if (!string.IsNullOrWhiteSpace(fullName)) + { + fullName = fullName.Trim(); + if (fullName.Length > IdCardConsoleComponent.MaxFullNameLength) + fullName = fullName[..IdCardConsoleComponent.MaxFullNameLength]; + } + else + { + fullName = null; + } + + if (id.FullName == fullName) + return true; + id.FullName = fullName; + Dirty(uid, id); + UpdateEntityName(uid, id); + + if (player != null) + { + _adminLogger.Add(LogType.Identity, LogImpact.Low, + $"{ToPrettyString(player.Value):player} has changed the name of {ToPrettyString(uid):entity} to {fullName} "); + } + return true; + } + + /// + /// Changes the name of the id's owner. + /// + /// + /// If either or is empty, it's replaced by placeholders. + /// If both are empty, the original entity's name is restored. + /// + private void UpdateEntityName(EntityUid uid, IdCardComponent? id = null) + { + if (!Resolve(uid, ref id)) + return; + + var jobSuffix = string.IsNullOrWhiteSpace(id.JobTitle) ? string.Empty : $" ({id.JobTitle})"; + + var val = string.IsNullOrWhiteSpace(id.FullName) + ? Loc.GetString("access-id-card-component-owner-name-job-title-text", + ("jobSuffix", jobSuffix)) + : Loc.GetString("access-id-card-component-owner-full-name-job-title-text", + ("fullName", id.FullName), + ("jobSuffix", jobSuffix)); + _metaSystem.SetEntityName(uid, val); + } } From 290a984c909826b158e11ac0bd40110a3290e189 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Fri, 26 Apr 2024 04:01:07 -0400 Subject: [PATCH 19/66] Oasis small tweaks (#27335) do the easy reviews --- Resources/Maps/oasis.yml | 8826 ++++++++++++++++++++------------------ 1 file changed, 4765 insertions(+), 4061 deletions(-) diff --git a/Resources/Maps/oasis.yml b/Resources/Maps/oasis.yml index 47109ea20e..fe4308f081 100644 --- a/Resources/Maps/oasis.yml +++ b/Resources/Maps/oasis.yml @@ -86,11 +86,11 @@ entities: chunks: 0,0: ind: 0,0 - tiles: HwAAAAACHwAAAAACHwAAAAACHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAABHQAAAAABHQAAAAADHQAAAAACHQAAAAAAHQAAAAACHQAAAAABHQAAAAAAHQAAAAACHwAAAAADHwAAAAAAHwAAAAAAHQAAAAABHQAAAAACHQAAAAABHQAAAAABHQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAACHQAAAAACHQAAAAABHQAAAAACHQAAAAADHwAAAAACHwAAAAACHwAAAAABHQAAAAACHQAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAABHQAAAAACHQAAAAABgQAAAAAATwAAAAAADAAAAAACDAAAAAAASgAAAAAADAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAABHQAAAAADgQAAAAAADAAAAAACDAAAAAABDAAAAAABDAAAAAADDAAAAAABDAAAAAACDAAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAABHQAAAAAAgQAAAAAADAAAAAAADAAAAAADDAAAAAAADAAAAAACDAAAAAAADAAAAAADDAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAABSgAAAAAADAAAAAACDAAAAAAADAAAAAAADAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADHQAAAAAAHQAAAAABMgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAABDAAAAAAAHQAAAAACHQAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAADAAAAAACHQAAAAABHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAAHQAAAAADHQAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADgQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAA + tiles: HwAAAAACHwAAAAACHwAAAAACHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAABHQAAAAABHQAAAAADHQAAAAACHQAAAAAAHQAAAAACHQAAAAABHQAAAAAAHQAAAAACHwAAAAADHwAAAAAAHwAAAAAAHQAAAAABHQAAAAACHQAAAAABHQAAAAABHQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAACHQAAAAACHQAAAAABHQAAAAACHQAAAAADHwAAAAACHwAAAAACHwAAAAABHQAAAAACHQAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAABHQAAAAACHQAAAAABgQAAAAAATwAAAAAADAAAAAACDAAAAAAASgAAAAAADAAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAABHQAAAAADgQAAAAAADAAAAAACDAAAAAABDAAAAAABDAAAAAADDAAAAAABDAAAAAACDAAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAABHQAAAAAAgQAAAAAADAAAAAAADAAAAAADDAAAAAAADAAAAAACDAAAAAAADAAAAAADDAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAABSgAAAAAADAAAAAACDAAAAAAADAAAAAAADAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADHQAAAAAAHQAAAAABMgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAABDAAAAAAAHQAAAAACHQAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAADAAAAAACHQAAAAABHQAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAAHQAAAAADHQAAAAABNgAAAAAANgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADgQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAA version: 6 -1,0: ind: -1,0 - tiles: HQAAAAADHQAAAAABHQAAAAABHQAAAAABHQAAAAACHQAAAAADHQAAAAAAHQAAAAAAHQAAAAADHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAAAHwAAAAAAHwAAAAADHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADHQAAAAADHQAAAAAAHQAAAAAAHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAABHQAAAAADHwAAAAAAHwAAAAAADwAAAAABgQAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAABSgAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAACHwAAAAAAHwAAAAABDwAAAAABDwAAAAABSgAAAAAASgAAAAAANgAAAAACNgAAAAADSgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAABHQAAAAACHQAAAAAADwAAAAACDwAAAAAADwAAAAABSgAAAAAANgAAAAABNgAAAAACNgAAAAADDAAAAAADSgAAAAAASgAAAAAASgAAAAAADAAAAAACDAAAAAADgQAAAAAAHQAAAAAAHQAAAAACDwAAAAAADwAAAAADDwAAAAABNgAAAAADNgAAAAACNgAAAAACDAAAAAABDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAAgQAAAAAAHQAAAAACDwAAAAADDwAAAAAADwAAAAADNgAAAAADNgAAAAACNgAAAAADSgAAAAAASgAAAAAADwAAAAADDwAAAAAADwAAAAABDwAAAAABSgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAADDwAAAAAADwAAAAAANgAAAAABNgAAAAABNgAAAAADMgAAAAAASgAAAAAADwAAAAACDwAAAAADDwAAAAAADwAAAAADSgAAAAAASgAAAAAASgAAAAAAHQAAAAACDwAAAAACDwAAAAAADwAAAAAADAAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAADwAAAAACDwAAAAAADwAAAAABDwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAABDwAAAAAADwAAAAABDAAAAAAANgAAAAABNgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAACDwAAAAABDwAAAAAADAAAAAADDAAAAAACNgAAAAAANgAAAAACNgAAAAAANgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAAADAAAAAABDAAAAAABMgAAAAAAHQAAAAAADwAAAAABDAAAAAAADAAAAAAASgAAAAAANgAAAAABNgAAAAADNgAAAAABNgAAAAADNgAAAAABDAAAAAADDAAAAAABDAAAAAABMgAAAAAAMgAAAAAAMgAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAAANgAAAAABNgAAAAABNgAAAAAANgAAAAAANgAAAAAANgAAAAADNgAAAAACNgAAAAAAHQAAAAADSgAAAAAADwAAAAACDwAAAAADDwAAAAABSgAAAAAADAAAAAABNgAAAAACNgAAAAADNgAAAAABNgAAAAABNgAAAAADNgAAAAADNgAAAAADNgAAAAABNgAAAAACHQAAAAADSgAAAAAADwAAAAAADwAAAAACDwAAAAACSgAAAAAADAAAAAACNgAAAAACNgAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAACSgAAAAAAHQAAAAACSgAAAAAADwAAAAABDwAAAAACDwAAAAADSgAAAAAADAAAAAABNgAAAAADNgAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAAgQAAAAAAHQAAAAAD + tiles: HQAAAAADHQAAAAABHQAAAAABHQAAAAABHQAAAAACHQAAAAADHQAAAAAAHQAAAAAAHQAAAAADHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAAAHwAAAAAAHwAAAAADHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADHQAAAAADHQAAAAAAHQAAAAAAHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAABHQAAAAADHwAAAAAAHwAAAAAADwAAAAABgQAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAABSgAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAACHwAAAAAAHwAAAAABDwAAAAABDwAAAAABSgAAAAAASgAAAAAANgAAAAACNgAAAAADSgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAABHQAAAAACHQAAAAAADwAAAAACDwAAAAAADwAAAAABSgAAAAAANgAAAAABNgAAAAACNgAAAAADDAAAAAADSgAAAAAASgAAAAAASgAAAAAADAAAAAACDAAAAAADgQAAAAAAHQAAAAAAHQAAAAACDwAAAAAADwAAAAADDwAAAAABNgAAAAADNgAAAAACNgAAAAACDAAAAAABDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAAgQAAAAAAHQAAAAACDwAAAAADDwAAAAAADwAAAAADNgAAAAADNgAAAAACNgAAAAADSgAAAAAASgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAADDwAAAAAADwAAAAAANgAAAAABNgAAAAABNgAAAAADMgAAAAAASgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACDwAAAAACDwAAAAAADwAAAAAADAAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAABDwAAAAAADwAAAAABDAAAAAAANgAAAAABNgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAACDwAAAAABDwAAAAAADAAAAAADDAAAAAACNgAAAAAANgAAAAACNgAAAAAANgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAAADAAAAAABDAAAAAABMgAAAAAAHQAAAAAADwAAAAABDAAAAAAADAAAAAAASgAAAAAANgAAAAABNgAAAAADNgAAAAABNgAAAAADNgAAAAABDAAAAAADDAAAAAABDAAAAAABMgAAAAAAMgAAAAAAMgAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAAANgAAAAABNgAAAAABNgAAAAAANgAAAAAANgAAAAAANgAAAAADNgAAAAACNgAAAAAAHQAAAAADSgAAAAAADwAAAAACDwAAAAADDwAAAAABSgAAAAAADAAAAAABNgAAAAACNgAAAAADNgAAAAABNgAAAAABNgAAAAADNgAAAAADNgAAAAADNgAAAAABNgAAAAACHQAAAAADSgAAAAAADwAAAAAADwAAAAACDwAAAAACSgAAAAAADAAAAAACNgAAAAACNgAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAACSgAAAAAAHQAAAAACSgAAAAAADwAAAAABDwAAAAACDwAAAAADSgAAAAAADAAAAAABNgAAAAADNgAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAAgQAAAAAAHQAAAAAD version: 6 0,-1: ind: 0,-1 @@ -142,7 +142,7 @@ entities: version: 6 -1,-2: ind: -1,-2 - tiles: cwAAAAABcwAAAAAAcwAAAAAAcwAAAAADcwAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcwAAAAACcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAACKQAAAAABKQAAAAACgQAAAAAAYAAAAAADcwAAAAAAcwAAAAACgQAAAAAAcwAAAAABcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAAAYAAAAAAAcwAAAAAAcwAAAAADcwAAAAACcwAAAAADcwAAAAABcwAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAACKQAAAAADgQAAAAAAYAAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAACgQAAAAAAKQAAAAADKQAAAAADKQAAAAADKQAAAAABKQAAAAADKQAAAAAAKQAAAAADgQAAAAAAYAAAAAACcwAAAAACcwAAAAACgQAAAAAAcwAAAAABcwAAAAADcwAAAAAAgQAAAAAAKQAAAAADKQAAAAAAKQAAAAADKQAAAAAAKQAAAAACKQAAAAAAKQAAAAADgQAAAAAAYAAAAAADcwAAAAABcwAAAAADgQAAAAAAcwAAAAACcwAAAAAAcwAAAAAAgQAAAAAAKQAAAAAAKQAAAAABKQAAAAADKQAAAAABKQAAAAABKQAAAAACKQAAAAADgQAAAAAAYAAAAAAAcwAAAAABcwAAAAACgQAAAAAAgQAAAAAAcwAAAAADcwAAAAABgQAAAAAAKQAAAAADKQAAAAACKQAAAAABKQAAAAAAKQAAAAADKQAAAAAAKQAAAAAAgQAAAAAAYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAgQAAAAAAYAAAAAACYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAbwAAAAAAYAAAAAADYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAACgQAAAAAAMAAAAAACMAAAAAACMAAAAAABMAAAAAADgQAAAAAAQwAAAAAFQwAAAAABQwAAAAACQwAAAAABgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAAMAAAAAABMAAAAAADMAAAAAAAMAAAAAACgQAAAAAAQwAAAAAEQwAAAAACQwAAAAAFQwAAAAAFgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAADAAAAAAASgAAAAAADAAAAAACDAAAAAAAgQAAAAAAQwAAAAAEQwAAAAABQwAAAAAFQwAAAAACgQAAAAAADQAAAAAADQAAAAAADQAAAAAAgQAAAAAAYAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAC + tiles: cwAAAAABcwAAAAAAcwAAAAAAcwAAAAADcwAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcwAAAAACcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAACKQAAAAABKQAAAAACgQAAAAAAYAAAAAADcwAAAAAAcwAAAAACgQAAAAAAcwAAAAABcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAAAYAAAAAAAcwAAAAAAcwAAAAADcwAAAAACcwAAAAADcwAAAAABcwAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAAAKQAAAAAAKQAAAAAAgQAAAAAAYAAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAACgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAABdwAAAAAAdwAAAAAAdwAAAAAAgQAAAAAAYAAAAAACcwAAAAACcwAAAAACgQAAAAAAcwAAAAABcwAAAAADcwAAAAAAgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAgQAAAAAAYAAAAAADcwAAAAABcwAAAAADgQAAAAAAcwAAAAACcwAAAAAAcwAAAAAAgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAABKQAAAAAAKQAAAAAAKQAAAAAAgQAAAAAAYAAAAAAAcwAAAAABcwAAAAACgQAAAAAAgQAAAAAAcwAAAAADcwAAAAABgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAgQAAAAAAYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAJgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAgQAAAAAAYAAAAAACYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAbwAAAAAAYAAAAAADYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAACgQAAAAAAMAAAAAACMAAAAAACMAAAAAABMAAAAAADgQAAAAAAQwAAAAAFQwAAAAABQwAAAAACQwAAAAABgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAAMAAAAAABMAAAAAADMAAAAAAAMAAAAAACgQAAAAAAQwAAAAAEQwAAAAACQwAAAAAFQwAAAAAFgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAADAAAAAAASgAAAAAADAAAAAACDAAAAAAAgQAAAAAAQwAAAAAEQwAAAAABQwAAAAAFQwAAAAACgQAAAAAADQAAAAAADQAAAAAADQAAAAAAgQAAAAAAYAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAC version: 6 -2,-2: ind: -2,-2 @@ -174,7 +174,7 @@ entities: version: 6 2,-1: ind: 2,-1 - tiles: KQAAAAACgQAAAAAAKQAAAAACKQAAAAACgQAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAABKQAAAAABKQAAAAABKQAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAABKQAAAAABgQAAAAAAKQAAAAADKQAAAAADgQAAAAAAKQAAAAACKQAAAAACKQAAAAADKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAADKQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAAAgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAAAJwAAAAADJwAAAAADJwAAAAAAJwAAAAABJwAAAAABKQAAAAAAKQAAAAACKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAAAKQAAAAAAKQAAAAABKQAAAAACKQAAAAABJwAAAAACJwAAAAABJwAAAAACJwAAAAACJwAAAAADKQAAAAACKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAABKQAAAAAAKQAAAAABKQAAAAABKQAAAAACJwAAAAABJwAAAAADJwAAAAABJwAAAAAAJwAAAAACKQAAAAABKQAAAAAAKQAAAAACKQAAAAABKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAABKQAAAAADKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAABKQAAAAABKQAAAAABgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAACKQAAAAACgQAAAAAAfQAAAAADfQAAAAADfQAAAAADfQAAAAACIQAAAAAAIQAAAAAAgQAAAAAAfQAAAAACfQAAAAADfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAADKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAAAfwAAAAAAIQAAAAACIQAAAAACgQAAAAAAgQAAAAAAfwAAAAACgQAAAAAAgQAAAAAAKQAAAAABKQAAAAACKQAAAAABKQAAAAABfwAAAAADfQAAAAABfQAAAAAAfQAAAAABfwAAAAABfQAAAAADfQAAAAAAfQAAAAACfQAAAAAAfQAAAAAAfQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADKQAAAAACgQAAAAAAfwAAAAAAfwAAAAADfwAAAAADfwAAAAADfQAAAAAAfQAAAAADfQAAAAADfQAAAAACfQAAAAACfQAAAAAAfwAAAAACfQAAAAABgQAAAAAAKQAAAAABKQAAAAABfwAAAAAAfQAAAAADfQAAAAADfQAAAAAAfwAAAAAAfQAAAAABfQAAAAACfQAAAAAAfQAAAAABfQAAAAABfQAAAAADgQAAAAAAfQAAAAAAgQAAAAAAKQAAAAABKQAAAAADgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABfwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAACgQAAAAAAKQAAAAAAKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAACfQAAAAABgQAAAAAAYAAAAAABYAAAAAACYAAAAAAAYAAAAAADgQAAAAAAYAAAAAACYAAAAAACYAAAAAACYAAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAKQAAAAADKQAAAAACYAAAAAADgQAAAAAAYAAAAAABYAAAAAAAYAAAAAACYAAAAAABYAAAAAACYAAAAAADYAAAAAADYAAAAAADYAAAAAAAYAAAAAABYAAAAAADYAAAAAABYAAAAAADYAAAAAADYAAAAAAAYAAAAAACYAAAAAADYAAAAAACYAAAAAAD + tiles: KQAAAAACgQAAAAAAKQAAAAACKQAAAAACgQAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAABKQAAAAABKQAAAAABKQAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAABKQAAAAABgQAAAAAAKQAAAAADKQAAAAADgQAAAAAAKQAAAAACKQAAAAACKQAAAAADKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAADKQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAAAgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAAAKQAAAAAAKQAAAAABKQAAAAACKQAAAAABJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAABKQAAAAAAKQAAAAABKQAAAAABKQAAAAACJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAKQAAAAABKQAAAAAAKQAAAAACKQAAAAABKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAABKQAAAAADKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAABKQAAAAABKQAAAAABgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAACKQAAAAACgQAAAAAAfQAAAAADfQAAAAADfQAAAAADfQAAAAACIQAAAAAAIQAAAAAAgQAAAAAAfQAAAAACfQAAAAADfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAADKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAAAfwAAAAAAIQAAAAACIQAAAAACgQAAAAAAgQAAAAAAfwAAAAACgQAAAAAAgQAAAAAAKQAAAAABKQAAAAACKQAAAAABKQAAAAABfwAAAAADfQAAAAABfQAAAAAAfQAAAAABfwAAAAABfQAAAAADfQAAAAAAfQAAAAACfQAAAAAAfQAAAAAAfQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADKQAAAAACgQAAAAAAfwAAAAAAfwAAAAADfwAAAAADfwAAAAADfQAAAAAAfQAAAAADfQAAAAADfQAAAAACfQAAAAACfQAAAAAAfwAAAAACfQAAAAABgQAAAAAAKQAAAAABKQAAAAABfwAAAAAAfQAAAAADfQAAAAADfQAAAAAAfwAAAAAAfQAAAAABfQAAAAACfQAAAAAAfQAAAAABfQAAAAABfQAAAAADgQAAAAAAfQAAAAAAgQAAAAAAKQAAAAABKQAAAAADgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABfwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAACgQAAAAAAKQAAAAAAKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAACfQAAAAABgQAAAAAAYAAAAAABYAAAAAACYAAAAAAAYAAAAAADgQAAAAAAYAAAAAACYAAAAAACYAAAAAACYAAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAKQAAAAADKQAAAAACYAAAAAADgQAAAAAAYAAAAAABYAAAAAAAYAAAAAACYAAAAAABYAAAAAACYAAAAAADYAAAAAADYAAAAAADYAAAAAAAYAAAAAABYAAAAAADYAAAAAABYAAAAAADYAAAAAADYAAAAAAAYAAAAAACYAAAAAADYAAAAAACYAAAAAAD version: 6 2,0: ind: 2,0 @@ -370,11 +370,11 @@ entities: version: 6 4,0: ind: 4,0 - tiles: gQAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: DAAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,-1: ind: 4,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,-2: ind: 4,-2 @@ -444,2685 +444,2706 @@ entities: color: '#FFFFFFFF' id: Arrows decals: - 720: 42.99683,-1.538444 + 716: 42.99683,-1.538444 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: Arrows decals: - 721: 39.96558,-1.975944 + 717: 39.96558,-1.975944 - node: color: '#FFFFFFFF' id: Bot decals: - 974: -57,-9 - 975: -56,-9 - 976: -55,-9 - 977: -55,-10 - 978: -56,-10 - 979: -57,-10 - 980: -57,-11 - 981: -56,-11 - 982: -55,-11 - 983: -55,-12 - 984: -56,-12 - 985: -57,-12 + 970: -57,-9 + 971: -56,-9 + 972: -55,-9 + 973: -55,-10 + 974: -56,-10 + 975: -57,-10 + 976: -57,-11 + 977: -56,-11 + 978: -55,-11 + 979: -55,-12 + 980: -56,-12 + 981: -57,-12 + 3731: -3,-31 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: Bot decals: - 725: 40,-3 + 721: 40,-3 - node: color: '#FFFFFFFF' id: BotGreyscale decals: - 2778: 35,-25 - 2779: 35,-26 - 2780: 32,-25 - 2781: 32,-24 - 2782: 32,-22 - 2893: 7,-38 - 3024: 15,-40 - 3025: 15,-41 + 2773: 35,-25 + 2774: 35,-26 + 2775: 32,-25 + 2776: 32,-24 + 2777: 32,-22 + 2888: 7,-38 + 3019: 15,-40 + 3020: 15,-41 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: BotLeft decals: - 722: 43,-3 - 723: 42,-3 - 724: 41,-3 + 718: 43,-3 + 719: 42,-3 + 720: 41,-3 - node: color: '#FFFFFFFF' id: BotLeftGreyscale decals: - 2894: 7,-38 + 2889: 7,-38 - node: color: '#FFFFFFFF' id: BotRightGreyscale decals: - 2895: 7,-38 + 2890: 7,-38 - node: color: '#FFFFFFFF' id: Box decals: - 1785: 49,-37 - 1786: 49,-38 - 2397: -7,-51 - 2398: -5,-53 + 1781: 49,-37 + 1782: 49,-38 + 2393: -7,-51 + 2394: -5,-53 - node: color: '#C74EBDB2' id: BrickCornerOverlayNE decals: - 2990: -18,-25 + 2985: -18,-25 - node: color: '#EFB34196' id: BrickCornerOverlayNE decals: - 2540: 5,51 - 3155: -3,42 + 2536: 5,51 + 3150: -3,42 - node: color: '#F9801DB2' id: BrickCornerOverlayNE decals: - 3003: -22,-25 + 2998: -22,-25 - node: color: '#FED83DB2' id: BrickCornerOverlayNE decals: - 2996: -15,-25 + 2991: -15,-25 - node: color: '#C74EBDB2' id: BrickCornerOverlayNW decals: - 2991: -20,-25 + 2986: -20,-25 - node: color: '#EFB34196' id: BrickCornerOverlayNW decals: - 2541: 3,51 - 3154: -6,42 + 2537: 3,51 + 3149: -6,42 - node: color: '#F9801DB2' id: BrickCornerOverlayNW decals: - 3002: -23,-25 + 2997: -23,-25 - node: color: '#FED83DB2' id: BrickCornerOverlayNW decals: - 2997: -16,-25 + 2992: -16,-25 - node: color: '#C74EBDB2' id: BrickCornerOverlaySE decals: - 2993: -18,-26 + 2988: -18,-26 - node: color: '#EFB34196' id: BrickCornerOverlaySE decals: - 2542: 5,49 - 3152: -3,41 + 2538: 5,49 + 3147: -3,41 - node: color: '#F9801DB2' id: BrickCornerOverlaySE decals: - 3000: -22,-26 + 2995: -22,-26 - node: color: '#FED83DB2' id: BrickCornerOverlaySE decals: - 2998: -15,-26 + 2993: -15,-26 - node: color: '#C74EBDB2' id: BrickCornerOverlaySW decals: - 2992: -20,-26 + 2987: -20,-26 - node: color: '#EFB34196' id: BrickCornerOverlaySW decals: - 2494: 7,40 - 2543: 3,49 - 3153: -6,41 + 2490: 7,40 + 2539: 3,49 + 3148: -6,41 - node: color: '#F9801DB2' id: BrickCornerOverlaySW decals: - 3001: -23,-26 + 2996: -23,-26 - node: color: '#FED83DB2' id: BrickCornerOverlaySW decals: - 2999: -16,-26 + 2994: -16,-26 - node: color: '#EFB34196' id: BrickLineOverlayE decals: - 2505: 9,50 - 2506: 9,48 - 2507: 9,47 - 2515: 19,50 - 2526: 19,51 - 2527: 9,51 - 2546: 5,50 - 2548: 3,50 + 2501: 9,50 + 2502: 9,48 + 2503: 9,47 + 2511: 19,50 + 2522: 19,51 + 2523: 9,51 + 2542: 5,50 + 2544: 3,50 - node: color: '#C74EBDB2' id: BrickLineOverlayN decals: - 2994: -19,-25 - 3005: -20,-27 - 3006: -18,-27 - 3012: -19,-27 + 2989: -19,-25 + 3000: -20,-27 + 3001: -18,-27 + 3007: -19,-27 - node: color: '#EFB34196' id: BrickLineOverlayN decals: - 2508: 10,46 - 2509: 11,46 - 2510: 15,46 - 2511: 16,46 - 2545: 4,51 - 2551: 4,49 - 3156: -4,42 - 3157: -5,42 + 2504: 10,46 + 2505: 11,46 + 2506: 15,46 + 2507: 16,46 + 2541: 4,51 + 2547: 4,49 + 3151: -4,42 + 3152: -5,42 - node: color: '#F9801DB2' id: BrickLineOverlayN decals: - 3004: -23,-27 - 3013: -22,-27 + 2999: -23,-27 + 3008: -22,-27 - node: color: '#FED83DB2' id: BrickLineOverlayN decals: - 3007: -15,-27 - 3011: -16,-27 + 3002: -15,-27 + 3006: -16,-27 - node: color: '#C74EBDB2' id: BrickLineOverlayS decals: - 2995: -19,-26 + 2990: -19,-26 - node: color: '#EFB34196' id: BrickLineOverlayS decals: - 2547: 4,49 - 2549: 4,51 - 3158: -5,41 - 3159: -4,41 + 2543: 4,49 + 2545: 4,51 + 3153: -5,41 + 3154: -4,41 - node: color: '#EFB34196' id: BrickLineOverlayW decals: - 2495: 7,41 - 2496: 7,42 - 2497: 7,43 - 2498: 7,44 - 2499: 7,45 - 2500: 7,46 - 2501: 7,47 - 2502: 7,48 - 2503: 7,49 - 2504: 7,50 - 2512: 17,47 - 2513: 17,48 - 2514: 17,50 - 2525: 17,51 - 2528: 7,51 - 2544: 3,50 - 2550: 5,50 + 2491: 7,41 + 2492: 7,42 + 2493: 7,43 + 2494: 7,44 + 2495: 7,45 + 2496: 7,46 + 2497: 7,47 + 2498: 7,48 + 2499: 7,49 + 2500: 7,50 + 2508: 17,47 + 2509: 17,48 + 2510: 17,50 + 2521: 17,51 + 2524: 7,51 + 2540: 3,50 + 2546: 5,50 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNe decals: - 885: -53,8 - 886: -52,7 - 1778: 42,-40 + 881: -53,8 + 882: -52,7 + 1774: 42,-40 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNw decals: - 883: -55,8 - 887: -57,7 - 1777: 40,-40 + 879: -55,8 + 883: -57,7 + 1773: 40,-40 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerSe decals: - 888: -52,5 + 884: -52,5 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerSw decals: - 889: -57,5 + 885: -57,5 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNe decals: - 631: 22,4 - 896: -53,7 + 627: 22,4 + 892: -53,7 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNw decals: - 897: -55,7 + 893: -55,7 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerSe decals: - 632: 22,9 + 628: 22,9 - node: color: '#FFFFFFFF' id: BrickTileDarkLineE decals: - 627: 22,8 - 628: 22,7 - 629: 22,6 - 630: 22,5 - 898: -52,6 - 2575: 27,42 - 2576: 27,43 - 2577: 30,42 - 2578: 30,43 + 623: 22,8 + 624: 22,7 + 625: 22,6 + 626: 22,5 + 894: -52,6 + 2571: 27,42 + 2572: 27,43 + 2573: 30,42 + 2574: 30,43 - node: color: '#FFFFFFFF' id: BrickTileDarkLineN decals: - 884: -54,8 - 895: -56,7 - 1779: 41,-40 + 880: -54,8 + 891: -56,7 + 1775: 41,-40 + 3767: -8,-24 - node: color: '#FFFFFFFF' id: BrickTileDarkLineS decals: - 890: -56,5 - 891: -55,5 - 892: -54,5 - 893: -53,5 + 886: -56,5 + 887: -55,5 + 888: -54,5 + 889: -53,5 - node: color: '#FFFFFFFF' id: BrickTileDarkLineW decals: - 894: -57,6 - 2579: 31,42 - 2580: 31,43 + 890: -57,6 + 2575: 31,42 + 2576: 31,43 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerNe decals: - 735: -1,-34 - 2381: -4,-50 - 2445: 32,-38 - 3138: -28,42 + 731: -1,-34 + 2377: -4,-50 + 2441: 32,-38 + 3133: -28,42 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerNw decals: - 151: 18,-19 - 152: 19,-18 - 2382: -8,-50 - 2444: 29,-38 - 3139: -33,42 + 2378: -8,-50 + 2440: 29,-38 + 3134: -33,42 + 3512: 19,-18 + 3513: 18,-19 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerSe decals: - 734: -1,-39 - 2383: -4,-54 - 2453: 32,-40 - 3140: -28,40 + 730: -1,-39 + 2379: -4,-54 + 2449: 32,-40 + 3135: -28,40 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerSw decals: - 2384: -8,-54 - 2449: 29,-40 - 3141: -33,40 + 2380: -8,-54 + 2445: 29,-40 + 3136: -33,40 - node: color: '#FFFFFFFF' id: BrickTileSteelEndN decals: - 2373: -8,-44 + 2369: -8,-44 - node: color: '#FFFFFFFF' id: BrickTileSteelEndS decals: - 2374: -8,-48 + 2370: -8,-48 - node: color: '#FFFFFFFF' id: BrickTileSteelInnerNe decals: - 732: -2,-34 + 728: -2,-34 - node: color: '#FFFFFFFF' id: BrickTileSteelInnerNw decals: - 156: 19,-19 + 3518: 19,-19 - node: color: '#FFFFFFFF' id: BrickTileSteelInnerSe decals: - 731: -2,-39 + 727: -2,-39 - node: color: '#FFFFFFFF' id: BrickTileSteelLineE decals: - 726: -2,-40 - 727: -1,-38 - 728: -1,-37 - 729: -1,-36 - 730: -1,-35 - 733: -2,-33 - 1866: 17,30 - 2375: -8,-47 - 2376: -8,-46 - 2377: -8,-45 - 2385: -4,-53 - 2386: -4,-52 - 2387: -4,-51 - 2452: 32,-39 - 3142: -28,41 + 722: -2,-40 + 723: -1,-38 + 724: -1,-37 + 725: -1,-36 + 726: -1,-35 + 729: -2,-33 + 1862: 17,30 + 2371: -8,-47 + 2372: -8,-46 + 2373: -8,-45 + 2381: -4,-53 + 2382: -4,-52 + 2383: -4,-51 + 2448: 32,-39 + 3137: -28,41 - node: color: '#FFFFFFFF' id: BrickTileSteelLineN decals: - 154: 20,-18 - 155: 21,-18 - 2388: -5,-50 - 2389: -6,-50 - 2390: -7,-50 - 2446: 30,-38 - 2450: 31,-38 - 3148: -32,42 - 3149: -31,42 - 3150: -30,42 - 3151: -29,42 + 2384: -5,-50 + 2385: -6,-50 + 2386: -7,-50 + 2442: 30,-38 + 2446: 31,-38 + 3143: -32,42 + 3144: -31,42 + 3145: -30,42 + 3146: -29,42 + 3516: 20,-18 + 3517: 21,-18 - node: color: '#FFFFFFFF' id: BrickTileSteelLineS decals: - 2391: -5,-54 - 2392: -6,-54 - 2393: -7,-54 - 2447: 30,-40 - 2448: 31,-40 - 3144: -32,40 - 3145: -31,40 - 3146: -30,40 - 3147: -29,40 + 2387: -5,-54 + 2388: -6,-54 + 2389: -7,-54 + 2443: 30,-40 + 2444: 31,-40 + 3139: -32,40 + 3140: -31,40 + 3141: -30,40 + 3142: -29,40 - node: color: '#FFFFFFFF' id: BrickTileSteelLineW decals: - 150: 18,-20 - 153: 18,-21 - 1867: 12,30 - 2378: -8,-47 - 2379: -8,-46 - 2380: -8,-45 - 2394: -8,-53 - 2395: -8,-52 - 2396: -8,-51 - 2451: 29,-39 - 3143: -33,41 + 1863: 12,30 + 2374: -8,-47 + 2375: -8,-46 + 2376: -8,-45 + 2390: -8,-53 + 2391: -8,-52 + 2392: -8,-51 + 2447: 29,-39 + 3138: -33,41 + 3514: 18,-21 + 3515: 18,-20 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerNe decals: - 3226: -27,43 - 3236: -36,4 - 3238: -42,5 + 3221: -27,43 + 3231: -36,4 + 3233: -42,5 - node: color: '#334E6DC8' id: BrickTileWhiteCornerNe decals: - 620: 24,9 - 623: 24,8 + 616: 24,9 + 619: 24,8 - node: color: '#4B709CFF' id: BrickTileWhiteCornerNe decals: - 464: -24,-35 + 460: -24,-35 - node: color: '#52B4E996' id: BrickTileWhiteCornerNe decals: - 241: -5,-33 - 242: -5,-38 - 505: -25,-26 - 516: -29,-26 - 568: -24,-39 - 2417: 28,-35 - 2439: 37,-37 + 237: -5,-33 + 238: -5,-38 + 501: -25,-26 + 512: -29,-26 + 564: -24,-39 + 2413: 28,-35 + 2435: 37,-37 - node: color: '#765428FF' id: BrickTileWhiteCornerNe decals: - 3390: -53,-17 + 3385: -53,-17 - node: color: '#9FED58B3' id: BrickTileWhiteCornerNe decals: - 2590: -46,-30 + 2586: -46,-30 - node: color: '#BC863FFF' id: BrickTileWhiteCornerNe decals: - 3279: -49,3 + 3274: -49,3 - node: color: '#D381C996' id: BrickTileWhiteCornerNe decals: - 848: -11,-47 - 2245: 16,-35 - 2246: 12,-43 + 844: -11,-47 + 2241: 16,-35 + 2242: 12,-43 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNe decals: - 1602: 51,-3 - 1766: 42,-41 - 1780: 42,-40 + 1598: 51,-3 + 1762: 42,-41 + 1776: 42,-40 - node: color: '#EFB34196' id: BrickTileWhiteCornerNe decals: - 3160: -2,43 + 3155: -2,43 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNe decals: - 585: -30,-27 + 581: -30,-27 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerNw decals: - 3227: -34,43 - 3237: -44,5 + 3222: -34,43 + 3232: -44,5 - node: color: '#334E6DC8' id: BrickTileWhiteCornerNw decals: - 610: 21,8 - 615: 20,8 - 621: 23,9 - 622: 23,8 - 3268: -44,-9 + 606: 21,8 + 611: 20,8 + 617: 23,9 + 618: 23,8 + 3263: -44,-9 - node: color: '#4B709CFF' id: BrickTileWhiteCornerNw decals: - 463: -27,-35 + 459: -27,-35 - node: color: '#52B4E996' id: BrickTileWhiteCornerNw decals: - 235: -10,-38 - 236: -10,-33 - 504: -27,-26 - 515: -33,-26 - 569: -28,-39 - 738: -2,-39 - 2416: 27,-35 + 231: -10,-38 + 232: -10,-33 + 500: -27,-26 + 511: -33,-26 + 565: -28,-39 + 734: -2,-39 + 2412: 27,-35 - node: color: '#765428FF' id: BrickTileWhiteCornerNw decals: - 3389: -58,-17 + 3384: -58,-17 - node: color: '#9FED58B3' id: BrickTileWhiteCornerNw decals: - 2591: -48,-30 + 2587: -48,-30 - node: color: '#BC863FFF' id: BrickTileWhiteCornerNw decals: - 3278: -51,3 - 3415: -51,-2 + 3273: -51,3 + 3410: -51,-2 - node: color: '#D381C996' id: BrickTileWhiteCornerNw decals: - 849: -14,-47 - 2239: 6,-43 - 2240: 14,-35 + 845: -14,-47 + 2235: 6,-43 + 2236: 14,-35 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNw decals: - 1601: 49,-3 - 1781: 40,-40 + 1597: 49,-3 + 1777: 40,-40 - node: color: '#EFB34196' id: BrickTileWhiteCornerNw decals: - 3171: -7,43 + 3166: -7,43 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNw decals: - 583: -32,-27 - 584: -32,-27 + 579: -32,-27 + 580: -32,-27 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerSe decals: - 3228: -27,39 - 3240: -36,3 + 3223: -27,39 + 3235: -36,3 - node: color: '#334E6DC8' id: BrickTileWhiteCornerSe decals: - 619: 24,4 - 624: 24,5 - 625: 24,5 + 615: 24,4 + 620: 24,5 + 621: 24,5 - node: color: '#4B709CFF' id: BrickTileWhiteCornerSe decals: - 466: -24,-37 + 462: -24,-37 - node: color: '#52B4E996' id: BrickTileWhiteCornerSe decals: - 237: -5,-35 - 238: -5,-40 - 502: -25,-30 - 514: -29,-30 - 566: -24,-42 - 2437: 34,-42 - 2438: 37,-38 + 233: -5,-35 + 234: -5,-40 + 498: -25,-30 + 510: -29,-30 + 562: -24,-42 + 2433: 34,-42 + 2434: 37,-38 - node: color: '#765428FF' id: BrickTileWhiteCornerSe decals: - 3392: -53,-24 + 3387: -53,-24 - node: color: '#9FED58B3' id: BrickTileWhiteCornerSe decals: - 2588: -46,-31 + 2584: -46,-31 - node: color: '#BC863FFF' id: BrickTileWhiteCornerSe decals: - 3287: -49,-5 + 3282: -49,-5 - node: color: '#D381C996' id: BrickTileWhiteCornerSe decals: - 847: -11,-51 - 2241: 12,-45 - 2242: 16,-44 + 843: -11,-51 + 2237: 12,-45 + 2238: 16,-44 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSe decals: - 1603: 51,-4 + 1599: 51,-4 - node: color: '#EFB34196' id: BrickTileWhiteCornerSe decals: - 3161: -2,40 - 3176: 10,40 - 3181: 19,39 + 3156: -2,40 + 3171: 10,40 + 3176: 19,39 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSe decals: - 582: -30,-29 + 578: -30,-29 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerSw decals: - 3229: -34,39 - 3239: -44,3 + 3224: -34,39 + 3234: -44,3 - node: color: '#334E6DC8' id: BrickTileWhiteCornerSw decals: - 611: 21,5 - 614: 20,5 - 618: 23,4 - 626: 23,5 - 3267: -44,-11 + 607: 21,5 + 610: 20,5 + 614: 23,4 + 622: 23,5 + 3262: -44,-11 - node: color: '#4B709CFF' id: BrickTileWhiteCornerSw decals: - 465: -27,-37 + 461: -27,-37 - node: color: '#52B4E996' id: BrickTileWhiteCornerSw decals: - 239: -10,-40 - 240: -10,-35 - 503: -27,-30 - 517: -33,-30 - 567: -28,-42 - 737: -2,-34 - 2440: 27,-42 + 235: -10,-40 + 236: -10,-35 + 499: -27,-30 + 513: -33,-30 + 563: -28,-42 + 733: -2,-34 + 2436: 27,-42 - node: color: '#765428FF' id: BrickTileWhiteCornerSw decals: - 3391: -58,-24 + 3386: -58,-24 - node: color: '#9FED58B3' id: BrickTileWhiteCornerSw decals: - 2589: -48,-31 + 2585: -48,-31 - node: color: '#BC863FFF' id: BrickTileWhiteCornerSw decals: - 3288: -51,-5 - 3414: -51,1 + 3283: -51,-5 + 3409: -51,1 - node: color: '#D381C996' id: BrickTileWhiteCornerSw decals: - 850: -14,-51 - 2243: 6,-45 - 2244: 14,-44 + 846: -14,-51 + 2239: 6,-45 + 2240: 14,-44 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSw decals: - 1604: 49,-4 + 1600: 49,-4 - node: color: '#EFB34196' id: BrickTileWhiteCornerSw decals: - 3169: -7,40 - 3180: 17,39 + 3164: -7,40 + 3175: 17,39 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSw decals: - 586: -32,-29 + 582: -32,-29 - node: color: '#169C9CFF' id: BrickTileWhiteEndE decals: - 415: -15,-30 + 411: -15,-30 - node: color: '#4B709CFF' id: BrickTileWhiteEndE decals: - 471: -25,-36 + 467: -25,-36 - node: color: '#F38BAAFF' id: BrickTileWhiteEndE decals: - 409: -21,-30 + 405: -21,-30 + - node: + color: '#80C71F80' + id: BrickTileWhiteEndS + decals: + 3541: 53,-20 + - node: + color: '#8932B87F' + id: BrickTileWhiteEndS + decals: + 3538: 49,-20 - node: color: '#DE3A3A96' id: BrickTileWhiteEndS decals: - 1767: 42,-42 + 1763: 42,-42 + - node: + color: '#F9801D7F' + id: BrickTileWhiteEndS + decals: + 3537: 45,-20 - node: color: '#169C9CFF' id: BrickTileWhiteEndW decals: - 414: -17,-30 + 410: -17,-30 - node: color: '#4B709CFF' id: BrickTileWhiteEndW decals: - 472: -26,-36 + 468: -26,-36 - node: color: '#DE3A3A96' id: BrickTileWhiteEndW decals: - 1765: 40,-41 + 1761: 40,-41 - node: color: '#F38BAAFF' id: BrickTileWhiteEndW decals: - 408: -23,-30 + 404: -23,-30 - node: color: '#00BEBE7F' id: BrickTileWhiteInnerNe decals: - 3257: -44,1 - 3265: -42,4 + 3252: -44,1 + 3260: -42,4 - node: color: '#334E6DC8' id: BrickTileWhiteInnerNe decals: - 1368: 33,-8 + 1364: 33,-8 - node: color: '#4B709CFF' id: BrickTileWhiteInnerNe decals: - 484: -27,-37 + 480: -27,-37 - node: color: '#52B4E996' id: BrickTileWhiteInnerNe decals: - 2443: 28,-37 + 2439: 28,-37 - node: color: '#9FED58B3' id: BrickTileWhiteInnerNe decals: - 2598: -48,-31 + 2594: -48,-31 - node: color: '#BC863FFF' id: BrickTileWhiteInnerNe decals: - 3296: -53,-2 - 3297: -53,3 - 3334: -53,1 - 3335: -53,2 - 3336: -53,3 - 3337: -53,-3 - 3338: -53,-4 - 3339: -53,-5 - 3340: -53,-6 - 3341: -53,-7 - 3342: -53,-8 - 3343: -53,-9 - 3344: -53,-10 - 3345: -53,-11 - 3346: -53,-12 - 3347: -53,-13 - 3348: -53,-15 - 3366: -58,3 - 3367: -57,3 - 3368: -56,3 - 3369: -55,3 + 3291: -53,-2 + 3292: -53,3 + 3329: -53,1 + 3330: -53,2 + 3331: -53,3 + 3332: -53,-3 + 3333: -53,-4 + 3334: -53,-5 + 3335: -53,-6 + 3336: -53,-7 + 3337: -53,-8 + 3338: -53,-9 + 3339: -53,-10 + 3340: -53,-11 + 3341: -53,-12 + 3342: -53,-13 + 3343: -53,-15 + 3361: -58,3 + 3362: -57,3 + 3363: -56,3 + 3364: -55,3 - node: color: '#D381C996' id: BrickTileWhiteInnerNe decals: - 2130: 3,-48 - 2133: 3,-45 - 2160: 17,-37 - 2161: 17,-36 - 2162: 17,-35 - 2163: 17,-34 - 2164: 15,-34 - 2165: 14,-34 - 2166: 13,-34 - 2174: 12,-42 - 2175: 11,-42 - 2176: 10,-42 - 2177: 9,-42 - 2178: 8,-42 - 2179: 7,-42 - 2180: 6,-42 - 2181: 5,-42 - 2189: 4,-34 - 2190: 8,-34 - 2191: 11,-40 - 2223: 8,-47 - 2224: 21,-44 - 2229: 13,-46 - 2238: 18,-45 - 2290: 5,-39 - 2343: -9,-42 - 2344: -8,-42 - 2345: -7,-42 - 2346: -7,-43 - 2352: -7,-46 - 2353: -7,-45 - 2356: -7,-49 - 2357: -6,-49 - 2358: -5,-49 - 2359: -5,-49 - 2360: -4,-49 - 2361: -3,-49 - 2362: -3,-50 - 2363: -3,-51 - 2364: -3,-52 - 2365: -3,-53 - 2366: -3,-54 - 2367: -3,-55 - 2918: 17,-42 - 2920: 17,-38 - 2921: 17,-39 - 2922: 17,-40 - 2923: 17,-43 - 2928: 20,-43 - 2929: 19,-43 - 2930: 18,-43 - 3020: 14,-42 - - node: - color: '#D4D4D428' - id: BrickTileWhiteInnerNe - decals: - 1375: 30,-3 - - node: - color: '#DE3A3A96' - id: BrickTileWhiteInnerNe - decals: - 1434: 52,-6 - 1435: 52,-7 - 1436: 53,-8 - 1437: 54,-8 - 1438: 54,-9 - 1439: 54,-14 - 1440: 54,-16 - 1441: 54,-18 - 1442: 54,-17 - 1443: 54,-19 - 1444: 52,-8 - 1445: 54,-15 - 1446: 54,-13 - 1447: 50,-6 - 1448: 48,-6 - 1471: 47,-8 - 1472: 46,-8 - 1491: 40,-15 - 1492: 40,-14 - 1493: 40,-13 - 1494: 40,-12 - 1495: 39,-11 - 1496: 37,-11 - 1497: 36,-11 - 1498: 35,-11 - 1499: 34,-11 - 1500: 33,-11 - 1501: 31,-11 - 1502: 30,-11 - 1553: 42,-21 - 1554: 42,-20 - 1575: 52,-16 - 1576: 51,-16 - 1577: 49,-16 - 1578: 48,-16 - 1579: 47,-16 - 1591: 47,-15 - 1592: 47,-14 - 1593: 47,-13 - 1594: 47,-12 - 1595: 47,-11 - 1596: 47,-10 - 1621: 40,-24 - 1623: 42,-24 - 1640: 39,-25 - 1641: 42,-25 - 1642: 42,-26 - 1643: 42,-28 - 1644: 42,-29 - 1645: 42,-30 - 1675: 38,-35 - 1697: 38,-31 - 1698: 37,-31 - 1699: 36,-31 - 1700: 35,-31 - 1701: 34,-31 - 1702: 33,-31 - 1703: 32,-31 - 1704: 31,-31 - 1705: 30,-31 - 1715: 40,-32 - 1728: 44,-32 - 1729: 43,-32 - 1730: 42,-32 - 1731: 44,-33 - 1732: 44,-34 - 1733: 43,-35 - 1734: 43,-36 - 1743: 39,-37 - 1751: 43,-39 - 1752: 43,-40 - 1753: 43,-41 - 1754: 43,-42 - 1772: 40,-39 - 1775: 39,-39 - 1783: 37,-42 - 2783: 54,-10 - 2899: 40,-25 - 2905: 42,-23 - 2907: 42,-22 - - node: - color: '#EFB34196' - id: BrickTileWhiteInnerNe - decals: - 1808: 6,38 - 1809: 5,38 - 1810: 4,38 - 1811: 8,38 - 1812: 8,37 - 1813: 8,36 - 1814: 8,35 - 1815: 8,34 - 1816: 8,31 - 1817: 8,30 - 1862: 5,31 - 1883: 19,31 - 1898: 25,23 - 1899: 22,28 - 1900: 23,34 - 1901: 25,34 - 1902: 25,40 - 1903: 23,40 - 1917: 22,31 - 2552: 3,49 - 2556: 19,43 - 2569: 9,46 - 3119: 11,31 - - node: - color: '#00BEBE7F' - id: BrickTileWhiteInnerNw - decals: - 3256: -35,1 - - node: - color: '#4B709CFF' - id: BrickTileWhiteInnerNw - decals: - 481: -24,-37 - - node: - color: '#52B4E996' - id: BrickTileWhiteInnerNw - decals: - 745: -1,-39 - - node: - color: '#9FED58B3' - id: BrickTileWhiteInnerNw - decals: - 2595: -46,-31 - - node: - color: '#A4610696' - id: BrickTileWhiteInnerNw - decals: - 1025: -48,-5 - 1026: -48,-5 - - node: - color: '#BC863FFF' - id: BrickTileWhiteInnerNw - decals: - 3298: -53,3 - 3299: -55,3 - 3300: -56,3 - 3301: -57,3 - 3302: -58,3 - 3303: -58,2 - 3304: -58,1 - 3305: -58,0 - 3306: -58,-1 - 3307: -58,-8 - 3308: -58,-9 - 3309: -58,-10 - 3310: -58,-11 - 3311: -58,-12 - 3312: -58,-13 - 3313: -58,-14 - 3314: -58,-15 - 3402: -47,-5 - 3410: -47,-2 - 3419: -50,-2 - - node: - color: '#D381C996' - id: BrickTileWhiteInnerNw - decals: - 2136: 5,-45 - 2141: 5,-42 - 2142: 6,-42 - 2143: 7,-42 - 2144: 8,-42 - 2145: 9,-42 - 2146: 10,-42 - 2147: 11,-42 - 2148: 12,-42 - 2149: 13,-42 - 2150: 13,-41 - 2151: 13,-40 - 2152: 13,-38 - 2153: 13,-37 - 2154: 13,-36 - 2155: 13,-35 - 2156: 13,-34 - 2157: 14,-34 - 2158: 15,-34 + 2126: 3,-48 + 2129: 3,-45 + 2156: 17,-37 + 2157: 17,-36 + 2158: 17,-35 2159: 17,-34 - 2193: 6,-34 - 2194: 10,-34 - 2291: 9,-39 - 2330: -9,-55 - 2331: -9,-53 - 2332: -9,-52 - 2333: -9,-51 - 2334: -9,-50 - 2335: -9,-48 - 2336: -9,-47 - 2337: -9,-46 - 2338: -9,-44 - 2339: -9,-43 - 2340: -9,-42 - 2341: -8,-42 - 2342: -7,-42 - 2368: -3,-49 - 2369: -4,-49 - 2370: -5,-49 - 2371: -6,-49 - 2409: -1,-48 - 2924: 18,-43 - 2925: 19,-43 - 2926: 20,-43 - 2927: 21,-43 - 3021: 16,-42 + 2160: 15,-34 + 2161: 14,-34 + 2162: 13,-34 + 2170: 12,-42 + 2171: 11,-42 + 2172: 10,-42 + 2173: 9,-42 + 2174: 8,-42 + 2175: 7,-42 + 2176: 6,-42 + 2177: 5,-42 + 2185: 4,-34 + 2186: 8,-34 + 2187: 11,-40 + 2219: 8,-47 + 2220: 21,-44 + 2225: 13,-46 + 2234: 18,-45 + 2286: 5,-39 + 2339: -9,-42 + 2340: -8,-42 + 2341: -7,-42 + 2342: -7,-43 + 2348: -7,-46 + 2349: -7,-45 + 2352: -7,-49 + 2353: -6,-49 + 2354: -5,-49 + 2355: -5,-49 + 2356: -4,-49 + 2357: -3,-49 + 2358: -3,-50 + 2359: -3,-51 + 2360: -3,-52 + 2361: -3,-53 + 2362: -3,-54 + 2363: -3,-55 + 2913: 17,-42 + 2915: 17,-38 + 2916: 17,-39 + 2917: 17,-40 + 2918: 17,-43 + 2923: 20,-43 + 2924: 19,-43 + 2925: 18,-43 + 3015: 14,-42 + - node: + color: '#D4D4D428' + id: BrickTileWhiteInnerNe + decals: + 1371: 30,-3 + - node: + color: '#DE3A3A96' + id: BrickTileWhiteInnerNe + decals: + 1430: 52,-6 + 1431: 52,-7 + 1432: 53,-8 + 1433: 54,-8 + 1434: 54,-9 + 1435: 54,-14 + 1436: 54,-16 + 1437: 54,-18 + 1438: 54,-17 + 1440: 52,-8 + 1441: 54,-15 + 1442: 54,-13 + 1443: 50,-6 + 1444: 48,-6 + 1467: 47,-8 + 1468: 46,-8 + 1487: 40,-15 + 1488: 40,-14 + 1489: 40,-13 + 1490: 40,-12 + 1491: 39,-11 + 1492: 37,-11 + 1493: 36,-11 + 1494: 35,-11 + 1495: 34,-11 + 1496: 33,-11 + 1497: 31,-11 + 1498: 30,-11 + 1549: 42,-21 + 1550: 42,-20 + 1571: 52,-16 + 1572: 51,-16 + 1573: 49,-16 + 1574: 48,-16 + 1575: 47,-16 + 1587: 47,-15 + 1588: 47,-14 + 1589: 47,-13 + 1590: 47,-12 + 1591: 47,-11 + 1592: 47,-10 + 1617: 40,-24 + 1619: 42,-24 + 1636: 39,-25 + 1637: 42,-25 + 1638: 42,-26 + 1639: 42,-28 + 1640: 42,-29 + 1641: 42,-30 + 1671: 38,-35 + 1693: 38,-31 + 1694: 37,-31 + 1695: 36,-31 + 1696: 35,-31 + 1697: 34,-31 + 1698: 33,-31 + 1699: 32,-31 + 1700: 31,-31 + 1701: 30,-31 + 1711: 40,-32 + 1724: 44,-32 + 1725: 43,-32 + 1726: 42,-32 + 1727: 44,-33 + 1728: 44,-34 + 1729: 43,-35 + 1730: 43,-36 + 1739: 39,-37 + 1747: 43,-39 + 1748: 43,-40 + 1749: 43,-41 + 1750: 43,-42 + 1768: 40,-39 + 1771: 39,-39 + 1779: 37,-42 + 2778: 54,-10 + 2894: 40,-25 + 2900: 42,-23 + 2902: 42,-22 + 3548: 54,-19 + - node: + color: '#EFB34196' + id: BrickTileWhiteInnerNe + decals: + 1804: 6,38 + 1805: 5,38 + 1806: 4,38 + 1807: 8,38 + 1808: 8,37 + 1809: 8,36 + 1810: 8,35 + 1811: 8,34 + 1812: 8,31 + 1813: 8,30 + 1858: 5,31 + 1879: 19,31 + 1894: 25,23 + 1895: 22,28 + 1896: 23,34 + 1897: 25,34 + 1898: 25,40 + 1899: 23,40 + 1913: 22,31 + 2548: 3,49 + 2552: 19,43 + 2565: 9,46 + 3114: 11,31 + - node: + color: '#FFFFFFFF' + id: BrickTileWhiteInnerNe + decals: + 3688: -6,-29 + - node: + color: '#00BEBE7F' + id: BrickTileWhiteInnerNw + decals: + 3251: -35,1 + - node: + color: '#4B709CFF' + id: BrickTileWhiteInnerNw + decals: + 477: -24,-37 + - node: + color: '#52B4E996' + id: BrickTileWhiteInnerNw + decals: + 741: -1,-39 + - node: + color: '#9FED58B3' + id: BrickTileWhiteInnerNw + decals: + 2591: -46,-31 + - node: + color: '#A4610696' + id: BrickTileWhiteInnerNw + decals: + 1021: -48,-5 + 1022: -48,-5 + - node: + color: '#BC863FFF' + id: BrickTileWhiteInnerNw + decals: + 3293: -53,3 + 3294: -55,3 + 3295: -56,3 + 3296: -57,3 + 3297: -58,3 + 3298: -58,2 + 3299: -58,1 + 3300: -58,0 + 3301: -58,-1 + 3302: -58,-8 + 3303: -58,-9 + 3304: -58,-10 + 3305: -58,-11 + 3306: -58,-12 + 3307: -58,-13 + 3308: -58,-14 + 3309: -58,-15 + 3397: -47,-5 + 3405: -47,-2 + 3414: -50,-2 + - node: + color: '#D381C996' + id: BrickTileWhiteInnerNw + decals: + 2132: 5,-45 + 2137: 5,-42 + 2138: 6,-42 + 2139: 7,-42 + 2140: 8,-42 + 2141: 9,-42 + 2142: 10,-42 + 2143: 11,-42 + 2144: 12,-42 + 2145: 13,-42 + 2146: 13,-41 + 2147: 13,-40 + 2148: 13,-38 + 2149: 13,-37 + 2150: 13,-36 + 2151: 13,-35 + 2152: 13,-34 + 2153: 14,-34 + 2154: 15,-34 + 2155: 17,-34 + 2189: 6,-34 + 2190: 10,-34 + 2287: 9,-39 + 2326: -9,-55 + 2327: -9,-53 + 2328: -9,-52 + 2329: -9,-51 + 2330: -9,-50 + 2331: -9,-48 + 2332: -9,-47 + 2333: -9,-46 + 2334: -9,-44 + 2335: -9,-43 + 2336: -9,-42 + 2337: -8,-42 + 2338: -7,-42 + 2364: -3,-49 + 2365: -4,-49 + 2366: -5,-49 + 2367: -6,-49 + 2405: -1,-48 + 2919: 18,-43 + 2920: 19,-43 + 2921: 20,-43 + 2922: 21,-43 + 3016: 16,-42 - node: color: '#D4D4D428' id: BrickTileWhiteInnerNw decals: - 1376: 33,-3 + 1372: 33,-3 - node: color: '#DE3A3A96' id: BrickTileWhiteInnerNw decals: - 1449: 48,-6 - 1450: 48,-7 - 1451: 48,-8 - 1452: 47,-8 - 1453: 46,-8 - 1454: 46,-9 - 1455: 46,-10 - 1456: 46,-11 - 1457: 46,-12 - 1458: 46,-13 - 1459: 46,-14 - 1460: 46,-15 - 1469: 54,-8 - 1470: 53,-8 - 1473: 50,-6 - 1485: 52,-6 - 1503: 30,-11 - 1504: 30,-12 - 1505: 30,-13 - 1523: 39,-19 - 1526: 37,-18 - 1527: 37,-17 - 1528: 37,-16 - 1529: 37,-15 - 1530: 37,-14 - 1539: 31,-11 - 1540: 33,-11 - 1542: 34,-11 - 1543: 35,-11 - 1544: 36,-11 - 1545: 37,-11 - 1546: 39,-11 - 1580: 48,-16 - 1581: 49,-16 - 1582: 51,-16 - 1583: 52,-16 - 1584: 53,-15 - 1585: 53,-14 - 1586: 53,-13 - 1587: 53,-12 - 1588: 53,-11 - 1589: 53,-10 - 1590: 53,-16 - 1622: 42,-24 - 1624: 40,-24 - 1625: 40,-25 - 1626: 39,-25 - 1627: 39,-26 - 1628: 39,-27 - 1629: 39,-28 - 1630: 39,-29 - 1631: 40,-30 - 1673: 30,-34 - 1676: 40,-35 - 1688: 30,-35 - 1706: 30,-31 - 1707: 31,-31 - 1708: 32,-31 - 1709: 33,-31 - 1710: 34,-31 - 1711: 35,-31 - 1712: 36,-31 - 1713: 37,-31 - 1714: 38,-31 - 1716: 42,-32 - 1717: 43,-32 - 1718: 44,-32 - 1719: 40,-36 - 1720: 40,-37 - 1721: 39,-37 - 1762: 39,-42 - 1763: 39,-40 - 1764: 43,-39 - 1773: 40,-39 - 1774: 39,-39 - 2898: 42,-25 - 2903: 40,-23 - 2913: 40,-19 - 2914: 40,-20 + 1445: 48,-6 + 1446: 48,-7 + 1447: 48,-8 + 1448: 47,-8 + 1449: 46,-8 + 1450: 46,-9 + 1451: 46,-10 + 1452: 46,-11 + 1453: 46,-12 + 1454: 46,-13 + 1455: 46,-14 + 1456: 46,-15 + 1465: 54,-8 + 1466: 53,-8 + 1469: 50,-6 + 1481: 52,-6 + 1499: 30,-11 + 1500: 30,-12 + 1501: 30,-13 + 1519: 39,-19 + 1522: 37,-18 + 1523: 37,-17 + 1524: 37,-16 + 1525: 37,-15 + 1526: 37,-14 + 1535: 31,-11 + 1536: 33,-11 + 1538: 34,-11 + 1539: 35,-11 + 1540: 36,-11 + 1541: 37,-11 + 1542: 39,-11 + 1576: 48,-16 + 1577: 49,-16 + 1578: 51,-16 + 1579: 52,-16 + 1580: 53,-15 + 1581: 53,-14 + 1582: 53,-13 + 1583: 53,-12 + 1584: 53,-11 + 1585: 53,-10 + 1586: 53,-16 + 1618: 42,-24 + 1620: 40,-24 + 1621: 40,-25 + 1622: 39,-25 + 1623: 39,-26 + 1624: 39,-27 + 1625: 39,-28 + 1626: 39,-29 + 1627: 40,-30 + 1669: 30,-34 + 1672: 40,-35 + 1684: 30,-35 + 1702: 30,-31 + 1703: 31,-31 + 1704: 32,-31 + 1705: 33,-31 + 1706: 34,-31 + 1707: 35,-31 + 1708: 36,-31 + 1709: 37,-31 + 1710: 38,-31 + 1712: 42,-32 + 1713: 43,-32 + 1714: 44,-32 + 1715: 40,-36 + 1716: 40,-37 + 1717: 39,-37 + 1758: 39,-42 + 1759: 39,-40 + 1760: 43,-39 + 1769: 40,-39 + 1770: 39,-39 + 2893: 42,-25 + 2898: 40,-23 + 2908: 40,-19 + 2909: 40,-20 - node: color: '#EFB34196' id: BrickTileWhiteInnerNw decals: - 1829: 8,38 - 1830: 6,38 - 1831: 5,38 - 1832: 4,38 - 1833: 4,37 - 1834: 4,34 - 1835: 4,31 - 1836: 4,30 - 1863: 7,31 - 1884: 21,31 - 1904: 25,40 - 1905: 27,40 - 1906: 27,34 - 1907: 25,28 - 1908: 25,34 - 1918: 28,31 - 2553: 5,49 - 2558: 20,43 - 2570: 17,46 - 3120: 18,31 + 1825: 8,38 + 1826: 6,38 + 1827: 5,38 + 1828: 4,38 + 1829: 4,37 + 1830: 4,34 + 1831: 4,31 + 1832: 4,30 + 1859: 7,31 + 1880: 21,31 + 1900: 25,40 + 1901: 27,40 + 1902: 27,34 + 1903: 25,28 + 1904: 25,34 + 1914: 28,31 + 2549: 5,49 + 2554: 20,43 + 2566: 17,46 + 3115: 18,31 - node: color: '#334E6DC8' id: BrickTileWhiteInnerSe decals: - 1369: 33,-4 + 1365: 33,-4 - node: color: '#4B709CFF' id: BrickTileWhiteInnerSe decals: - 483: -27,-35 + 479: -27,-35 - node: color: '#52B4E996' id: BrickTileWhiteInnerSe decals: - 427: -18,-29 - 2441: 34,-38 + 423: -18,-29 + 2437: 34,-38 - node: - color: '#80C71FFF' + color: '#80C71F80' id: BrickTileWhiteInnerSe decals: - 1422: 53,-19 + 3542: 53,-19 - node: - color: '#8932B8FF' + color: '#8932B87F' id: BrickTileWhiteInnerSe decals: - 1423: 49,-19 + 3540: 49,-19 - node: color: '#9FED58B3' id: BrickTileWhiteInnerSe decals: - 2596: -48,-30 + 2592: -48,-30 - node: color: '#BC863FFF' id: BrickTileWhiteInnerSe decals: - 3315: -58,-15 - 3316: -57,-15 - 3317: -54,-15 - 3318: -53,-15 - 3319: -53,-13 - 3320: -53,-12 - 3321: -53,-11 - 3322: -53,-10 - 3323: -53,-9 - 3324: -53,-8 - 3325: -53,-7 - 3326: -53,-6 - 3327: -53,-4 - 3328: -53,-5 - 3329: -53,-3 - 3330: -53,-2 - 3331: -53,1 - 3332: -53,2 - 3333: -53,3 - 3349: -53,-15 + 3310: -58,-15 + 3311: -57,-15 + 3312: -54,-15 + 3313: -53,-15 + 3314: -53,-13 + 3315: -53,-12 + 3316: -53,-11 + 3317: -53,-10 + 3318: -53,-9 + 3319: -53,-8 + 3320: -53,-7 + 3321: -53,-6 + 3322: -53,-4 + 3323: -53,-5 + 3324: -53,-3 + 3325: -53,-2 + 3326: -53,1 + 3327: -53,2 + 3328: -53,3 + 3344: -53,-15 - node: color: '#D381C996' id: BrickTileWhiteInnerSe decals: - 2131: 3,-45 - 2132: 3,-42 - 2192: 11,-38 - 2195: 21,-42 - 2196: 17,-36 - 2197: 17,-35 - 2198: 17,-34 - 2199: 21,-44 - 2200: 20,-44 - 2201: 19,-44 - 2202: 18,-44 - 2203: 18,-45 - 2204: 17,-45 - 2205: 16,-45 - 2206: 15,-45 - 2207: 14,-45 - 2208: 13,-45 - 2209: 13,-46 - 2210: 12,-46 - 2211: 11,-46 - 2212: 10,-46 - 2213: 9,-46 - 2214: 8,-46 - 2215: 8,-47 - 2216: 5,-47 - 2217: 6,-47 - 2218: 7,-47 - 2292: 5,-35 - 2317: -3,-55 - 2318: -3,-54 - 2319: -3,-53 - 2320: -3,-52 - 2321: -3,-51 - 2322: -3,-50 - 2323: -3,-49 - 2324: -4,-55 - 2325: -5,-55 - 2326: -6,-55 - 2327: -7,-55 - 2328: -8,-55 - 2329: -9,-55 - 2347: -7,-43 - 2348: -7,-42 - 2349: -7,-45 - 2350: -7,-46 - 2351: -7,-48 - 2919: 17,-40 - 2931: 17,-42 - 2932: 17,-39 - 2933: 17,-38 - 2934: 17,-37 - 3022: 14,-39 + 2127: 3,-45 + 2128: 3,-42 + 2188: 11,-38 + 2191: 21,-42 + 2192: 17,-36 + 2193: 17,-35 + 2194: 17,-34 + 2195: 21,-44 + 2196: 20,-44 + 2197: 19,-44 + 2198: 18,-44 + 2199: 18,-45 + 2200: 17,-45 + 2201: 16,-45 + 2202: 15,-45 + 2203: 14,-45 + 2204: 13,-45 + 2205: 13,-46 + 2206: 12,-46 + 2207: 11,-46 + 2208: 10,-46 + 2209: 9,-46 + 2210: 8,-46 + 2211: 8,-47 + 2212: 5,-47 + 2213: 6,-47 + 2214: 7,-47 + 2288: 5,-35 + 2313: -3,-55 + 2314: -3,-54 + 2315: -3,-53 + 2316: -3,-52 + 2317: -3,-51 + 2318: -3,-50 + 2319: -3,-49 + 2320: -4,-55 + 2321: -5,-55 + 2322: -6,-55 + 2323: -7,-55 + 2324: -8,-55 + 2325: -9,-55 + 2343: -7,-43 + 2344: -7,-42 + 2345: -7,-45 + 2346: -7,-46 + 2347: -7,-48 + 2914: 17,-40 + 2926: 17,-42 + 2927: 17,-39 + 2928: 17,-38 + 2929: 17,-37 + 3017: 14,-39 - node: color: '#DE3A3A96' id: BrickTileWhiteInnerSe decals: - 1372: 31,-9 - 1461: 54,-8 - 1462: 54,-9 - 1463: 54,-13 - 1464: 54,-14 - 1465: 54,-15 - 1466: 54,-16 - 1467: 54,-17 - 1468: 54,-18 - 1520: 42,-21 - 1521: 42,-20 - 1522: 42,-19 - 1524: 38,-18 - 1525: 37,-18 - 1533: 34,-13 - 1534: 33,-13 - 1535: 32,-13 - 1536: 30,-13 - 1549: 40,-11 - 1550: 40,-12 - 1551: 40,-13 - 1552: 40,-14 - 1564: 47,-15 - 1565: 47,-14 - 1566: 47,-13 - 1567: 47,-12 - 1568: 47,-11 - 1569: 47,-10 - 1570: 47,-9 - 1571: 48,-9 - 1572: 49,-9 - 1599: 51,-9 - 1600: 52,-9 - 1638: 39,-29 - 1648: 40,-30 - 1649: 42,-30 - 1650: 42,-29 - 1651: 42,-28 - 1652: 42,-26 - 1653: 42,-25 - 1654: 42,-24 - 1671: 28,-31 - 1674: 38,-31 - 1677: 38,-35 - 1689: 30,-35 - 1690: 31,-35 - 1691: 32,-35 - 1692: 33,-35 - 1693: 34,-35 - 1694: 35,-35 - 1695: 36,-35 - 1696: 37,-35 - 1722: 43,-36 - 1723: 43,-35 - 1724: 43,-34 - 1725: 44,-34 - 1726: 44,-33 - 1727: 44,-32 - 1740: 40,-37 - 1741: 39,-37 - 1742: 42,-37 - 1755: 39,-42 - 1756: 40,-42 - 1757: 41,-42 - 1758: 43,-42 - 1759: 43,-41 - 1760: 43,-40 - 1761: 43,-39 - 1784: 37,-40 - 2784: 54,-12 - 2901: 40,-23 - 2904: 42,-23 - 2906: 42,-22 - 2912: 39,-18 + 1368: 31,-9 + 1457: 54,-8 + 1458: 54,-9 + 1459: 54,-13 + 1460: 54,-14 + 1461: 54,-15 + 1462: 54,-16 + 1463: 54,-17 + 1464: 54,-18 + 1516: 42,-21 + 1517: 42,-20 + 1518: 42,-19 + 1520: 38,-18 + 1521: 37,-18 + 1529: 34,-13 + 1530: 33,-13 + 1531: 32,-13 + 1532: 30,-13 + 1545: 40,-11 + 1546: 40,-12 + 1547: 40,-13 + 1548: 40,-14 + 1560: 47,-15 + 1561: 47,-14 + 1562: 47,-13 + 1563: 47,-12 + 1564: 47,-11 + 1565: 47,-10 + 1566: 47,-9 + 1567: 48,-9 + 1568: 49,-9 + 1595: 51,-9 + 1596: 52,-9 + 1634: 39,-29 + 1644: 40,-30 + 1645: 42,-30 + 1646: 42,-29 + 1647: 42,-28 + 1648: 42,-26 + 1649: 42,-25 + 1650: 42,-24 + 1667: 28,-31 + 1670: 38,-31 + 1673: 38,-35 + 1685: 30,-35 + 1686: 31,-35 + 1687: 32,-35 + 1688: 33,-35 + 1689: 34,-35 + 1690: 35,-35 + 1691: 36,-35 + 1692: 37,-35 + 1718: 43,-36 + 1719: 43,-35 + 1720: 43,-34 + 1721: 44,-34 + 1722: 44,-33 + 1723: 44,-32 + 1736: 40,-37 + 1737: 39,-37 + 1738: 42,-37 + 1751: 39,-42 + 1752: 40,-42 + 1753: 41,-42 + 1754: 43,-42 + 1755: 43,-41 + 1756: 43,-40 + 1757: 43,-39 + 1780: 37,-40 + 2779: 54,-12 + 2896: 40,-23 + 2899: 42,-23 + 2901: 42,-22 + 2907: 39,-18 + 3546: 52,-7 + 3547: 52,-6 - node: color: '#EFB34196' id: BrickTileWhiteInnerSe decals: - 1818: 8,30 - 1819: 7,30 - 1820: 6,30 - 1821: 5,30 - 1822: 4,30 - 1823: 8,31 - 1824: 8,34 - 1825: 8,35 - 1826: 8,36 - 1827: 8,37 - 1828: 8,38 - 1865: 5,37 - 1882: 19,34 - 1909: 22,30 - 1910: 23,36 - 1911: 25,36 - 1912: 25,25 - 1920: 22,33 - 2554: 3,51 - 2557: 19,42 - 2568: 10,45 - 2582: 32,42 - 2583: 25,42 - 2585: 23,42 - 3121: 11,33 + 1814: 8,30 + 1815: 7,30 + 1816: 6,30 + 1817: 5,30 + 1818: 4,30 + 1819: 8,31 + 1820: 8,34 + 1821: 8,35 + 1822: 8,36 + 1823: 8,37 + 1824: 8,38 + 1861: 5,37 + 1878: 19,34 + 1905: 22,30 + 1906: 23,36 + 1907: 25,36 + 1908: 25,25 + 1916: 22,33 + 2550: 3,51 + 2553: 19,42 + 2564: 10,45 + 2578: 32,42 + 2579: 25,42 + 2581: 23,42 + 3116: 11,33 - node: - color: '#F9801DFF' + color: '#F9801D7F' id: BrickTileWhiteInnerSe decals: - 1424: 45,-19 + 3545: 45,-19 + - node: + color: '#FFFFFFFF' + id: BrickTileWhiteInnerSe + decals: + 3687: -6,-26 - node: color: '#4B709CFF' id: BrickTileWhiteInnerSw decals: - 482: -24,-35 + 478: -24,-35 - node: color: '#52B4E996' id: BrickTileWhiteInnerSw decals: - 426: -20,-29 - 744: -1,-34 + 422: -20,-29 + 740: -1,-34 - node: - color: '#80C71FFF' + color: '#80C71F80' id: BrickTileWhiteInnerSw decals: - 1427: 53,-19 + 3543: 53,-19 - node: - color: '#8932B8FF' + color: '#8932B87F' id: BrickTileWhiteInnerSw decals: - 1426: 49,-19 + 3539: 49,-19 - node: color: '#9FED58B3' id: BrickTileWhiteInnerSw decals: - 2597: -46,-30 + 2593: -46,-30 - node: color: '#A4610696' id: BrickTileWhiteInnerSw decals: - 1027: -48,-2 - 1028: -48,-2 + 1023: -48,-2 + 1024: -48,-2 - node: color: '#BC863FFF' id: BrickTileWhiteInnerSw decals: - 3350: -53,-15 - 3351: -54,-15 - 3352: -57,-15 - 3353: -58,-15 - 3354: -58,-14 - 3355: -58,-13 - 3356: -58,-12 - 3357: -58,-11 - 3358: -58,-10 - 3359: -58,-9 - 3360: -58,-8 - 3361: -58,-7 - 3362: -58,0 - 3363: -58,1 - 3364: -58,2 - 3365: -58,3 - 3405: -47,2 - 3411: -47,-2 - 3418: -50,1 + 3345: -53,-15 + 3346: -54,-15 + 3347: -57,-15 + 3348: -58,-15 + 3349: -58,-14 + 3350: -58,-13 + 3351: -58,-12 + 3352: -58,-11 + 3353: -58,-10 + 3354: -58,-9 + 3355: -58,-8 + 3356: -58,-7 + 3357: -58,0 + 3358: -58,1 + 3359: -58,2 + 3360: -58,3 + 3400: -47,2 + 3406: -47,-2 + 3413: -50,1 - node: color: '#D381C996' id: BrickTileWhiteInnerSw decals: - 2134: 5,-42 - 2135: 5,-45 - 2167: 13,-34 - 2168: 13,-35 - 2169: 13,-36 - 2170: 13,-37 - 2171: 13,-38 - 2172: 13,-40 - 2173: 13,-41 - 2219: 6,-47 - 2220: 7,-47 - 2221: 8,-47 - 2222: 9,-46 - 2225: 10,-46 - 2226: 11,-46 - 2227: 12,-46 - 2228: 13,-46 - 2230: 14,-45 - 2231: 16,-45 - 2232: 15,-45 - 2233: 17,-45 - 2234: 18,-45 - 2235: 19,-44 - 2236: 20,-44 - 2237: 21,-44 - 2289: 9,-35 - 2298: -9,-48 - 2299: -5,-46 - 2300: -9,-47 - 2301: -9,-46 - 2302: -9,-44 - 2303: -9,-43 - 2304: -9,-42 - 2305: -9,-50 - 2306: -9,-51 - 2307: -9,-52 - 2308: -9,-53 - 2310: -9,-55 - 2311: -8,-55 - 2312: -7,-55 - 2313: -6,-55 - 2314: -5,-55 - 2315: -4,-55 - 2316: -3,-55 - 2405: -1,-42 - 3023: 16,-39 + 2130: 5,-42 + 2131: 5,-45 + 2163: 13,-34 + 2164: 13,-35 + 2165: 13,-36 + 2166: 13,-37 + 2167: 13,-38 + 2168: 13,-40 + 2169: 13,-41 + 2215: 6,-47 + 2216: 7,-47 + 2217: 8,-47 + 2218: 9,-46 + 2221: 10,-46 + 2222: 11,-46 + 2223: 12,-46 + 2224: 13,-46 + 2226: 14,-45 + 2227: 16,-45 + 2228: 15,-45 + 2229: 17,-45 + 2230: 18,-45 + 2231: 19,-44 + 2232: 20,-44 + 2233: 21,-44 + 2285: 9,-35 + 2294: -9,-48 + 2295: -5,-46 + 2296: -9,-47 + 2297: -9,-46 + 2298: -9,-44 + 2299: -9,-43 + 2300: -9,-42 + 2301: -9,-50 + 2302: -9,-51 + 2303: -9,-52 + 2304: -9,-53 + 2306: -9,-55 + 2307: -8,-55 + 2308: -7,-55 + 2309: -6,-55 + 2310: -5,-55 + 2311: -4,-55 + 2312: -3,-55 + 2401: -1,-42 + 3018: 16,-39 - node: color: '#DE3A3A96' id: BrickTileWhiteInnerSw decals: - 1371: 33,-9 - 1474: 48,-7 - 1475: 48,-6 - 1476: 46,-8 - 1477: 46,-9 - 1478: 46,-10 - 1479: 46,-11 - 1480: 46,-12 - 1481: 46,-13 - 1482: 46,-14 - 1506: 30,-13 - 1507: 32,-13 - 1508: 33,-13 - 1509: 34,-13 - 1510: 36,-13 - 1511: 37,-13 - 1512: 37,-14 - 1513: 37,-15 - 1514: 37,-16 - 1515: 37,-17 - 1516: 37,-18 - 1517: 38,-18 - 1518: 39,-18 - 1519: 39,-19 - 1537: 30,-12 - 1538: 30,-11 - 1555: 51,-9 - 1556: 52,-9 - 1557: 53,-9 - 1558: 53,-10 - 1559: 53,-11 - 1560: 53,-12 - 1561: 53,-13 - 1562: 53,-14 - 1563: 53,-15 - 1597: 48,-9 - 1598: 49,-9 - 1632: 40,-24 - 1633: 39,-25 - 1634: 39,-26 - 1635: 39,-27 - 1636: 39,-28 - 1637: 39,-29 - 1639: 40,-29 - 1646: 42,-30 - 1647: 40,-30 - 1672: 30,-31 - 1678: 38,-35 - 1679: 37,-35 - 1680: 36,-35 - 1681: 35,-35 - 1682: 34,-35 - 1683: 33,-35 - 1684: 32,-35 - 1685: 31,-35 - 1686: 30,-35 - 1687: 30,-34 - 1735: 44,-34 - 1736: 43,-37 - 1737: 42,-37 - 1738: 40,-37 - 1739: 39,-37 - 1744: 40,-35 - 1745: 40,-36 - 1746: 43,-42 - 1747: 41,-42 - 1748: 40,-42 - 1749: 39,-42 - 1750: 39,-40 - 1770: 42,-41 - 1776: 39,-39 - 2900: 42,-23 - 2902: 40,-23 - 2909: 40,-20 - 2910: 40,-19 - 2911: 40,-18 + 1367: 33,-9 + 1470: 48,-7 + 1471: 48,-6 + 1472: 46,-8 + 1473: 46,-9 + 1474: 46,-10 + 1475: 46,-11 + 1476: 46,-12 + 1477: 46,-13 + 1478: 46,-14 + 1502: 30,-13 + 1503: 32,-13 + 1504: 33,-13 + 1505: 34,-13 + 1506: 36,-13 + 1507: 37,-13 + 1508: 37,-14 + 1509: 37,-15 + 1510: 37,-16 + 1511: 37,-17 + 1512: 37,-18 + 1513: 38,-18 + 1514: 39,-18 + 1515: 39,-19 + 1533: 30,-12 + 1534: 30,-11 + 1551: 51,-9 + 1552: 52,-9 + 1553: 53,-9 + 1554: 53,-10 + 1555: 53,-11 + 1556: 53,-12 + 1557: 53,-13 + 1558: 53,-14 + 1559: 53,-15 + 1593: 48,-9 + 1594: 49,-9 + 1628: 40,-24 + 1629: 39,-25 + 1630: 39,-26 + 1631: 39,-27 + 1632: 39,-28 + 1633: 39,-29 + 1635: 40,-29 + 1642: 42,-30 + 1643: 40,-30 + 1668: 30,-31 + 1674: 38,-35 + 1675: 37,-35 + 1676: 36,-35 + 1677: 35,-35 + 1678: 34,-35 + 1679: 33,-35 + 1680: 32,-35 + 1681: 31,-35 + 1682: 30,-35 + 1683: 30,-34 + 1731: 44,-34 + 1732: 43,-37 + 1733: 42,-37 + 1734: 40,-37 + 1735: 39,-37 + 1740: 40,-35 + 1741: 40,-36 + 1742: 43,-42 + 1743: 41,-42 + 1744: 40,-42 + 1745: 39,-42 + 1746: 39,-40 + 1766: 42,-41 + 1772: 39,-39 + 2895: 42,-23 + 2897: 40,-23 + 2904: 40,-20 + 2905: 40,-19 + 2906: 40,-18 - node: color: '#EFB34196' id: BrickTileWhiteInnerSw decals: - 1841: 4,37 - 1842: 4,34 - 1843: 4,30 - 1844: 5,30 - 1845: 6,30 - 1846: 7,30 - 1847: 8,30 - 1848: 4,31 - 1849: 4,38 - 1864: 7,37 - 1872: 10,34 - 1881: 21,34 - 1913: 25,30 - 1914: 25,36 - 1915: 27,36 - 1916: 27,42 - 1919: 28,33 - 1934: 35,42 - 2555: 5,51 - 2559: 20,42 - 2584: 25,42 - 3122: 18,33 - 3191: 17,45 + 1837: 4,37 + 1838: 4,34 + 1839: 4,30 + 1840: 5,30 + 1841: 6,30 + 1842: 7,30 + 1843: 8,30 + 1844: 4,31 + 1845: 4,38 + 1860: 7,37 + 1868: 10,34 + 1877: 21,34 + 1909: 25,30 + 1910: 25,36 + 1911: 27,36 + 1912: 27,42 + 1915: 28,33 + 1930: 35,42 + 2551: 5,51 + 2555: 20,42 + 2580: 25,42 + 3117: 18,33 + 3186: 17,45 - node: - color: '#F9801DFF' + color: '#F9801D7F' id: BrickTileWhiteInnerSw decals: - 1425: 45,-19 + 3544: 45,-19 - node: color: '#00BEBE7F' id: BrickTileWhiteLineE decals: - 3214: -27,40 - 3215: -27,41 - 3216: -27,42 + 3209: -27,40 + 3210: -27,41 + 3211: -27,42 - node: color: '#334E6DC8' id: BrickTileWhiteLineE decals: - 1365: 33,-5 - 1366: 33,-7 - 1367: 33,-6 + 1361: 33,-5 + 1362: 33,-7 + 1363: 33,-6 - node: color: '#4B709CFF' id: BrickTileWhiteLineE decals: - 469: -24,-36 - 473: -27,-36 + 465: -24,-36 + 469: -27,-36 - node: color: '#52B4E996' id: BrickTileWhiteLineE decals: - 243: -5,-39 - 244: -5,-34 - 418: -18,-31 - 419: -18,-30 - 508: -25,-29 - 509: -25,-28 - 510: -25,-27 - 518: -29,-29 - 519: -29,-28 - 520: -29,-27 - 573: -24,-40 - 574: -24,-41 - 2428: 34,-39 - 2429: 34,-40 - 2430: 34,-41 - 2442: 28,-36 + 239: -5,-39 + 240: -5,-34 + 414: -18,-31 + 415: -18,-30 + 504: -25,-29 + 505: -25,-28 + 506: -25,-27 + 514: -29,-29 + 515: -29,-28 + 516: -29,-27 + 569: -24,-40 + 570: -24,-41 + 2424: 34,-39 + 2425: 34,-40 + 2426: 34,-41 + 2438: 28,-36 - node: color: '#765428FF' id: BrickTileWhiteLineE decals: - 3376: -53,-18 - 3377: -53,-19 - 3378: -53,-20 - 3379: -53,-21 - 3380: -53,-22 - 3381: -53,-23 - - node: - color: '#80C71FFF' - id: BrickTileWhiteLineE - decals: - 1420: 53,-20 - - node: - color: '#8932B8FF' - id: BrickTileWhiteLineE - decals: - 1419: 49,-20 + 3371: -53,-18 + 3372: -53,-19 + 3373: -53,-20 + 3374: -53,-21 + 3375: -53,-22 + 3376: -53,-23 - node: color: '#9FED58B3' id: BrickTileWhiteLineE decals: - 2599: -45,-31 - 2600: -45,-30 + 2595: -45,-31 + 2596: -45,-30 - node: color: '#BC863FFF' id: BrickTileWhiteLineE decals: - 3273: -53,-14 - 3274: -53,-1 - 3275: -53,0 - 3281: -49,2 - 3282: -49,1 - 3283: -49,0 - 3284: -49,-1 - 3285: -49,-2 - 3286: -49,-4 - 3413: -49,-3 + 3268: -53,-14 + 3269: -53,-1 + 3270: -53,0 + 3276: -49,2 + 3277: -49,1 + 3278: -49,0 + 3279: -49,-1 + 3280: -49,-2 + 3281: -49,-4 + 3408: -49,-3 - node: color: '#D381C996' id: BrickTileWhiteLineE decals: - 854: -11,-50 - 855: -11,-49 - 856: -11,-48 - 2126: 3,-43 - 2127: 3,-44 - 2128: 3,-46 - 2129: 3,-47 - 2183: 17,-41 - 2184: 21,-43 - 2185: 11,-39 - 2253: 12,-44 - 2254: 16,-43 - 2255: 16,-42 - 2256: 16,-41 - 2257: 16,-40 - 2258: 16,-39 - 2259: 16,-38 - 2260: 16,-37 - 2261: 16,-36 - 2283: 5,-38 - 2284: 5,-37 - 2285: 5,-36 - 2293: -7,-47 - 2295: -7,-44 - 2355: -11,-45 - 2399: -3,-47 - 2400: -3,-46 - 3016: 14,-41 - 3017: 14,-40 + 850: -11,-50 + 851: -11,-49 + 852: -11,-48 + 2122: 3,-43 + 2123: 3,-44 + 2124: 3,-46 + 2125: 3,-47 + 2179: 17,-41 + 2180: 21,-43 + 2181: 11,-39 + 2249: 12,-44 + 2250: 16,-43 + 2251: 16,-42 + 2252: 16,-41 + 2253: 16,-40 + 2254: 16,-39 + 2255: 16,-38 + 2256: 16,-37 + 2257: 16,-36 + 2279: 5,-38 + 2280: 5,-37 + 2281: 5,-36 + 2289: -7,-47 + 2291: -7,-44 + 2351: -11,-45 + 2395: -3,-47 + 2396: -3,-46 + 3011: 14,-41 + 3012: 14,-40 - node: color: '#DE3A3A96' id: BrickTileWhiteLineE decals: - 1655: 42,-27 - 1656: 43,-37 - 1659: 37,-41 - 1660: 38,-34 - 1661: 38,-33 - 1662: 38,-32 - 1668: 27,-27 - 1669: 28,-32 - 1670: 28,-33 + 1651: 42,-27 + 1652: 43,-37 + 1655: 37,-41 + 1656: 38,-34 + 1657: 38,-33 + 1658: 38,-32 + 1664: 27,-27 + 1665: 28,-32 + 1666: 28,-33 - node: color: '#EFB34196' id: BrickTileWhiteLineE decals: - 1806: 8,32 - 1807: 8,33 - 1850: 5,32 - 1851: 5,33 - 1852: 5,34 - 1853: 5,35 - 1854: 5,36 - 1868: 17,30 - 1877: 19,32 - 1878: 19,33 - 1931: 22,32 - 2565: 10,44 - 2566: 10,43 - 2567: 10,42 - 2571: 19,44 - 2572: 19,45 - 2573: 20,42 - 2574: 20,43 - 3110: 11,32 - 3137: 17,34 - 3162: -2,41 - 3163: -2,42 - 3177: 10,41 - 3182: 19,40 - 3183: 19,41 - - node: - color: '#F9801DFF' - id: BrickTileWhiteLineE - decals: - 1416: 45,-20 + 1802: 8,32 + 1803: 8,33 + 1846: 5,32 + 1847: 5,33 + 1848: 5,34 + 1849: 5,35 + 1850: 5,36 + 1864: 17,30 + 1873: 19,32 + 1874: 19,33 + 1927: 22,32 + 2561: 10,44 + 2562: 10,43 + 2563: 10,42 + 2567: 19,44 + 2568: 19,45 + 2569: 20,42 + 2570: 20,43 + 3105: 11,32 + 3132: 17,34 + 3157: -2,41 + 3158: -2,42 + 3172: 10,41 + 3177: 19,40 + 3178: 19,41 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineE decals: - 588: -30,-28 + 584: -30,-28 + 3689: -6,-28 + 3690: -6,-27 - node: color: '#00BEBE7F' id: BrickTileWhiteLineN decals: - 3217: -28,43 - 3218: -29,43 - 3219: -30,43 - 3220: -31,43 - 3221: -32,43 - 3222: -33,43 - 3248: -43,1 - 3249: -42,1 - 3250: -41,1 - 3251: -40,1 - 3252: -39,1 - 3253: -38,1 - 3254: -37,1 - 3255: -36,1 - 3259: -43,5 - 3260: -41,4 - 3261: -40,4 - 3262: -39,4 - 3263: -38,4 - 3264: -37,4 + 3212: -28,43 + 3213: -29,43 + 3214: -30,43 + 3215: -31,43 + 3216: -32,43 + 3217: -33,43 + 3243: -43,1 + 3244: -42,1 + 3245: -41,1 + 3246: -40,1 + 3247: -39,1 + 3248: -38,1 + 3249: -37,1 + 3250: -36,1 + 3254: -43,5 + 3255: -41,4 + 3256: -40,4 + 3257: -39,4 + 3258: -38,4 + 3259: -37,4 - node: color: '#169C9CFF' id: BrickTileWhiteLineN decals: - 413: -16,-30 + 409: -16,-30 - node: color: '#4B709CFF' id: BrickTileWhiteLineN decals: - 461: -26,-35 - 462: -25,-35 - 474: -26,-37 - 475: -26,-37 - 476: -25,-37 + 457: -26,-35 + 458: -25,-35 + 470: -26,-37 + 471: -26,-37 + 472: -25,-37 - node: color: '#52B4E996' id: BrickTileWhiteLineN decals: - 226: -8,-38 - 227: -7,-38 - 228: -6,-38 - 229: -9,-38 - 251: -8,-33 - 252: -7,-33 - 253: -6,-33 - 254: -9,-33 - 403: -17,-27 - 404: -21,-27 - 506: -26,-26 - 521: -30,-26 - 522: -31,-26 - 523: -32,-26 - 570: -27,-39 - 571: -26,-39 - 572: -25,-39 - 2418: 29,-37 - 2419: 30,-37 - 2420: 31,-37 - 2421: 32,-37 - 2422: 33,-37 - 2423: 34,-37 - 2424: 35,-37 - 2425: 36,-37 + 222: -8,-38 + 223: -7,-38 + 224: -6,-38 + 225: -9,-38 + 247: -8,-33 + 248: -7,-33 + 249: -6,-33 + 250: -9,-33 + 399: -17,-27 + 400: -21,-27 + 502: -26,-26 + 517: -30,-26 + 518: -31,-26 + 519: -32,-26 + 566: -27,-39 + 567: -26,-39 + 568: -25,-39 + 2414: 29,-37 + 2415: 30,-37 + 2416: 31,-37 + 2417: 32,-37 + 2418: 33,-37 + 2419: 34,-37 + 2420: 35,-37 + 2421: 36,-37 - node: color: '#765428FF' id: BrickTileWhiteLineN decals: - 3370: -55,-17 - 3371: -56,-17 - 3372: -57,-17 - 3373: -54,-17 + 3365: -55,-17 + 3366: -56,-17 + 3367: -57,-17 + 3368: -54,-17 - node: color: '#9FED58B3' id: BrickTileWhiteLineN decals: - 2587: -47,-31 - 2593: -47,-30 + 2583: -47,-31 + 2589: -47,-30 - node: color: '#BC863FFF' id: BrickTileWhiteLineN decals: - 3270: -54,3 - 3280: -50,3 + 3265: -54,3 + 3275: -50,3 - node: color: '#D381C996' id: BrickTileWhiteLineN decals: - 845: -13,-47 - 846: -12,-47 - 2186: 16,-34 - 2187: 9,-34 - 2188: 5,-34 - 2247: 7,-43 - 2248: 8,-43 - 2249: 9,-43 - 2250: 10,-43 - 2251: 11,-43 - 2252: 15,-35 - 2280: 6,-39 - 2281: 7,-39 - 2282: 8,-39 + 841: -13,-47 + 842: -12,-47 + 2182: 16,-34 + 2183: 9,-34 + 2184: 5,-34 + 2243: 7,-43 + 2244: 8,-43 + 2245: 9,-43 + 2246: 10,-43 + 2247: 11,-43 + 2248: 15,-35 + 2276: 6,-39 + 2277: 7,-39 + 2278: 8,-39 - node: color: '#D4D4D428' id: BrickTileWhiteLineN decals: - 1373: 31,-3 - 1374: 32,-3 + 1369: 31,-3 + 1370: 32,-3 - node: color: '#DE3A3A96' id: BrickTileWhiteLineN decals: - 1483: 49,-6 - 1484: 51,-6 - 1541: 32,-11 - 1547: 38,-11 - 1548: 40,-11 - 1574: 50,-16 - 1605: 50,-3 - 1619: 41,-32 - 1768: 41,-41 - 1771: 41,-39 - 1782: 41,-40 - 2897: 41,-25 + 1479: 49,-6 + 1480: 51,-6 + 1537: 32,-11 + 1543: 38,-11 + 1544: 40,-11 + 1570: 50,-16 + 1601: 50,-3 + 1615: 41,-32 + 1764: 41,-41 + 1767: 41,-39 + 1778: 41,-40 + 2892: 41,-25 - node: color: '#EFB34196' id: BrickTileWhiteLineN decals: - 1805: 7,38 - 1855: 6,31 - 1885: 23,28 - 1886: 24,28 - 1893: 24,40 - 1894: 26,40 - 1895: 24,34 - 1896: 26,34 - 1897: 26,23 - 1921: 23,31 - 1922: 24,31 - 1923: 25,31 - 1924: 26,31 - 1925: 27,31 - 3098: 17,31 - 3099: 16,31 - 3100: 15,31 - 3101: 14,31 - 3102: 13,31 - 3103: 12,31 - 3113: 12,33 - 3114: 13,33 - 3115: 14,33 - 3116: 15,33 - 3117: 16,33 - 3118: 17,33 - 3172: -6,43 - 3173: -5,43 - 3174: -4,43 - 3175: -3,43 + 1801: 7,38 + 1851: 6,31 + 1881: 23,28 + 1882: 24,28 + 1889: 24,40 + 1890: 26,40 + 1891: 24,34 + 1892: 26,34 + 1893: 26,23 + 1917: 23,31 + 1918: 24,31 + 1919: 25,31 + 1920: 26,31 + 1921: 27,31 + 3093: 17,31 + 3094: 16,31 + 3095: 15,31 + 3096: 14,31 + 3097: 13,31 + 3098: 12,31 + 3108: 12,33 + 3109: 13,33 + 3110: 14,33 + 3111: 15,33 + 3112: 16,33 + 3113: 17,33 + 3167: -6,43 + 3168: -5,43 + 3169: -4,43 + 3170: -3,43 - node: color: '#F38BAAFF' id: BrickTileWhiteLineN decals: - 410: -22,-30 + 406: -22,-30 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineN decals: - 587: -31,-27 + 583: -31,-27 + 3681: -5,-29 + 3682: -4,-29 + 3683: -3,-29 - node: color: '#00BEBE7F' id: BrickTileWhiteLineS decals: - 3208: -33,39 - 3209: -32,39 - 3210: -31,39 - 3211: -30,39 - 3212: -29,39 - 3213: -28,39 - 3241: -37,3 - 3242: -38,3 - 3243: -39,3 - 3244: -40,3 - 3245: -41,3 - 3246: -42,3 - 3247: -43,3 + 3203: -33,39 + 3204: -32,39 + 3205: -31,39 + 3206: -30,39 + 3207: -29,39 + 3208: -28,39 + 3236: -37,3 + 3237: -38,3 + 3238: -39,3 + 3239: -40,3 + 3240: -41,3 + 3241: -42,3 + 3242: -43,3 - node: color: '#169C9CFF' id: BrickTileWhiteLineS decals: - 412: -16,-30 + 408: -16,-30 - node: color: '#4B709CFF' id: BrickTileWhiteLineS decals: - 467: -26,-37 - 468: -25,-37 - 478: -25,-35 - 479: -25,-35 - 480: -26,-35 + 463: -26,-37 + 464: -25,-37 + 474: -25,-35 + 475: -25,-35 + 476: -26,-35 - node: color: '#52B4E996' id: BrickTileWhiteLineS decals: - 230: -9,-35 - 231: -8,-35 - 232: -8,-35 - 233: -7,-35 - 234: -6,-35 - 247: -9,-40 - 248: -8,-40 - 249: -7,-40 - 250: -6,-40 - 420: -17,-29 - 421: -16,-29 - 422: -15,-29 - 423: -21,-29 - 424: -22,-29 - 425: -23,-29 - 507: -26,-30 - 527: -32,-30 - 528: -31,-30 - 529: -30,-30 - 530: -30,-30 - 575: -25,-42 - 576: -26,-42 - 577: -27,-42 - 2426: 36,-38 - 2427: 35,-38 - 2431: 33,-42 - 2432: 32,-42 - 2433: 31,-42 - 2434: 30,-42 - 2435: 29,-42 - 2436: 28,-42 + 226: -9,-35 + 227: -8,-35 + 228: -8,-35 + 229: -7,-35 + 230: -6,-35 + 243: -9,-40 + 244: -8,-40 + 245: -7,-40 + 246: -6,-40 + 416: -17,-29 + 417: -16,-29 + 418: -15,-29 + 419: -21,-29 + 420: -22,-29 + 421: -23,-29 + 503: -26,-30 + 523: -32,-30 + 524: -31,-30 + 525: -30,-30 + 526: -30,-30 + 571: -25,-42 + 572: -26,-42 + 573: -27,-42 + 2422: 36,-38 + 2423: 35,-38 + 2427: 33,-42 + 2428: 32,-42 + 2429: 31,-42 + 2430: 30,-42 + 2431: 29,-42 + 2432: 28,-42 - node: color: '#765428FF' id: BrickTileWhiteLineS decals: - 3382: -54,-24 - 3383: -55,-24 - 3384: -56,-24 - 3385: -57,-24 + 3377: -54,-24 + 3378: -55,-24 + 3379: -56,-24 + 3380: -57,-24 - node: - color: '#80C71FFF' + color: '#80C71F7F' id: BrickTileWhiteLineS decals: - 1414: 52,-19 - 1415: 54,-19 - 1431: 51,-19 + 3528: 54,-19 + 3529: 52,-19 + 3530: 51,-19 - node: - color: '#8932B8FF' + color: '#8932B87F' id: BrickTileWhiteLineS decals: - 1412: 48,-19 - 1413: 50,-19 - 1432: 47,-19 + 3531: 50,-19 + 3532: 48,-19 + 3533: 47,-19 - node: color: '#9FED58B3' id: BrickTileWhiteLineS decals: - 2592: -47,-30 - 2594: -47,-31 + 2588: -47,-30 + 2590: -47,-31 - node: color: '#BC863FFF' id: BrickTileWhiteLineS decals: - 3271: -56,-15 - 3272: -55,-15 - 3289: -50,-5 + 3266: -56,-15 + 3267: -55,-15 + 3284: -50,-5 - node: color: '#D381C996' id: BrickTileWhiteLineS decals: - 857: -12,-51 - 858: -13,-51 - 2271: 7,-45 - 2272: 8,-45 - 2273: 9,-45 - 2274: 10,-45 - 2275: 11,-45 - 2276: 15,-44 - 2277: 6,-35 - 2278: 7,-35 - 2279: 8,-35 + 853: -12,-51 + 854: -13,-51 + 2267: 7,-45 + 2268: 8,-45 + 2269: 9,-45 + 2270: 10,-45 + 2271: 11,-45 + 2272: 15,-44 + 2273: 6,-35 + 2274: 7,-35 + 2275: 8,-35 - node: color: '#DE3A3A96' id: BrickTileWhiteLineS decals: - 1370: 32,-9 - 1531: 35,-13 - 1532: 31,-13 - 1573: 50,-9 - 1606: 50,-4 - 1620: 41,-30 - 1657: 41,-37 - 1769: 41,-41 - 2896: 41,-23 + 1366: 32,-9 + 1527: 35,-13 + 1528: 31,-13 + 1569: 50,-9 + 1602: 50,-4 + 1616: 41,-30 + 1653: 41,-37 + 1765: 41,-41 + 2891: 41,-23 - node: color: '#EFB34196' id: BrickTileWhiteLineS decals: - 1861: 6,37 - 1887: 23,30 - 1888: 24,30 - 1889: 26,25 - 1890: 26,36 - 1891: 24,36 - 1892: 26,42 - 1926: 23,33 - 1927: 24,33 - 1928: 25,33 - 1929: 26,33 - 1930: 27,33 - 1933: 34,42 - 2560: 15,45 - 2561: 14,45 - 2562: 13,45 - 2563: 12,45 - 2564: 11,45 - 2581: 33,42 - 2586: 24,42 - 3104: 12,33 - 3105: 13,33 - 3106: 14,33 - 3107: 15,33 - 3108: 16,33 - 3109: 17,33 - 3164: -3,40 - 3165: -4,40 - 3166: -5,40 - 3170: -6,40 - 3178: 9,40 - 3179: 8,40 - 3184: 18,39 - 3190: 16,45 + 1857: 6,37 + 1883: 23,30 + 1884: 24,30 + 1885: 26,25 + 1886: 26,36 + 1887: 24,36 + 1888: 26,42 + 1922: 23,33 + 1923: 24,33 + 1924: 25,33 + 1925: 26,33 + 1926: 27,33 + 1929: 34,42 + 2556: 15,45 + 2557: 14,45 + 2558: 13,45 + 2559: 12,45 + 2560: 11,45 + 2577: 33,42 + 2582: 24,42 + 3099: 12,33 + 3100: 13,33 + 3101: 14,33 + 3102: 15,33 + 3103: 16,33 + 3104: 17,33 + 3159: -3,40 + 3160: -4,40 + 3161: -5,40 + 3165: -6,40 + 3173: 9,40 + 3174: 8,40 + 3179: 18,39 + 3185: 16,45 - node: color: '#F38BAAFF' id: BrickTileWhiteLineS decals: - 411: -22,-30 + 407: -22,-30 - node: - color: '#F9801DFF' + color: '#F9801D7F' id: BrickTileWhiteLineS decals: - 1410: 44,-19 - 1411: 46,-19 - 1433: 43,-19 + 3534: 46,-19 + 3535: 44,-19 + 3536: 43,-19 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineS decals: - 589: -31,-29 + 585: -31,-29 + 3684: -5,-26 + 3685: -4,-26 + 3686: -3,-26 - node: color: '#00BEBE7F' id: BrickTileWhiteLineW decals: - 3223: -34,42 - 3224: -34,41 - 3225: -34,40 - 3258: -44,4 + 3218: -34,42 + 3219: -34,41 + 3220: -34,40 + 3253: -44,4 - node: color: '#334E6DC8' id: BrickTileWhiteLineW decals: - 612: 21,6 - 613: 21,7 - 616: 20,6 - 617: 20,7 - 3269: -44,-10 + 608: 21,6 + 609: 21,7 + 612: 20,6 + 613: 20,7 + 3264: -44,-10 - node: color: '#4B709CFF' id: BrickTileWhiteLineW decals: - 470: -27,-36 - 477: -24,-36 + 466: -27,-36 + 473: -24,-36 - node: color: '#52B4E996' id: BrickTileWhiteLineW decals: - 245: -10,-34 - 246: -10,-39 - 416: -20,-31 - 417: -20,-30 - 511: -27,-29 - 512: -27,-27 - 513: -27,-28 - 524: -33,-29 - 525: -33,-28 - 526: -33,-27 - 578: -28,-41 - 579: -28,-40 - 736: -2,-33 - 739: -2,-40 - 740: -1,-35 - 741: -1,-36 - 742: -1,-37 - 743: -1,-38 - 2410: 27,-41 - 2411: 27,-40 - 2412: 27,-39 - 2413: 27,-38 - 2414: 27,-37 - 2415: 27,-36 + 241: -10,-34 + 242: -10,-39 + 412: -20,-31 + 413: -20,-30 + 507: -27,-29 + 508: -27,-27 + 509: -27,-28 + 520: -33,-29 + 521: -33,-28 + 522: -33,-27 + 574: -28,-41 + 575: -28,-40 + 732: -2,-33 + 735: -2,-40 + 736: -1,-35 + 737: -1,-36 + 738: -1,-37 + 739: -1,-38 + 2406: 27,-41 + 2407: 27,-40 + 2408: 27,-39 + 2409: 27,-38 + 2410: 27,-37 + 2411: 27,-36 - node: color: '#765428FF' id: BrickTileWhiteLineW decals: - 3386: -58,-23 - 3387: -58,-22 - 3388: -58,-21 - - node: - color: '#80C71FFF' - id: BrickTileWhiteLineW - decals: - 1421: 53,-20 - - node: - color: '#8932B8FF' - id: BrickTileWhiteLineW - decals: - 1418: 49,-20 + 3381: -58,-23 + 3382: -58,-22 + 3383: -58,-21 - node: color: '#9FED58B3' id: BrickTileWhiteLineW decals: - 2601: -45,-31 - 2602: -45,-30 + 2597: -45,-31 + 2598: -45,-30 - node: color: '#BC863FFF' id: BrickTileWhiteLineW decals: - 3276: -51,-4 - 3277: -51,-3 - 3290: -47,-4 - 3291: -47,-3 - 3403: -47,0 - 3404: -47,1 - 3409: -47,-1 - 3412: -51,2 - 3416: -50,-1 - 3417: -50,0 + 3271: -51,-4 + 3272: -51,-3 + 3285: -47,-4 + 3286: -47,-3 + 3398: -47,0 + 3399: -47,1 + 3404: -47,-1 + 3407: -51,2 + 3411: -50,-1 + 3412: -50,0 - node: color: '#D381C996' id: BrickTileWhiteLineW decals: - 851: -14,-50 - 852: -14,-49 - 853: -14,-48 - 2137: 5,-43 - 2138: 5,-44 - 2139: 5,-46 - 2140: 5,-47 - 2182: 13,-39 - 2262: 6,-44 - 2263: 14,-43 - 2264: 14,-42 - 2265: 14,-41 - 2266: 14,-39 - 2267: 14,-40 - 2268: 14,-38 - 2269: 14,-37 - 2270: 14,-36 - 2286: 9,-38 - 2287: 9,-37 - 2288: 9,-36 - 2294: -5,-47 - 2297: -9,-49 - 2309: -9,-54 - 2354: -9,-45 - 2401: -1,-46 - 2402: -1,-45 - 2403: -1,-44 - 2404: -1,-43 - 2408: -1,-47 - 3018: 16,-41 - 3019: 16,-40 + 847: -14,-50 + 848: -14,-49 + 849: -14,-48 + 2133: 5,-43 + 2134: 5,-44 + 2135: 5,-46 + 2136: 5,-47 + 2178: 13,-39 + 2258: 6,-44 + 2259: 14,-43 + 2260: 14,-42 + 2261: 14,-41 + 2262: 14,-39 + 2263: 14,-40 + 2264: 14,-38 + 2265: 14,-37 + 2266: 14,-36 + 2282: 9,-38 + 2283: 9,-37 + 2284: 9,-36 + 2290: -5,-47 + 2293: -9,-49 + 2305: -9,-54 + 2350: -9,-45 + 2397: -1,-46 + 2398: -1,-45 + 2399: -1,-44 + 2400: -1,-43 + 2404: -1,-47 + 3013: 16,-41 + 3014: 16,-40 - node: color: '#DE3A3A96' id: BrickTileWhiteLineW decals: - 1658: 39,-41 - 1663: 40,-34 - 1664: 40,-33 - 1665: 40,-32 - 1666: 30,-33 - 1667: 30,-32 - 2915: 40,-22 - 2916: 40,-21 + 1654: 39,-41 + 1659: 40,-34 + 1660: 40,-33 + 1661: 40,-32 + 1662: 30,-33 + 1663: 30,-32 + 2910: 40,-22 + 2911: 40,-21 - node: color: '#EFB34196' id: BrickTileWhiteLineW decals: - 1837: 4,32 - 1838: 4,33 - 1839: 4,35 - 1840: 4,36 - 1856: 7,32 - 1857: 7,33 - 1858: 7,34 - 1859: 7,35 - 1860: 7,36 - 1869: 12,30 - 1870: 10,33 - 1871: 10,32 - 1879: 21,32 - 1880: 21,33 - 1932: 28,32 - 3111: 18,32 - 3112: 12,34 - 3167: -7,41 - 3168: -7,42 - 3185: 17,40 - 3186: 17,41 - 3187: 17,42 - 3188: 17,43 - 3189: 17,44 - - node: - color: '#F9801DFF' - id: BrickTileWhiteLineW - decals: - 1417: 45,-20 + 1833: 4,32 + 1834: 4,33 + 1835: 4,35 + 1836: 4,36 + 1852: 7,32 + 1853: 7,33 + 1854: 7,34 + 1855: 7,35 + 1856: 7,36 + 1865: 12,30 + 1866: 10,33 + 1867: 10,32 + 1875: 21,32 + 1876: 21,33 + 1928: 28,32 + 3106: 18,32 + 3107: 12,34 + 3162: -7,41 + 3163: -7,42 + 3180: 17,40 + 3181: 17,41 + 3182: 17,42 + 3183: 17,43 + 3184: 17,44 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineW decals: - 590: -32,-28 - 591: -32,-28 + 586: -32,-28 + 587: -32,-28 - node: color: '#FFFFFFFF' id: BushAOne decals: - 2704: -12.173578,-13.16537 + 2699: -12.173578,-13.16537 - node: color: '#FFFFFFFF' id: BushAThree decals: - 2661: 7.063609,-17.083809 - 2705: -12.954828,-13.13412 - 3037: -13.009358,7.995878 - 3042: -15.09027,11.031727 + 2656: 7.063609,-17.083809 + 2700: -12.954828,-13.13412 + 3032: -13.009358,7.995878 + 3037: -15.09027,11.031727 - node: color: '#FFFFFFFF' id: BushATwo decals: - 2706: -12.996495,-12.238287 - 2707: -6.0969057,-13.717453 + 2701: -12.996495,-12.238287 + 2702: -6.0969057,-13.717453 - node: color: '#FFFFFFFF' id: BushCOne decals: - 3030: -11.007082,13.412277 + 3025: -11.007082,13.412277 - node: color: '#FFFFFFFF' id: BushCThree decals: - 2655: 17.014423,-8.300894 - 2691: -4.785802,3.4705331 + 2650: 17.014423,-8.300894 + 2686: -4.785802,3.4705331 - node: color: '#FFFFFFFF' id: BushCTwo decals: - 2710: -5.148989,-12.144537 + 2705: -5.148989,-12.144537 - node: color: '#FFFFFFFF' id: BushDTwo decals: - 2647: 17.163681,15.561111 - 2648: 3.516313,17.119299 + 2642: 17.163681,15.561111 + 2643: 3.516313,17.119299 - node: color: '#FFFFFFFF' id: Busha1 decals: - 2649: 4.90173,16.900549 - 3034: -13.092692,9.881294 + 2644: 4.90173,16.900549 + 3029: -13.092692,9.881294 - node: color: '#FFFFFFFF' id: Busha2 decals: - 3039: -13.96527,9.885894 - 3041: -14.642353,10.979644 + 3034: -13.96527,9.885894 + 3036: -14.642353,10.979644 - node: color: '#FFFFFFFF' id: Bushb1 decals: - 3031: -10.975832,14.18311 - 3035: -13.092692,9.006294 + 3026: -10.975832,14.18311 + 3030: -13.092692,9.006294 - node: color: '#FFFFFFFF' id: Bushb2 decals: - 2703: -12.183994,-14.061203 - 3032: -10.996666,15.02686 + 2698: -12.183994,-14.061203 + 3027: -10.996666,15.02686 - node: color: '#FFFFFFFF' id: Bushb3 decals: - 3036: -13.009358,8.402128 - 3040: -14.017353,10.354644 + 3031: -13.009358,8.402128 + 3035: -14.017353,10.354644 - node: color: '#FFFFFFFF' id: Bushc1 decals: - 2708: -5.1698227,-12.957037 - 3038: -14.02777,11.062977 + 2703: -5.1698227,-12.957037 + 3033: -14.02777,11.062977 - node: color: '#FFFFFFFF' id: Bushc3 decals: - 2646: 17.194931,12.9986105 - 2709: -8.055239,-11.332037 - 3033: -11.044625,12.930744 + 2641: 17.194931,12.9986105 + 2704: -8.055239,-11.332037 + 3028: -11.044625,12.930744 - node: color: '#FFFFFFFF' id: Bushe1 decals: - 2637: 6.2998166,3.7755318 - 2652: 17.076923,-7.467561 - 2653: 16.566507,-7.988394 - 2659: 7.2406926,-16.500475 - 2674: 3.5204434,-9.447139 - 2675: 3.2912767,-9.686723 - 2711: -8.044823,-11.092453 + 2632: 6.2998166,3.7755318 + 2647: 17.076923,-7.467561 + 2648: 16.566507,-7.988394 + 2654: 7.2406926,-16.500475 + 2669: 3.5204434,-9.447139 + 2670: 3.2912767,-9.686723 + 2706: -8.044823,-11.092453 - node: color: '#FFFFFFFF' id: Bushe2 decals: - 2638: 6.6984973,3.4174294 - 2654: 17.014423,-8.030061 - 2668: 7.441076,6.766222 - 3028: -17.569584,14.99561 - 3051: -4.0134697,4.9046235 + 2633: 6.6984973,3.4174294 + 2649: 17.014423,-8.030061 + 2663: 7.441076,6.766222 + 3023: -17.569584,14.99561 + 3046: -4.0134697,4.9046235 + 3613: 63.771957,-1.9947927 + 3619: 64.23029,-2.0052094 - node: color: '#FFFFFFFF' id: Bushe3 decals: - 2660: 6.6990256,-16.510893 - 3432: 58.245747,-2.973395 - 3433: 57.818665,-3.0463119 - 3434: 58.308247,-2.1817284 + 2655: 6.6990256,-16.510893 + 3427: 58.245747,-2.973395 + 3428: 57.818665,-3.0463119 + 3429: 58.308247,-2.1817284 + 3612: 64.15737,-0.19270933 - node: color: '#FFFFFFFF' id: Bushe4 decals: - 1315: 57.84424,1.1426643 - 1316: 58.21924,0.9864143 - 1317: 57.885906,-2.0552526 - 1318: 58.15674,-1.5865024 - 1319: 57.90674,0.18433094 - 2685: 6.6556993,14.650438 - 2692: -4.7441354,3.6892834 - 2717: -12.329075,-5.2076516 - 2718: -11.683241,-5.540985 - 3052: -4.2530527,4.29004 + 1311: 57.84424,1.1426643 + 1312: 58.21924,0.9864143 + 1313: 57.885906,-2.0552526 + 1314: 58.15674,-1.5865024 + 1315: 57.90674,0.18433094 + 2680: 6.6556993,14.650438 + 2687: -4.7441354,3.6892834 + 2712: -12.329075,-5.2076516 + 2713: -11.683241,-5.540985 + 3047: -4.2530527,4.29004 + 3611: 63.792793,0.09895742 - node: color: '#FFFFFFFF' id: Bushf1 decals: - 1322: 58.167156,-0.24275243 - 3065: -4.922404,-3.8768375 + 1318: 58.167156,-0.24275243 + 3060: -4.922404,-3.8768375 - node: color: '#FFFFFFFF' id: Bushf2 decals: - 1323: 57.833824,-0.37816906 - 3067: -4.4328203,-4.7726707 - 3068: -4.3255215,-5.3247385 + 1319: 57.833824,-0.37816906 + 3062: -4.4328203,-4.7726707 + 3063: -4.3255215,-5.3247385 - node: color: '#FFFFFFFF' id: Bushf3 decals: - 3027: -17.132084,16.266443 - 3066: -4.3703203,-4.199754 - 3431: 57.943665,-2.723395 + 3022: -17.132084,16.266443 + 3061: -4.3703203,-4.199754 + 3426: 57.943665,-2.723395 - node: color: '#FFFFFFFF' id: Bushg1 decals: - 2656: 17.14984,-5.092561 - 2662: 8.53236,-17.187975 - 2696: 3.404969,-4.7533755 - 3043: -9.359586,2.9312673 + 2651: 17.14984,-5.092561 + 2657: 8.53236,-17.187975 + 2691: 3.404969,-4.7533755 + 3038: -9.359586,2.9312673 - node: color: '#FFFFFFFF' id: Bushg2 decals: - 2697: 4.175802,-4.0346255 - 3029: -16.8925,15.828943 + 2692: 4.175802,-4.0346255 + 3024: -16.8925,15.828943 - node: color: '#FFFFFFFF' id: Bushg3 decals: - 2615: -2.1416075,5.8916445 - 2616: -2.162441,14.072103 - 2617: 14.210857,2.3523626 - 2618: 17.866562,15.155413 - 2619: 18.231146,11.999163 - 2620: 3.059716,-17.07088 - 2621: -4.1298733,-14.029394 - 2622: -2.3702574,-5.9809127 - 2623: -8.961391,-10.053829 - 2624: -17.146135,-6.1901164 + 2611: -2.1416075,5.8916445 + 2612: -2.162441,14.072103 + 2613: 17.866562,15.155413 + 2614: 18.231146,11.999163 + 2615: 3.059716,-17.07088 + 2616: -4.1298733,-14.029394 + 2617: -2.3702574,-5.9809127 + 2618: -8.961391,-10.053829 + 2619: -17.146135,-6.1901164 - node: color: '#FFFFFFFF' id: Bushg4 decals: - 2657: 17.160257,-5.6342273 - 2686: 7.2077823,13.712938 + 2652: 17.160257,-5.6342273 + 2681: 7.2077823,13.712938 - node: color: '#FFFFFFFF' id: Bushh1 decals: - 2634: 5.9211392,3.1419072 - 2639: 8.507914,15.796663 - 2640: 9.528748,15.46333 - 3050: -3.4732609,5.2424126 + 2629: 5.9211392,3.1419072 + 2634: 8.507914,15.796663 + 2635: 9.528748,15.46333 + 3045: -3.4732609,5.2424126 - node: color: '#FFFFFFFF' id: Bushh2 decals: - 2635: 5.087806,3.9127407 - 2641: 8.528747,14.473747 - 2719: -13.162408,-5.0826516 - 2720: -14.037408,-5.988902 + 2630: 5.087806,3.9127407 + 2636: 8.528747,14.473747 + 2714: -13.162408,-5.0826516 + 2715: -14.037408,-5.988902 - node: color: '#FFFFFFFF' id: Bushh3 decals: - 2636: 7.181556,4.0273237 - 2645: 17.465765,12.071527 - 2721: -13.756159,-5.822237 - 2722: -13.901991,-8.228487 - 3047: -9.230458,4.9216795 + 2631: 7.181556,4.0273237 + 2640: 17.465765,12.071527 + 2716: -13.756159,-5.822237 + 2717: -13.901991,-8.228487 + 3042: -9.230458,4.9216795 - node: color: '#FFFFFFFF' id: Bushi1 decals: - 2625: -17.677385,-15.149096 - 2626: -6.0205603,-17.117607 - 2627: -9.970078,-14.052947 - 2628: -9.887934,2.4137444 - 2629: -18.05108,15.0529785 - 2658: 6.2927756,-17.073393 - 2669: 15.850491,-4.61609 - 2671: 9.772904,-4.483665 - 2683: 13.70388,8.66825 - 2684: 7.1036158,14.358771 - 2687: -5.465275,9.849015 - 2688: -6.746525,10.213598 - 2701: 3.4466357,-5.461709 - 2736: -20.130556,-17.838984 - 2737: -16.849306,-19.984818 - 2738: -17.307638,-19.6619 - 2739: -19.265972,-20.13065 - 3055: -14.051299,-2.1793242 - 3058: -17.143507,-2.1316965 - 3059: -14.734559,-9.289597 - 3061: -14.390809,-9.633347 - 3062: -10.377625,-9.233512 - 3070: -3.5338547,-5.210155 - 3071: -4.8467765,-14.670914 - 3427: -2.6337829,9.646117 + 2620: -17.677385,-15.149096 + 2621: -6.0205603,-17.117607 + 2622: -9.970078,-14.052947 + 2623: -9.887934,2.4137444 + 2624: -18.05108,15.0529785 + 2653: 6.2927756,-17.073393 + 2664: 15.850491,-4.61609 + 2666: 9.772904,-4.483665 + 2678: 13.70388,8.66825 + 2679: 7.1036158,14.358771 + 2682: -5.465275,9.849015 + 2683: -6.746525,10.213598 + 2696: 3.4466357,-5.461709 + 2731: -20.130556,-17.838984 + 2732: -16.849306,-19.984818 + 2733: -17.307638,-19.6619 + 2734: -19.265972,-20.13065 + 3050: -14.051299,-2.1793242 + 3053: -17.143507,-2.1316965 + 3054: -14.734559,-9.289597 + 3056: -14.390809,-9.633347 + 3057: -10.377625,-9.233512 + 3065: -3.5338547,-5.210155 + 3066: -4.8467765,-14.670914 + 3422: -2.6337829,9.646117 - node: color: '#FFFFFFFF' id: Bushi2 decals: - 2630: -17.025719,17.03245 - 2631: 18.117056,13.867498 - 2676: 3.580893,-8.535644 - 2677: 8.918044,-3.98356 - 2678: 15.266736,-5.8692675 - 2679: 16.209822,-5.8538113 - 2680: 7.318463,5.66825 - 2681: 6.4642963,5.85575 - 2682: 14.620547,8.230751 - 2693: 6.318049,2.225238 - 2712: -8.044823,-13.97787 - 2713: -8.878156,-13.144537 - 2714: -5.867739,-11.154953 - 2715: -13.026991,-9.009735 - 2716: -11.860325,-5.124318 - 2740: -16.859722,-18.94315 - 3044: -8.75542,2.9208503 - 3049: -13.95071,2.256745 - 3056: -14.165881,-2.439741 - 3060: -14.713725,-9.602097 - 3063: -9.76849,-14.395954 - 3072: -4.450943,-14.608414 - 3428: -2.8004496,9.333617 + 2625: -17.025719,17.03245 + 2626: 18.117056,13.867498 + 2671: 3.580893,-8.535644 + 2672: 8.918044,-3.98356 + 2673: 15.266736,-5.8692675 + 2674: 16.209822,-5.8538113 + 2675: 7.318463,5.66825 + 2676: 6.4642963,5.85575 + 2677: 14.620547,8.230751 + 2688: 6.318049,2.225238 + 2707: -8.044823,-13.97787 + 2708: -8.878156,-13.144537 + 2709: -5.867739,-11.154953 + 2710: -13.026991,-9.009735 + 2711: -11.860325,-5.124318 + 2735: -16.859722,-18.94315 + 3039: -8.75542,2.9208503 + 3044: -13.95071,2.256745 + 3051: -14.165881,-2.439741 + 3055: -14.713725,-9.602097 + 3058: -9.76849,-14.395954 + 3067: -4.450943,-14.608414 + 3423: -2.8004496,9.333617 - node: color: '#FFFFFFFF' id: Bushi3 decals: - 2632: 17.117056,10.211248 - 2633: 9.26489,2.9960737 - 2663: 14.499886,6.958212 - 2664: 13.541552,7.447795 - 2665: 6.0254874,14.498462 - 2670: 16.579659,-3.9598398 - 2694: 7.224299,2.3710713 - 2695: 4.0082765,6.5204124 - 2702: 5.713353,-3.1926599 - 3026: -14.413333,18.172693 - 3046: -9.557503,5.8271008 - 3048: -14.0402975,2.506745 - 3429: -2.8212829,8.989867 + 2627: 17.117056,10.211248 + 2628: 9.26489,2.9960737 + 2658: 14.499886,6.958212 + 2659: 13.541552,7.447795 + 2660: 6.0254874,14.498462 + 2665: 16.579659,-3.9598398 + 2689: 7.224299,2.3710713 + 2690: 4.0082765,6.5204124 + 2697: 5.713353,-3.1926599 + 3021: -14.413333,18.172693 + 3041: -9.557503,5.8271008 + 3043: -14.0402975,2.506745 + 3424: -2.8212829,8.989867 - node: color: '#FFFFFFFF' id: Bushi4 decals: - 2603: -15.13607,-18.199955 - 2604: -18.14605,-11.80234 - 2605: -13.963279,-4.177868 - 2606: -5.8667884,-5.4799514 - 2607: 8.061129,-4.427868 - 2608: 15.901968,-2.2820346 - 2609: 17.151968,2.9988291 - 2610: 9.610178,17.11985 - 2611: 4.0546904,17.078184 - 2612: 3.480264,5.210905 - 2613: -15.017622,18.057854 - 2614: -5.5270247,2.9853945 - 2650: 5.777904,17.049623 - 2651: 9.139725,14.0701685 - 2666: 6.567154,13.456795 - 2667: 6.441076,6.7870555 - 2672: 9.397904,-5.046165 - 2673: 4.3850265,-9.488806 - 2689: -6.2881913,9.494848 - 2690: -5.402775,10.869849 - 2698: 3.8528857,-4.5242085 - 2723: -11.037408,-8.100949 - 3053: -3.7009702,4.4983735 - 3054: -5.697132,-3.1168242 - 3064: -9.425084,-14.560988 - 3069: -3.5442712,-4.7830715 + 2599: -15.13607,-18.199955 + 2600: -18.14605,-11.80234 + 2601: -13.963279,-4.177868 + 2602: -5.8667884,-5.4799514 + 2603: 8.061129,-4.427868 + 2604: 15.901968,-2.2820346 + 2605: 17.151968,2.9988291 + 2606: 9.610178,17.11985 + 2607: 4.0546904,17.078184 + 2608: 3.480264,5.210905 + 2609: -15.017622,18.057854 + 2610: -5.5270247,2.9853945 + 2645: 5.777904,17.049623 + 2646: 9.139725,14.0701685 + 2661: 6.567154,13.456795 + 2662: 6.441076,6.7870555 + 2667: 9.397904,-5.046165 + 2668: 4.3850265,-9.488806 + 2684: -6.2881913,9.494848 + 2685: -5.402775,10.869849 + 2693: 3.8528857,-4.5242085 + 2718: -11.037408,-8.100949 + 3048: -3.7009702,4.4983735 + 3049: -5.697132,-3.1168242 + 3059: -9.425084,-14.560988 + 3064: -3.5442712,-4.7830715 - node: color: '#FFFFFFFF' id: Bushj1 decals: - 2642: 8.789164,15.109163 - 2728: -19.824345,-10.10782 - 2729: -20.11601,-9.63907 - 2731: -20.011845,-8.243237 - 2732: -18.730595,-8.79532 - 2733: -18.873224,-10.013859 - 2734: -19.654474,-7.0659423 - 3445: -18.860361,-7.807997 + 2637: 8.789164,15.109163 + 2723: -19.824345,-10.10782 + 2724: -20.11601,-9.63907 + 2726: -20.011845,-8.243237 + 2727: -18.730595,-8.79532 + 2728: -18.873224,-10.013859 + 2729: -19.654474,-7.0659423 + 3440: -18.860361,-7.807997 - node: color: '#FFFFFFFF' id: Bushj2 decals: - 2730: -18.793095,-6.868236 - 2735: -19.94614,-7.7117753 - 3443: -20.016611,-7.2975807 - 3444: -18.902029,-9.370498 - 3446: -19.318695,-8.485081 + 2725: -18.793095,-6.868236 + 2730: -19.94614,-7.7117753 + 3438: -20.016611,-7.2975807 + 3439: -18.902029,-9.370498 + 3441: -19.318695,-8.485081 - node: color: '#FFFFFFFF' id: Bushj3 decals: - 3430: -4.6337833,10.114867 + 3425: -4.6337833,10.114867 - node: color: '#FFFFFFFF' id: Bushk1 decals: - 2700: 3.0091357,-5.795042 - 3045: -10.00542,5.191684 + 2695: 3.0091357,-5.795042 + 3040: -10.00542,5.191684 - node: color: '#FFFFFFFF' id: Bushk3 decals: - 2643: 15.903748,17.02583 - 2644: 18.067644,12.942497 - 2699: 4.8112187,-3.7846253 + 2638: 15.903748,17.02583 + 2639: 18.067644,12.942497 + 2694: 4.8112187,-3.7846253 + - node: + color: '#FFFFFFFF' + id: Bushm1 + decals: + 3615: 63.81363,-0.83854264 + - node: + color: '#FFFFFFFF' + id: Bushm3 + decals: + 3617: 64.29279,-0.73437595 - node: color: '#FFFFFFFF' id: Bushm4 decals: - 2724: -10.9586735,-6.0094166 - 2725: -11.224603,-5.736016 - 2726: -13.307937,-8.381849 - 2727: -14.067469,-7.593817 + 2719: -10.9586735,-6.0094166 + 2720: -11.224603,-5.736016 + 2721: -13.307937,-8.381849 + 2722: -14.067469,-7.593817 + 3618: 64.12612,-1.2864593 - node: color: '#FFFFFFFF' id: Bushn1 decals: - 1320: 58.021324,0.5489143 - 1321: 57.96924,-1.1594192 - 3435: 57.99387,-2.411529 + 1316: 58.021324,0.5489143 + 1317: 57.96924,-1.1594192 + 3430: 57.99387,-2.411529 - node: color: '#52B4E996' id: CheckerNWSE decals: - 3008: -19,-27 - 3009: -16,-27 - 3010: -22,-27 + 3003: -19,-27 + 3004: -16,-27 + 3005: -22,-27 - node: color: '#FFFFFFFF' id: ConcreteTrimCornerNe @@ -3153,21 +3174,33 @@ entities: decals: 30: -2,-2 31: -2,-2 + 3479: 2,4 + 3480: 3,3 + 3481: 4,2 - node: color: '#FFFFFFFF' id: ConcreteTrimInnerNw decals: 33: 2,-2 + 3476: -4,2 + 3477: -3,3 + 3478: -2,4 - node: color: '#FFFFFFFF' id: ConcreteTrimInnerSe decals: 29: -2,2 + 3473: 2,-4 + 3474: 3,-3 + 3475: 4,-2 - node: color: '#FFFFFFFF' id: ConcreteTrimInnerSw decals: 32: 2,2 + 3470: -2,-4 + 3471: -3,-3 + 3472: -4,-2 - node: color: '#FFFFFFFF' id: ConcreteTrimLineE @@ -3180,27 +3213,27 @@ entities: 27: -2,0 28: -2,-1 42: 1,0 - 83: -2,-17 - 84: -2,-16 - 85: -2,-14 - 86: -2,-13 - 87: -2,-12 - 88: -2,-11 - 89: -2,-10 - 90: -2,-8 - 91: -2,-7 - 92: -2,-6 - 112: -2,6 - 113: -2,7 - 114: -2,8 - 115: -2,10 - 116: -2,11 - 117: -2,11 - 118: -2,12 - 119: -2,13 - 120: -2,14 - 121: -2,16 - 122: -2,17 + 79: -2,-17 + 80: -2,-16 + 81: -2,-14 + 82: -2,-13 + 83: -2,-12 + 84: -2,-11 + 85: -2,-10 + 86: -2,-8 + 87: -2,-7 + 88: -2,-6 + 108: -2,6 + 109: -2,7 + 110: -2,8 + 111: -2,10 + 112: -2,11 + 113: -2,11 + 114: -2,12 + 115: -2,13 + 116: -2,14 + 117: -2,16 + 118: -2,17 - node: color: '#FFFFFFFF' id: ConcreteTrimLineN @@ -3212,26 +3245,26 @@ entities: 18: 0,-2 19: 1,-2 39: 0,1 - 63: 17,-2 - 64: 16,-2 - 65: 14,-2 - 66: 13,-2 - 67: 12,-2 - 68: 11,-2 - 69: 10,-2 - 70: 8,-2 - 71: 7,-2 - 72: 6,-2 - 93: -6,-2 - 94: -7,-2 - 95: -8,-2 - 96: -10,-2 - 97: -11,-2 - 98: -12,-2 - 99: -13,-2 - 100: -16,-2 - 101: -17,-2 - 3057: -14,-2 + 59: 17,-2 + 60: 16,-2 + 61: 14,-2 + 62: 13,-2 + 63: 12,-2 + 64: 11,-2 + 65: 10,-2 + 66: 8,-2 + 67: 7,-2 + 68: 6,-2 + 89: -6,-2 + 90: -7,-2 + 91: -8,-2 + 92: -10,-2 + 93: -11,-2 + 94: -12,-2 + 95: -13,-2 + 96: -16,-2 + 97: -17,-2 + 3052: -14,-2 - node: color: '#FFFFFFFF' id: ConcreteTrimLineS @@ -3244,26 +3277,26 @@ entities: 25: -1,2 34: 0,-1 41: 0,-1 - 53: 6,2 - 54: 7,2 - 55: 8,2 - 56: 10,2 - 57: 11,2 - 58: 12,2 - 59: 13,2 - 60: 14,2 - 61: 16,2 - 62: 17,2 - 102: -17,2 - 103: -16,2 - 104: -14,2 - 105: -13,2 - 106: -12,2 - 107: -11,2 - 108: -10,2 - 109: -8,2 - 110: -7,2 - 111: -6,2 + 51: 6,2 + 52: 7,2 + 53: 8,2 + 54: 10,2 + 55: 12,2 + 56: 13,2 + 57: 16,2 + 58: 17,2 + 98: -17,2 + 99: -16,2 + 100: -14,2 + 101: -13,2 + 102: -12,2 + 103: -11,2 + 104: -10,2 + 105: -8,2 + 106: -7,2 + 107: -6,2 + 3448: 11,2 + 3449: 14,2 - node: color: '#FFFFFFFF' id: ConcreteTrimLineW @@ -3278,2506 +3311,2566 @@ entities: 43: 2,6 44: 2,7 45: 2,8 - 46: 2,10 - 47: 2,11 - 48: 2,12 - 49: 2,13 - 50: 2,14 - 51: 2,16 - 52: 2,17 - 73: 2,-6 - 74: 2,-7 - 75: 2,-8 - 76: 2,-10 - 77: 2,-11 - 78: 2,-12 - 79: 2,-13 - 80: 2,-14 - 81: 2,-16 - 82: 2,-17 + 46: 2,11 + 47: 2,12 + 48: 2,14 + 49: 2,16 + 50: 2,17 + 69: 2,-6 + 70: 2,-7 + 71: 2,-8 + 72: 2,-10 + 73: 2,-11 + 74: 2,-12 + 75: 2,-13 + 76: 2,-14 + 77: 2,-16 + 78: 2,-17 + 3454: 2,10 + 3455: 2,13 - node: color: '#FFFFFFFF' id: Delivery decals: - 1787: 50,-39 - 1788: 50,-38 - 1789: 50,-37 - 1790: 50,-36 + 1783: 50,-39 + 1784: 50,-38 + 1785: 50,-37 + 1786: 50,-36 - node: color: '#D381C996' id: DiagonalOverlay decals: - 2296: -10,-49 - 2372: -10,-45 - 3438: 4,-47 - 3439: 4,-46 - 3440: -2,-47 - 3441: -6,-47 + 2292: -10,-49 + 2368: -10,-45 + 3433: 4,-47 + 3434: 4,-46 + 3435: -2,-47 + 3436: -6,-47 - node: color: '#DE3A3A96' id: DiagonalOverlay decals: - 1607: 51,-2 - 1608: 49,-2 - 1609: 49,-5 - 1610: 51,-5 - 1611: 29,-33 - 1612: 29,-32 - 1613: 39,-34 - 1614: 39,-32 - 1615: 41,-31 - 1616: 44,-37 - 1617: 41,-38 - 1618: 38,-41 - 2908: 41,-24 + 1603: 51,-2 + 1604: 49,-2 + 1605: 49,-5 + 1606: 51,-5 + 1607: 29,-33 + 1608: 29,-32 + 1609: 39,-34 + 1610: 39,-32 + 1611: 41,-31 + 1612: 44,-37 + 1613: 41,-38 + 1614: 38,-41 + 2903: 41,-24 - node: color: '#EFB34196' id: DiagonalOverlay decals: - 1873: 9,33 - 1874: 9,32 - 1875: 20,33 - 1876: 20,32 + 1869: 9,33 + 1870: 9,32 + 1871: 20,33 + 1872: 20,32 - node: color: '#FFFFFFFF' id: FlowersBROne decals: - 2806: 16.070688,16.03927 - 2837: 9.361443,4.4135666 - 2838: 8.71561,5.3614836 + 2801: 16.070688,16.03927 + 2832: 9.361443,4.4135666 + 2833: 8.71561,5.3614836 - node: color: '#FFFFFFFF' id: FlowersBRThree decals: - 2807: 17.062426,11.239492 - 2808: 10.321154,17.060677 - 2841: 7.6635256,6.1948166 - 2842: 8.538526,6.2989836 - 2877: 9.51524,6.327868 + 2802: 17.062426,11.239492 + 2803: 10.321154,17.060677 + 2836: 7.6635256,6.1948166 + 2837: 8.538526,6.2989836 + 2872: 9.51524,6.327868 - node: color: '#FFFFFFFF' id: FlowersBRTwo decals: - 2834: 10.111443,4.4344 - 2835: 8.663526,4.5594 - 2836: 8.05936,5.5073166 - 2878: 9.79649,6.7862015 + 2829: 10.111443,4.4344 + 2830: 8.663526,4.5594 + 2831: 8.05936,5.5073166 + 2873: 9.79649,6.7862015 - node: color: '#FFFFFFFF' id: Flowersbr1 decals: - 2803: 3.1090877,15.838451 - 2804: 15.10194,16.174686 + 2798: 3.1090877,15.838451 + 2799: 15.10194,16.174686 - node: color: '#FFFFFFFF' id: Flowersbr2 decals: - 2805: 15.393607,16.737186 - 2839: 9.49686,5.1010666 - 2840: 9.080193,5.7260666 - 2843: 10.324566,5.2335067 - 2865: 16.988474,10.508276 - 2866: 16.363474,10.747859 - 2867: 11.000941,16.992361 - 2868: 11.6309395,17.170504 - 2884: 7.8013525,4.69695 - 2885: 9.145103,3.603201 - 2886: 9.15132,6.0905905 + 2800: 15.393607,16.737186 + 2834: 9.49686,5.1010666 + 2835: 9.080193,5.7260666 + 2838: 10.324566,5.2335067 + 2860: 16.988474,10.508276 + 2861: 16.363474,10.747859 + 2862: 11.000941,16.992361 + 2863: 11.6309395,17.170504 + 2879: 7.8013525,4.69695 + 2880: 9.145103,3.603201 + 2881: 9.15132,6.0905905 - node: color: '#FFFFFFFF' id: Flowersbr3 decals: - 2876: 8.806907,6.8799515 + 2871: 8.806907,6.8799515 - node: color: '#FFFFFFFF' id: Flowerspv1 decals: - 2844: 15.255633,6.9409747 - 2845: 14.661882,7.545141 + 2839: 15.255633,6.9409747 + 2840: 14.661882,7.545141 - node: color: '#FFFFFFFF' id: Flowerspv2 decals: - 2846: 15.463966,7.690975 - 2848: 14.5844555,8.774308 - 2852: 14.978545,6.1768036 - 2853: 15.728544,6.3643036 - 2879: 14.814111,5.0989227 - 2880: 15.56411,4.4947557 - 2883: 12.9190645,9.799427 + 2841: 15.463966,7.690975 + 2843: 14.5844555,8.774308 + 2847: 14.978545,6.1768036 + 2848: 15.728544,6.3643036 + 2874: 14.814111,5.0989227 + 2875: 15.56411,4.4947557 + 2878: 12.9190645,9.799427 - node: color: '#FFFFFFFF' id: Flowerspv3 decals: - 2797: 8.013186,3.1140726 - 2798: 10.378889,-5.012858 - 2799: 10.274722,-4.383773 - 2847: 15.219872,8.347224 - 2849: 13.9177885,8.774308 - 2850: 13.252036,8.115639 - 2851: 13.134795,8.926804 - 2854: 16.103544,7.1143036 - 2855: 16.42646,6.1143036 - 2856: 15.748611,5.544657 - 2881: 14.501611,4.234339 - 2882: 13.6690645,9.570259 + 2792: 8.013186,3.1140726 + 2793: 10.378889,-5.012858 + 2794: 10.274722,-4.383773 + 2842: 15.219872,8.347224 + 2844: 13.9177885,8.774308 + 2845: 13.252036,8.115639 + 2846: 13.134795,8.926804 + 2849: 16.103544,7.1143036 + 2850: 16.42646,6.1143036 + 2851: 15.748611,5.544657 + 2876: 14.501611,4.234339 + 2877: 13.6690645,9.570259 - node: color: '#FFFFFFFF' id: Flowersy1 decals: - 2795: 7.160172,13.449887 - 2796: 5.483089,13.918637 - 2809: 12.341987,18.164845 - 2816: 4.084557,12.876521 - 2817: 6.313724,11.689021 - 2818: 9.0012245,11.564021 - 2824: 8.3553915,12.168188 - 2825: 6.730391,12.855688 - 2826: 5.105391,14.376521 - 2827: 2.9283073,14.741104 - 2829: 4.719974,13.105688 - 2830: 4.355391,14.585857 - 2831: 3.473161,14.394393 - 2832: 4.3585773,13.821476 - 2858: 2.299132,6.662748 - 2863: 4.7337813,6.6002483 - 2864: 4.5150313,6.0064983 + 2790: 7.160172,13.449887 + 2791: 5.483089,13.918637 + 2804: 12.341987,18.164845 + 2811: 4.084557,12.876521 + 2812: 6.313724,11.689021 + 2813: 9.0012245,11.564021 + 2819: 8.3553915,12.168188 + 2820: 6.730391,12.855688 + 2821: 5.105391,14.376521 + 2822: 2.9283073,14.741104 + 2824: 4.719974,13.105688 + 2825: 4.355391,14.585857 + 2826: 3.473161,14.394393 + 2827: 4.3585773,13.821476 + 2853: 2.299132,6.662748 + 2858: 4.7337813,6.6002483 + 2859: 4.5150313,6.0064983 - node: color: '#FFFFFFFF' id: Flowersy2 decals: - 2810: 14.633654,18.154427 - 2819: 7.6991415,11.939021 - 2820: 7.0533075,11.282771 - 2821: 8.1783085,11.241104 - 2859: 3.0178826,5.8710814 + 2805: 14.633654,18.154427 + 2814: 7.6991415,11.939021 + 2815: 7.0533075,11.282771 + 2816: 8.1783085,11.241104 + 2854: 3.0178826,5.8710814 - node: color: '#FFFFFFFF' id: Flowersy3 decals: - 2811: 13.227404,18.091927 - 2813: 11.914904,18.11276 - 2814: 11.914904,18.11276 - 2822: 6.938724,12.168188 - 2823: 7.6158075,12.918188 - 2833: 3.4939945,13.592309 - 2860: 3.1637156,6.5481644 - 2861: 3.7887158,5.704415 - 2862: 3.9108648,7.0273314 + 2806: 13.227404,18.091927 + 2808: 11.914904,18.11276 + 2809: 11.914904,18.11276 + 2817: 6.938724,12.168188 + 2818: 7.6158075,12.918188 + 2828: 3.4939945,13.592309 + 2855: 3.1637156,6.5481644 + 2856: 3.7887158,5.704415 + 2857: 3.9108648,7.0273314 - node: color: '#FFFFFFFF' id: Flowersy4 decals: - 2800: 3.8501334,-9.470912 - 2801: 4.3709664,-9.908412 - 2802: 3.6209664,-9.960495 - 2812: 13.966987,18.133595 - 2815: 15.123237,18.071095 - 2828: 5.136641,13.511938 - 2857: 2.2574656,5.8294144 - 2869: 9.849766,11.338729 - 2870: 9.047683,10.619978 - 2871: 4.7809443,7.692894 - 2872: 5.676778,7.797061 - 2873: 5.4059443,8.505394 - 2874: 5.8902392,6.890369 - 2875: 6.223573,8.400785 + 2795: 3.8501334,-9.470912 + 2796: 4.3709664,-9.908412 + 2797: 3.6209664,-9.960495 + 2807: 13.966987,18.133595 + 2810: 15.123237,18.071095 + 2823: 5.136641,13.511938 + 2852: 2.2574656,5.8294144 + 2864: 9.849766,11.338729 + 2865: 9.047683,10.619978 + 2866: 4.7809443,7.692894 + 2867: 5.676778,7.797061 + 2868: 5.4059443,8.505394 + 2869: 5.8902392,6.890369 + 2870: 6.223573,8.400785 - node: color: '#00BEBE7F' id: FullTileOverlayGreyscale decals: - 3230: -26,40 - 3231: -26,42 - 3232: -43,2 - 3233: -42,2 - 3234: -37,2 - 3235: -36,2 + 3225: -26,40 + 3226: -26,42 + 3227: -43,2 + 3228: -42,2 + 3229: -37,2 + 3230: -36,2 - node: color: '#334E6DC8' id: FullTileOverlayGreyscale decals: - 717: 21,3 - 718: 23,3 - 719: 25,3 - 819: -33,-9 - 820: -29,-9 - 2917: -23,-36 + 713: 21,3 + 714: 23,3 + 715: 25,3 + 815: -33,-9 + 816: -29,-9 + 2912: -23,-36 + - node: + color: '#373737FF' + id: FullTileOverlayGreyscale + decals: + 3498: 21,-19 + 3501: 20,-19 + 3502: 19,-19 + 3503: 19,-18 + 3504: 18,-19 + 3505: 18,-20 + 3506: 19,-20 + 3507: 19,-21 + 3508: 18,-21 + 3510: 21,-18 + 3511: 20,-18 + 3519: 17,-18 + 3520: 18,-17 + 3521: 21,-22 + 3522: 22,-21 - node: color: '#4A35194C' id: FullTileOverlayGreyscale decals: - 2746: -22,3 - 2747: -21,3 - 2748: -20,3 - 2749: -19,3 - 2750: -19,4 - 2751: -19,5 - 2752: -19,6 - 2753: -19,7 - 2754: -19,8 - 2755: -19,9 - 2756: -19,10 - 2757: -20,10 - 2758: -20,9 - 2759: -20,8 - 2760: -20,7 - 2761: -20,6 - 2762: -20,5 - 2763: -20,4 - 2764: -21,4 - 2765: -22,4 - 2766: -22,5 - 2767: -21,5 - 2768: -21,6 - 2769: -22,6 - 2770: -22,7 - 2771: -21,7 - 2772: -21,8 - 2773: -22,8 - 2774: -22,9 - 2775: -21,9 - 2776: -21,10 - 2777: -22,10 + 2741: -22,3 + 2742: -21,3 + 2743: -20,3 + 2744: -19,3 + 2745: -19,4 + 2746: -19,5 + 2747: -19,6 + 2748: -19,7 + 2749: -19,8 + 2750: -19,9 + 2751: -19,10 + 2752: -20,10 + 2753: -20,9 + 2754: -20,8 + 2755: -20,7 + 2756: -20,6 + 2757: -20,5 + 2758: -20,4 + 2759: -21,4 + 2760: -22,4 + 2761: -22,5 + 2762: -21,5 + 2763: -21,6 + 2764: -22,6 + 2765: -22,7 + 2766: -21,7 + 2767: -21,8 + 2768: -22,8 + 2769: -22,9 + 2770: -21,9 + 2771: -21,10 + 2772: -22,10 - node: color: '#52B4E996' id: FullTileOverlayGreyscale decals: - 255: -8,-39 - 256: -7,-39 - 541: -26,-27 - 542: -26,-28 - 543: -26,-29 - 544: -12,-30 - 545: -12,-29 - 546: -11,-29 - 561: -26,-41 - 746: -3,-37 - 747: -3,-36 - 829: -29,-6 - 830: -33,-6 - 938: -28,-29 - 939: -28,-28 - 940: -24,-29 - 941: -24,-28 + 251: -8,-39 + 252: -7,-39 + 537: -26,-27 + 538: -26,-28 + 539: -26,-29 + 540: -12,-30 + 541: -12,-29 + 542: -11,-29 + 557: -26,-41 + 742: -3,-37 + 743: -3,-36 + 825: -29,-6 + 826: -33,-6 + 934: -28,-29 + 935: -28,-28 + 936: -24,-29 + 937: -24,-28 - node: color: '#765428FF' id: FullTileOverlayGreyscale decals: - 3374: -55,-16 - 3375: -56,-16 + 3369: -55,-16 + 3370: -56,-16 - node: color: '#951710FF' id: FullTileOverlayGreyscale decals: - 2454: 43,37 - 2455: 43,38 - 2456: 43,39 - 2457: 43,40 - 2458: 43,41 - 2459: 43,36 - 2460: 43,42 + 2450: 43,37 + 2451: 43,38 + 2452: 43,39 + 2453: 43,40 + 2454: 43,41 + 2455: 43,36 + 2456: 43,42 - node: color: '#9FED5896' id: FullTileOverlayGreyscale decals: - 199: -33,-14 - 200: -30,-14 - 201: -26,-18 - 202: -31,-19 - 203: -31,-18 - 204: -31,-17 - 274: -26,-14 - 485: -30,-22 - 825: -31,-9 - 826: -31,-4 + 195: -33,-14 + 196: -30,-14 + 197: -26,-18 + 198: -31,-19 + 199: -31,-18 + 200: -31,-17 + 270: -26,-14 + 481: -30,-22 + 821: -31,-9 + 822: -31,-4 - node: color: '#A4610696' id: FullTileOverlayGreyscale decals: - 823: -31,-8 - 824: -31,-5 + 819: -31,-8 + 820: -31,-5 - node: color: '#BC863FFF' id: FullTileOverlayGreyscale decals: - 3292: -48,-3 - 3293: -48,-4 - 3294: -52,-1 - 3295: -52,0 - 3406: -48,0 - 3407: -48,1 - 3408: -48,-1 - 3420: -51,-1 - 3421: -51,0 + 3287: -48,-3 + 3288: -48,-4 + 3289: -52,-1 + 3290: -52,0 + 3401: -48,0 + 3402: -48,1 + 3403: -48,-1 + 3415: -51,-1 + 3416: -51,0 - node: color: '#C6FF91FF' id: FullTileOverlayGreyscale decals: - 3075: -37,-35 - 3076: -37,-34 - 3077: -36,-34 - 3078: -35,-34 + 3070: -37,-35 + 3071: -37,-34 + 3072: -36,-34 + 3073: -35,-34 - node: color: '#D381C996' id: FullTileOverlayGreyscale decals: - 833: -29,-4 - 834: -33,-4 + 829: -29,-4 + 830: -33,-4 - node: color: '#D4D4D496' id: FullTileOverlayGreyscale decals: - 827: -29,-7 - 828: -33,-7 + 823: -29,-7 + 824: -33,-7 - node: color: '#DE3A3A96' id: FullTileOverlayGreyscale decals: - 831: -29,-5 - 832: -33,-5 - 2792: 56,-10 - 2793: 56,-11 - 2794: 56,-12 - 3447: 32,-10 - 3448: 38,-10 - 3449: 40,-10 + 827: -29,-5 + 828: -33,-5 + 2787: 56,-10 + 2788: 56,-11 + 2789: 56,-12 + 3442: 32,-10 + 3443: 38,-10 + 3444: 40,-10 - node: color: '#EFB34196' id: FullTileOverlayGreyscale decals: - 821: -29,-8 - 822: -33,-8 - 2943: -11,-39 - 2944: -19,-40 - 2989: -16,-38 + 817: -29,-8 + 818: -33,-8 + 2938: -11,-39 + 2939: -19,-40 + 2984: -16,-38 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineE + decals: + 3445: 11,2 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineN + decals: + 3452: 2,10 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineS + decals: + 3447: 12.501469,3.9993005 + 3450: 2,13 + 3451: 2,13 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineW + decals: + 3446: 14,2 + 3453: 4.001555,11.500919 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale decals: - 604: 20,9 - 605: 21,9 - 606: 21,9 - 607: 22,9 - 608: 22,9 - 609: 25,9 - 633: 26,9 + 600: 20,9 + 601: 21,9 + 602: 21,9 + 603: 22,9 + 604: 22,9 + 605: 25,9 + 629: 26,9 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale decals: - 269: -9,-34 - 270: -6,-34 - 340: -20,-33 - 341: -19,-33 - 342: -18,-33 - 343: -17,-33 - 344: -16,-33 - 345: -15,-33 - 548: -13,-29 - 560: -26,-42 + 265: -9,-34 + 266: -6,-34 + 336: -20,-33 + 337: -19,-33 + 338: -18,-33 + 339: -17,-33 + 340: -16,-33 + 341: -15,-33 + 544: -13,-29 + 556: -26,-42 - node: color: '#639137FF' id: HalfTileOverlayGreyscale decals: - 651: 4,24 - 652: 5,24 - 653: 6,24 - 654: 7,24 - 655: 8,24 - 656: 9,24 + 647: 4,24 + 648: 5,24 + 649: 6,24 + 650: 7,24 + 651: 8,24 + 652: 9,24 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale decals: - 163: -26,-15 - 164: -27,-15 - 165: -28,-15 - 166: -29,-15 - 167: -30,-15 - 168: -32,-15 - 205: -31,-15 - 486: -30,-23 - 487: -31,-23 - 488: -32,-23 + 159: -26,-15 + 160: -27,-15 + 161: -28,-15 + 162: -29,-15 + 163: -30,-15 + 164: -32,-15 + 201: -31,-15 + 482: -30,-23 + 483: -31,-23 + 484: -32,-23 - node: color: '#C6FF91FF' id: HalfTileOverlayGreyscale decals: - 3079: -36,-31 - 3080: -37,-31 - 3081: -38,-31 + 3074: -36,-31 + 3075: -37,-31 + 3076: -38,-31 - node: color: '#D381C996' id: HalfTileOverlayGreyscale decals: - 841: -13,-50 - 842: -12,-50 - 3014: 15,-42 + 837: -13,-50 + 838: -12,-50 + 3009: 15,-42 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale decals: - 1486: 45,-15 - 1487: 44,-15 - 1488: 43,-15 - 1489: 42,-15 - 1490: 41,-15 + 1482: 45,-15 + 1483: 44,-15 + 1484: 43,-15 + 1485: 42,-15 + 1486: 41,-15 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale180 decals: - 599: 20,4 - 600: 20,4 - 601: 21,4 - 602: 22,4 - 603: 25,4 - 634: 26,4 + 595: 20,4 + 596: 20,4 + 597: 21,4 + 598: 22,4 + 599: 25,4 + 630: 26,4 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale180 decals: - 348: -15,-36 - 349: -16,-36 - 350: -17,-36 - 351: -18,-36 - 352: -20,-36 - 353: -19,-36 - 547: -13,-28 - 559: -26,-40 + 344: -15,-36 + 345: -16,-36 + 346: -17,-36 + 347: -18,-36 + 348: -20,-36 + 349: -19,-36 + 543: -13,-28 + 555: -26,-40 - node: color: '#639137FF' id: HalfTileOverlayGreyscale180 decals: - 643: 8,22 - 644: 7,22 - 645: 7,22 - 646: 6,22 - 647: 5,22 - 657: 4,19 - 658: 5,19 - 659: 6,19 - 660: 7,19 - 661: 7,19 - 662: 8,19 - 663: 9,19 - 676: 5,23 - 677: 8,23 - - node: - color: '#80C71FFF' - id: HalfTileOverlayGreyscale180 - decals: - 1428: 53,-20 - - node: - color: '#8932B8FF' - id: HalfTileOverlayGreyscale180 - decals: - 1429: 49,-20 + 639: 8,22 + 640: 7,22 + 641: 7,22 + 642: 6,22 + 643: 5,22 + 653: 4,19 + 654: 5,19 + 655: 6,19 + 656: 7,19 + 657: 7,19 + 658: 8,19 + 659: 9,19 + 672: 5,23 + 673: 8,23 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale180 decals: - 160: -27,-17 - 161: -28,-17 - 162: -26,-17 - 169: -30,-21 - 170: -31,-21 - 171: -32,-21 - 489: -30,-24 - 490: -31,-24 - 491: -32,-24 + 156: -27,-17 + 157: -28,-17 + 158: -26,-17 + 165: -30,-21 + 166: -31,-21 + 167: -32,-21 + 485: -30,-24 + 486: -31,-24 + 487: -32,-24 - node: color: '#C6FF91FF' id: HalfTileOverlayGreyscale180 decals: - 3074: -38,-35 + 3069: -38,-35 - node: color: '#D381C996' id: HalfTileOverlayGreyscale180 decals: - 835: -13,-48 - 836: -12,-48 - 3015: 15,-39 - - node: - color: '#F9801DFF' - id: HalfTileOverlayGreyscale180 - decals: - 1430: 45,-20 + 831: -13,-48 + 832: -12,-48 + 3010: 15,-39 - node: color: '#1E5026FF' id: HalfTileOverlayGreyscale270 decals: - 2468: 42,36 - 2469: 42,37 - 2470: 42,38 - 2471: 42,39 - 2472: 42,40 - 2473: 42,41 - 2474: 42,42 + 2464: 42,36 + 2465: 42,37 + 2466: 42,38 + 2467: 42,39 + 2468: 42,40 + 2469: 42,41 + 2470: 42,42 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale270 decals: - 595: 19,5 - 596: 19,6 - 597: 19,7 - 598: 19,8 + 591: 19,5 + 592: 19,6 + 593: 19,7 + 594: 19,8 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale270 decals: - 220: -3,-33 - 221: -3,-34 - 222: -3,-35 - 223: -3,-38 - 224: -3,-39 - 225: -3,-40 - 263: -5,-35 - 264: -5,-34 - 267: -8,-35 - 268: -8,-34 - 338: -21,-34 - 339: -21,-35 - 552: -11,-28 - 553: -11,-27 - 554: -11,-26 - 558: -11,-25 + 216: -3,-33 + 217: -3,-34 + 218: -3,-35 + 219: -3,-38 + 220: -3,-39 + 221: -3,-40 + 259: -5,-35 + 260: -5,-34 + 263: -8,-35 + 264: -8,-34 + 334: -21,-34 + 335: -21,-35 + 548: -11,-28 + 549: -11,-27 + 550: -11,-26 + 554: -11,-25 - node: color: '#639137FF' id: HalfTileOverlayGreyscale270 decals: - 642: 9,21 - 664: 3,20 - 665: 3,21 - 666: 3,22 - 667: 3,23 - 678: 7,20 - 681: 7,21 + 638: 9,21 + 660: 3,20 + 661: 3,21 + 662: 3,22 + 663: 3,23 + 674: 7,20 + 677: 7,21 - node: color: '#951710FF' id: HalfTileOverlayGreyscale270 decals: - 2482: 44,36 - 2483: 44,37 - 2484: 44,38 - 2485: 44,39 - 2486: 44,40 - 2487: 44,41 - 2488: 44,42 + 2478: 44,36 + 2479: 44,37 + 2480: 44,38 + 2481: 44,39 + 2482: 44,40 + 2483: 44,41 + 2484: 44,42 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale270 decals: - 174: -33,-20 - 175: -33,-19 - 176: -33,-18 - 177: -33,-17 - 178: -33,-16 - 196: -33,-12 - 198: -30,-12 + 170: -33,-20 + 171: -33,-19 + 172: -33,-18 + 173: -33,-17 + 174: -33,-16 + 192: -33,-12 + 194: -30,-12 - node: color: '#C6FF91FF' id: HalfTileOverlayGreyscale270 decals: - 3083: -39,-32 - 3084: -39,-33 - 3085: -39,-34 + 3078: -39,-32 + 3079: -39,-33 + 3080: -39,-34 - node: color: '#D381C996' id: HalfTileOverlayGreyscale270 decals: - 840: -13,-49 + 836: -13,-49 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 decals: - 2787: 57,-12 - 2788: 57,-11 - 2789: 57,-10 + 2782: 57,-12 + 2783: 57,-11 + 2784: 57,-10 - node: color: '#1E5026FF' id: HalfTileOverlayGreyscale90 decals: - 2461: 44,36 - 2462: 44,37 - 2463: 44,38 - 2464: 44,39 - 2465: 44,40 - 2466: 44,41 - 2467: 44,42 + 2457: 44,36 + 2458: 44,37 + 2459: 44,38 + 2460: 44,39 + 2461: 44,40 + 2462: 44,41 + 2463: 44,42 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale90 decals: - 261: -7,-35 - 262: -7,-34 - 265: -10,-35 - 266: -10,-34 - 346: -14,-34 - 347: -14,-35 - 555: -12,-27 - 556: -12,-26 - 557: -12,-25 + 257: -7,-35 + 258: -7,-34 + 261: -10,-35 + 262: -10,-34 + 342: -14,-34 + 343: -14,-35 + 551: -12,-27 + 552: -12,-26 + 553: -12,-25 - node: color: '#639137FF' id: HalfTileOverlayGreyscale90 decals: - 648: 4,21 - 668: 10,20 - 669: 10,21 - 670: 10,22 - 671: 10,23 - 679: 6,20 - 680: 6,21 + 644: 4,21 + 664: 10,20 + 665: 10,21 + 666: 10,22 + 667: 10,23 + 675: 6,20 + 676: 6,21 - node: color: '#951710FF' id: HalfTileOverlayGreyscale90 decals: - 2475: 42,36 - 2476: 42,37 - 2477: 42,38 - 2478: 42,39 - 2479: 42,40 - 2480: 42,41 - 2481: 42,42 + 2471: 42,36 + 2472: 42,37 + 2473: 42,38 + 2474: 42,39 + 2475: 42,40 + 2476: 42,41 + 2477: 42,42 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale90 decals: - 157: -29,-20 - 158: -29,-19 - 159: -29,-18 - 195: -29,-12 - 197: -32,-12 + 153: -29,-20 + 154: -29,-19 + 155: -29,-18 + 191: -29,-12 + 193: -32,-12 - node: color: '#D381C996' id: HalfTileOverlayGreyscale90 decals: - 839: -12,-49 + 835: -12,-49 - node: color: '#EFB34196' id: MiniTileCornerOverlayNE decals: - 2938: -14,-40 + 2933: -14,-40 - node: color: '#EFB34196' id: MiniTileCornerOverlayNW decals: - 2935: -16,-40 + 2930: -16,-40 - node: color: '#EFB34196' id: MiniTileCornerOverlaySE decals: - 2936: -14,-42 + 2931: -14,-42 - node: color: '#EFB34196' id: MiniTileCornerOverlaySW decals: - 2937: -16,-42 + 2932: -16,-42 - node: color: '#DE3A3A96' id: MiniTileInnerOverlaySE decals: - 2887: 36,-13 + 2882: 36,-13 - node: color: '#EFB34196' id: MiniTileLineOverlayE decals: - 2940: -14,-41 + 2935: -14,-41 - node: color: '#DE3A3A96' id: MiniTileLineOverlayN decals: - 2786: 55,-10 + 2781: 55,-10 - node: color: '#EFB34196' id: MiniTileLineOverlayN decals: - 2939: -15,-40 + 2934: -15,-40 - node: color: '#DE3A3A96' id: MiniTileLineOverlayS decals: - 2785: 55,-12 + 2780: 55,-12 - node: color: '#EFB34196' id: MiniTileLineOverlayS decals: - 2942: -15,-42 + 2937: -15,-42 - node: color: '#EFB34196' id: MiniTileLineOverlayW decals: - 2941: -16,-41 + 2936: -16,-41 - node: color: '#D4D4D496' id: MiniTileOverlay decals: - 1802: 46,-35 - 1803: 46,-41 + 1798: 46,-35 + 1799: 46,-41 - node: color: '#FFFFFFFF' id: MiniTileOverlay decals: - 1804: 6,39 + 1800: 6,39 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerNe decals: - 1792: 48,-36 + 1788: 48,-36 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerNw decals: - 1793: 45,-36 + 1789: 45,-36 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerSe decals: - 1791: 48,-39 - 1795: 47,-40 + 1787: 48,-39 + 1791: 47,-40 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerSw decals: - 1794: 45,-40 + 1790: 45,-40 - node: color: '#FFFFFFFF' id: MiniTileSteelLineN decals: - 1796: 46,-36 - 1797: 47,-36 + 1792: 46,-36 + 1793: 47,-36 - node: color: '#FFFFFFFF' id: MiniTileSteelLineS decals: - 1798: 46,-40 + 1794: 46,-40 - node: color: '#FFFFFFFF' id: MiniTileSteelLineW decals: - 1799: 45,-39 - 1800: 45,-38 - 1801: 45,-37 + 1795: 45,-39 + 1796: 45,-38 + 1797: 45,-37 - node: color: '#334E6DC8' id: MiniTileWhiteCornerNe decals: - 1000: -52,-9 + 996: -52,-9 - node: color: '#A4610696' id: MiniTileWhiteCornerNe decals: - 1015: -57,-3 - 1018: -57,-3 + 1011: -57,-3 + 1014: -57,-3 - node: color: '#BC863FBF' id: MiniTileWhiteCornerNe decals: - 971: -57,-18 + 967: -57,-18 - node: color: '#EFB34196' id: MiniTileWhiteCornerNe decals: - 2980: -11,-42 - 2981: -12,-39 + 2975: -11,-42 + 2976: -12,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerNe decals: - 452: -15,-34 - 2948: -12,-39 - 2949: -11,-42 + 448: -15,-34 + 2943: -12,-39 + 2944: -11,-42 - node: color: '#A4610696' id: MiniTileWhiteCornerNw decals: - 1016: -58,-3 - 1017: -58,-3 + 1012: -58,-3 + 1013: -58,-3 - node: color: '#BC863FBF' id: MiniTileWhiteCornerNw decals: - 970: -58,-18 + 966: -58,-18 - node: color: '#EFB34196' id: MiniTileWhiteCornerNw decals: - 2982: -18,-39 + 2977: -18,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerNw decals: - 451: -20,-34 - 2947: -18,-39 + 447: -20,-34 + 2942: -18,-39 - node: color: '#334E6DC8' id: MiniTileWhiteCornerSe decals: - 999: -52,-11 + 995: -52,-11 - node: color: '#A4610696' id: MiniTileWhiteCornerSe decals: - 1013: -57,-5 - 1019: -57,-5 + 1009: -57,-5 + 1015: -57,-5 - node: color: '#BC863FBF' id: MiniTileWhiteCornerSe decals: - 968: -57,-20 + 964: -57,-20 - node: color: '#EFB34196' id: MiniTileWhiteCornerSe decals: - 2979: -11,-43 + 2974: -11,-43 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerSe decals: - 449: -15,-35 - 2945: -11,-43 + 445: -15,-35 + 2940: -11,-43 - node: color: '#A4610696' id: MiniTileWhiteCornerSw decals: - 1014: -58,-5 - 1020: -58,-5 + 1010: -58,-5 + 1016: -58,-5 - node: color: '#BC863FBF' id: MiniTileWhiteCornerSw decals: - 969: -58,-20 + 965: -58,-20 - node: color: '#EFB34196' id: MiniTileWhiteCornerSw decals: - 2978: -18,-43 + 2973: -18,-43 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerSw decals: - 450: -20,-35 - 2946: -18,-43 + 446: -20,-35 + 2941: -18,-43 - node: color: '#D381C996' id: MiniTileWhiteInnerNe decals: - 3442: -7,-48 + 3437: -7,-48 - node: color: '#DE3A3A96' id: MiniTileWhiteInnerNe decals: - 3437: 42,-39 + 3432: 42,-39 - node: color: '#EFB34196' id: MiniTileWhiteInnerNe decals: - 2988: -12,-42 + 2983: -12,-42 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerNe decals: - 445: -21,-36 - 2966: -12,-42 + 441: -21,-36 + 2961: -12,-42 - node: color: '#DE3A3A96' id: MiniTileWhiteInnerNw decals: - 3436: 42,-39 + 3431: 42,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerNw decals: - 501: -14,-36 + 497: -14,-36 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerSe decals: - 447: -21,-33 - 448: -21,-33 + 443: -21,-33 + 444: -21,-33 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerSw decals: - 446: -14,-33 + 442: -14,-33 - node: color: '#334E6DC8' id: MiniTileWhiteLineE decals: - 998: -52,-10 + 994: -52,-10 - node: color: '#A4610696' id: MiniTileWhiteLineE decals: - 1023: -57,-4 - 1024: -57,-4 + 1019: -57,-4 + 1020: -57,-4 - node: color: '#BC863FBF' id: MiniTileWhiteLineE decals: - 973: -57,-19 + 969: -57,-19 - node: color: '#EFB34196' id: MiniTileWhiteLineE decals: - 2986: -12,-41 - 2987: -12,-40 + 2981: -12,-41 + 2982: -12,-40 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineE decals: - 436: -21,-34 - 437: -21,-34 - 438: -21,-35 - 2955: -12,-40 - 2956: -12,-41 + 432: -21,-34 + 433: -21,-34 + 434: -21,-35 + 2950: -12,-40 + 2951: -12,-41 - node: color: '#EFB34196' id: MiniTileWhiteLineN decals: - 2967: -17,-39 - 2968: -16,-39 - 2969: -15,-39 - 2970: -14,-39 - 2971: -13,-39 + 2962: -17,-39 + 2963: -16,-39 + 2964: -15,-39 + 2965: -14,-39 + 2966: -13,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineN decals: - 439: -20,-36 - 440: -19,-36 - 441: -18,-36 - 442: -17,-36 - 443: -16,-36 - 444: -15,-36 - 453: -19,-34 - 454: -18,-34 - 455: -17,-34 - 456: -16,-34 - 2950: -17,-39 - 2951: -16,-39 - 2952: -15,-39 - 2953: -14,-39 - 2954: -13,-39 + 435: -20,-36 + 436: -19,-36 + 437: -18,-36 + 438: -17,-36 + 439: -16,-36 + 440: -15,-36 + 449: -19,-34 + 450: -18,-34 + 451: -17,-34 + 452: -16,-34 + 2945: -17,-39 + 2946: -16,-39 + 2947: -15,-39 + 2948: -14,-39 + 2949: -13,-39 - node: color: '#EFB34196' id: MiniTileWhiteLineS decals: - 2972: -12,-43 - 2973: -13,-43 - 2974: -14,-43 - 2975: -15,-43 - 2976: -16,-43 - 2977: -17,-43 + 2967: -12,-43 + 2968: -13,-43 + 2969: -14,-43 + 2970: -15,-43 + 2971: -16,-43 + 2972: -17,-43 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineS decals: - 430: -15,-33 - 431: -16,-33 - 432: -17,-33 - 433: -18,-33 - 434: -19,-33 - 435: -20,-33 - 457: -16,-35 - 458: -17,-35 - 459: -18,-35 - 460: -19,-35 - 2957: -12,-43 - 2958: -13,-43 - 2959: -14,-43 - 2960: -15,-43 - 2961: -16,-43 - 2962: -17,-43 + 426: -15,-33 + 427: -16,-33 + 428: -17,-33 + 429: -18,-33 + 430: -19,-33 + 431: -20,-33 + 453: -16,-35 + 454: -17,-35 + 455: -18,-35 + 456: -19,-35 + 2952: -12,-43 + 2953: -13,-43 + 2954: -14,-43 + 2955: -15,-43 + 2956: -16,-43 + 2957: -17,-43 - node: color: '#A4610696' id: MiniTileWhiteLineW decals: - 1021: -58,-4 - 1022: -58,-4 + 1017: -58,-4 + 1018: -58,-4 - node: color: '#BC863FBF' id: MiniTileWhiteLineW decals: - 972: -58,-19 + 968: -58,-19 - node: color: '#EFB34196' id: MiniTileWhiteLineW decals: - 2983: -18,-40 - 2984: -18,-41 - 2985: -18,-42 + 2978: -18,-40 + 2979: -18,-41 + 2980: -18,-42 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineW decals: - 428: -14,-35 - 429: -14,-34 - 2963: -18,-42 - 2964: -18,-41 - 2965: -18,-40 + 424: -14,-35 + 425: -14,-34 + 2958: -18,-42 + 2959: -18,-41 + 2960: -18,-40 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerNe decals: - 136: 5,-9 + 132: 5,-9 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerNw decals: - 137: 9,-9 + 133: 9,-9 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerSe decals: - 139: 5,-5 - 148: 11,-17 - 149: 17,-11 + 135: 5,-5 + 144: 11,-17 + 145: 17,-11 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerSw decals: - 138: 9,-5 + 134: 9,-5 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineE decals: - 129: 5,-8 - 130: 5,-7 - 131: 5,-7 - 132: 5,-6 - 140: 17,-15 - 141: 17,-14 - 142: 17,-13 - 143: 17,-12 + 125: 5,-8 + 126: 5,-7 + 127: 5,-7 + 128: 5,-6 + 136: 17,-15 + 137: 17,-14 + 138: 17,-13 + 139: 17,-12 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineN decals: - 123: 7,-9 - 124: 6,-9 - 125: 8,-9 + 119: 7,-9 + 120: 6,-9 + 121: 8,-9 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineS decals: - 133: 6,-5 - 134: 7,-5 - 135: 8,-5 - 144: 15,-17 - 145: 14,-17 - 146: 13,-17 - 147: 12,-17 + 129: 6,-5 + 130: 7,-5 + 131: 8,-5 + 140: 15,-17 + 141: 14,-17 + 142: 13,-17 + 143: 12,-17 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineW decals: - 126: 9,-8 - 127: 9,-7 - 128: 9,-6 + 122: 9,-8 + 123: 9,-7 + 124: 9,-6 - node: color: '#D4D4D428' id: PavementOverlay decals: - 1377: 41,-12 - 1378: 42,-12 - 1379: 43,-12 - 1380: 44,-12 - 1381: 45,-12 - 1382: 45,-13 - 1383: 44,-13 - 1384: 43,-13 - 1385: 42,-13 - 1386: 41,-13 - 1387: 41,-14 - 1388: 42,-14 - 1389: 43,-14 - 1390: 44,-14 - 1391: 45,-14 - 1392: 44,-21 - 1393: 45,-21 - 1394: 46,-21 - 1395: 46,-22 - 1396: 45,-22 - 1397: 44,-22 - 1398: 48,-21 - 1399: 49,-21 - 1400: 50,-21 - 1401: 50,-22 - 1402: 49,-22 - 1403: 48,-22 - 1404: 52,-21 - 1405: 53,-21 - 1406: 54,-21 - 1407: 54,-22 - 1408: 53,-22 - 1409: 52,-22 + 1388: 44,-21 + 1389: 45,-21 + 1390: 46,-21 + 1391: 46,-22 + 1392: 45,-22 + 1393: 44,-22 + 1394: 48,-21 + 1395: 49,-21 + 1396: 50,-21 + 1397: 50,-22 + 1398: 49,-22 + 1399: 48,-22 + 1400: 52,-21 + 1401: 53,-21 + 1402: 54,-21 + 1403: 54,-22 + 1404: 53,-22 + 1405: 52,-22 + 3583: 42,-12 + 3585: 44,-12 + 3586: 44,-13 + 3587: 43,-13 + 3591: 41,-12 + 3592: 41,-14 + 3593: 42,-13 + 3594: 41,-13 + 3595: 42,-14 + 3596: 43,-14 + 3597: 44,-14 + 3598: 45,-14 + 3599: 45,-13 + 3600: 45,-12 + 3601: 43,-12 - node: color: '#1D1D21FF' id: QuarterTileOverlayGreyscale decals: - 2489: 43,37 - 2492: 44,41 + 2485: 43,37 + 2488: 44,41 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale decals: - 1355: 30,-3 - 1359: 30,-8 - 1362: 30,-5 - 1363: 30,-6 + 1351: 30,-3 + 1355: 30,-8 + 1358: 30,-5 + 1359: 30,-6 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale decals: - 208: -5,-37 - 209: -7,-37 - 210: -9,-37 - 211: -8,-37 - 212: -6,-37 - 218: -4,-37 - 257: -7,-40 - 272: -10,-37 - 273: -11,-37 - 310: -12,-37 - 311: -13,-37 - 313: -23,-33 - 314: -24,-33 - 315: -25,-33 - 316: -26,-33 - 317: -27,-33 - 318: -28,-33 - 319: -29,-33 - 320: -30,-33 - 321: -32,-33 - 322: -33,-33 - 354: -22,-33 - 360: -21,-40 - 361: -21,-39 - 362: -21,-38 - 363: -21,-37 - 364: -20,-40 - 365: -22,-40 - 369: -13,-36 - 370: -20,-37 - 371: -12,-32 - 373: -13,-33 - 375: -12,-33 - 377: -13,-34 + 204: -5,-37 + 205: -7,-37 + 206: -9,-37 + 207: -8,-37 + 208: -6,-37 + 214: -4,-37 + 253: -7,-40 + 268: -10,-37 + 269: -11,-37 + 306: -12,-37 + 307: -13,-37 + 309: -23,-33 + 310: -24,-33 + 311: -25,-33 + 312: -26,-33 + 313: -27,-33 + 314: -28,-33 + 315: -29,-33 + 316: -30,-33 + 317: -32,-33 + 318: -33,-33 + 350: -22,-33 + 356: -21,-40 + 357: -21,-39 + 358: -21,-38 + 359: -21,-37 + 360: -20,-40 + 361: -22,-40 + 365: -13,-36 + 366: -20,-37 + 367: -12,-32 + 369: -13,-33 + 371: -12,-33 + 373: -13,-34 + 374: -19,-32 + 375: -19,-31 + 376: -19,-30 + 377: -19,-29 + 390: -22,-29 + 391: -23,-29 + 392: -21,-29 + 393: -20,-29 + 394: -18,-29 + 395: -17,-29 + 396: -16,-29 + 397: -15,-29 + 401: -22,-28 + 402: -19,-28 + 403: -16,-28 + 527: -31,-32 + 528: -31,-31 + 531: -31,-33 + 532: -22,-36 + 536: -24,-29 + 545: -14,-29 + 561: -25,-42 + 577: -12,-31 + 744: -2,-37 + 3081: -36,-33 + 3085: -37,-33 + 3089: -35,-33 + 3091: -34,-33 + - node: + color: '#9FED5896' + id: QuarterTileOverlayGreyscale + decals: + 494: -30,-20 + - node: + color: '#D381C996' + id: QuarterTileOverlayGreyscale + decals: + 839: -11,-50 + - node: + color: '#D4D4D428' + id: QuarterTileOverlayGreyscale + decals: + 1025: -48,-2 + 1027: -48,3 + 1062: -33,-2 + 1127: -1,18 + 1128: -1,19 + 1129: -1,20 + 1130: -1,21 + 1131: -1,22 + 1132: -1,23 + 1133: -1,24 + 1134: -1,25 + 1135: -1,29 + 1136: -1,30 + 1137: -2,31 + 1138: -2,32 + 1139: -2,33 + 1140: -2,34 + 1141: -2,35 + 1142: -2,36 + 1143: -2,37 + 1144: -2,38 + 1159: -13,53 + 1161: -12,53 + 1162: -11,53 + 1163: -10,53 + 1164: -9,53 + 1169: -8,50 + 1170: -7,50 + 1171: -6,50 + 1172: -5,50 + 1173: -5,50 + 1174: -4,50 + 1175: -3,50 + 1176: -3,51 + 1177: -3,52 + 1178: -3,53 + 1179: -2,53 + 1180: -1,53 + 1181: 0,53 + 1183: 1,53 + 1225: -2,26 + 1226: -2,27 + 1227: -2,27 + 1228: -2,28 + 1264: 53,1 + 1265: 53,2 + 1266: 54,3 + 1267: 55,4 + 1268: 56,5 + 1309: 45,-3 + 1310: 45,-2 + 1322: 59,-3 + 1336: 57,5 + 1337: 58,5 + 1338: 59,5 + 1339: 60,5 + 1340: 61,5 + 1346: 62,0 + 1983: 3,-83 + 1984: 3,-82 + 1985: 3,-81 + 1986: 3,-80 + 1987: 3,-79 + 1988: 3,-78 + 1989: 3,-77 + 1990: 3,-76 + 1991: 3,-75 + 1992: 3,-74 + 1993: 3,-73 + 1994: 3,-72 + 1995: 3,-71 + 1996: 3,-70 + 1997: 3,-69 + 1998: 3,-68 + 1999: 3,-67 + 2000: 3,-66 + 2001: 3,-65 + 2002: 3,-64 + 2037: -11,-82 + 2038: -11,-81 + 2039: -10,-81 + 2040: -10,-80 + 2041: -10,-79 + 2042: -10,-78 + 2043: -11,-77 + 2044: -11,-76 + 2045: -11,-75 + 2046: -11,-75 + 2047: -10,-75 + 2048: -10,-74 + 2049: -10,-73 + 2050: -10,-72 + 2051: -10,-71 + 2052: -11,-70 + 2053: -11,-69 + 2054: -11,-68 + 2055: -10,-68 + 2056: -10,-67 + 2057: -10,-66 + 2058: -10,-65 + 2059: -10,-64 + 2060: -10,-63 + 2061: -10,-62 + 2062: -10,-61 + 2063: -10,-60 + 2064: -10,-59 + 2065: -10,-58 + 2066: -10,-57 + 2067: -9,-57 + 2068: -1,-57 + 2069: -1,-56 + 2070: -1,-55 + 2071: -1,-54 + 2072: -1,-53 + 2073: -1,-52 + 2074: -1,-51 + 2075: -1,-50 + 2076: -1,-49 + 2077: -1,-46 + 2078: -1,-45 + 2079: -1,-44 + 2080: -1,-43 + 2081: -1,-42 + 2082: -1,-41 + 2402: -1,-47 + 2403: -1,-48 + - node: + color: '#D4D4D433' + id: QuarterTileOverlayGreyscale + decals: + 3191: 0,48 + 3192: 0,47 + 3193: 0,46 + 3194: 0,45 + 3195: 0,44 + 3196: 0,43 + 3197: 0,42 + 3198: 0,41 + 3199: 0,40 + 3200: 0,38 + 3201: 0,39 + 3202: -1,38 + - node: + color: '#DE3A3A96' + id: QuarterTileOverlayGreyscale + decals: + 2786: 57,-13 + - node: + color: '#1D1D21FF' + id: QuarterTileOverlayGreyscale180 + decals: + 2486: 43,39 + 2489: 43,36 + - node: + color: '#334E6DC8' + id: QuarterTileOverlayGreyscale180 + decals: + 637: 27,5 + 1353: 33,-9 + - node: + color: '#52B4E996' + id: QuarterTileOverlayGreyscale180 + decals: + 203: -5,-36 + 209: -6,-36 + 210: -7,-36 + 211: -8,-36 + 212: -9,-36 + 213: -10,-36 + 215: -4,-36 + 255: -8,-38 + 267: -11,-36 + 308: -12,-36 + 319: -23,-32 + 320: -24,-32 + 321: -25,-32 + 322: -26,-32 + 323: -27,-32 + 324: -28,-32 + 325: -29,-32 + 326: -32,-32 + 327: -33,-32 + 328: -31,-32 + 329: -30,-32 + 330: -13,-36 + 351: -22,-32 + 352: -21,-37 + 353: -21,-38 + 354: -21,-39 + 355: -21,-40 + 362: -20,-40 + 363: -22,-40 + 364: -22,-33 + 368: -12,-32 + 370: -13,-32 + 372: -13,-33 378: -19,-32 379: -19,-31 380: -19,-30 381: -19,-29 - 394: -22,-29 - 395: -23,-29 - 396: -21,-29 - 397: -20,-29 - 398: -18,-29 - 399: -17,-29 - 400: -16,-29 - 401: -15,-29 - 405: -22,-28 - 406: -19,-28 - 407: -16,-28 - 531: -31,-32 - 532: -31,-31 - 535: -31,-33 - 536: -22,-36 - 540: -24,-29 - 549: -14,-29 - 565: -25,-42 - 581: -12,-31 - 748: -2,-37 - 3086: -36,-33 - 3090: -37,-33 - 3094: -35,-33 - 3096: -34,-33 - - node: - color: '#9FED5896' - id: QuarterTileOverlayGreyscale - decals: - 498: -30,-20 - - node: - color: '#D381C996' - id: QuarterTileOverlayGreyscale - decals: - 843: -11,-50 - - node: - color: '#D4D4D428' - id: QuarterTileOverlayGreyscale - decals: - 1029: -48,-2 - 1031: -48,3 - 1066: -33,-2 - 1131: -1,18 - 1132: -1,19 - 1133: -1,20 - 1134: -1,21 - 1135: -1,22 - 1136: -1,23 - 1137: -1,24 - 1138: -1,25 - 1139: -1,29 - 1140: -1,30 - 1141: -2,31 - 1142: -2,32 - 1143: -2,33 - 1144: -2,34 - 1145: -2,35 - 1146: -2,36 - 1147: -2,37 - 1148: -2,38 - 1163: -13,53 - 1165: -12,53 - 1166: -11,53 - 1167: -10,53 - 1168: -9,53 - 1173: -8,50 - 1174: -7,50 - 1175: -6,50 - 1176: -5,50 - 1177: -5,50 - 1178: -4,50 - 1179: -3,50 - 1180: -3,51 - 1181: -3,52 - 1182: -3,53 - 1183: -2,53 - 1184: -1,53 - 1185: 0,53 - 1187: 1,53 - 1229: -2,26 - 1230: -2,27 - 1231: -2,27 - 1232: -2,28 - 1268: 53,1 - 1269: 53,2 - 1270: 54,3 - 1271: 55,4 - 1272: 56,5 - 1313: 45,-3 - 1314: 45,-2 - 1326: 59,-3 - 1340: 57,5 - 1341: 58,5 - 1342: 59,5 - 1343: 60,5 - 1344: 61,5 - 1350: 62,0 - 1987: 3,-83 - 1988: 3,-82 - 1989: 3,-81 - 1990: 3,-80 - 1991: 3,-79 - 1992: 3,-78 - 1993: 3,-77 - 1994: 3,-76 - 1995: 3,-75 - 1996: 3,-74 - 1997: 3,-73 - 1998: 3,-72 - 1999: 3,-71 - 2000: 3,-70 - 2001: 3,-69 - 2002: 3,-68 - 2003: 3,-67 - 2004: 3,-66 - 2005: 3,-65 - 2006: 3,-64 - 2041: -11,-82 - 2042: -11,-81 - 2043: -10,-81 - 2044: -10,-80 - 2045: -10,-79 - 2046: -10,-78 - 2047: -11,-77 - 2048: -11,-76 - 2049: -11,-75 - 2050: -11,-75 - 2051: -10,-75 - 2052: -10,-74 - 2053: -10,-73 - 2054: -10,-72 - 2055: -10,-71 - 2056: -11,-70 - 2057: -11,-69 - 2058: -11,-68 - 2059: -10,-68 - 2060: -10,-67 - 2061: -10,-66 - 2062: -10,-65 - 2063: -10,-64 - 2064: -10,-63 - 2065: -10,-62 - 2066: -10,-61 - 2067: -10,-60 - 2068: -10,-59 - 2069: -10,-58 - 2070: -10,-57 - 2071: -9,-57 - 2072: -1,-57 - 2073: -1,-56 - 2074: -1,-55 - 2075: -1,-54 - 2076: -1,-53 - 2077: -1,-52 - 2078: -1,-51 - 2079: -1,-50 - 2080: -1,-49 - 2081: -1,-46 - 2082: -1,-45 - 2083: -1,-44 - 2084: -1,-43 - 2085: -1,-42 - 2086: -1,-41 - 2406: -1,-47 - 2407: -1,-48 - - node: - color: '#D4D4D433' - id: QuarterTileOverlayGreyscale - decals: - 3196: 0,48 - 3197: 0,47 - 3198: 0,46 - 3199: 0,45 - 3200: 0,44 - 3201: 0,43 - 3202: 0,42 - 3203: 0,41 - 3204: 0,40 - 3205: 0,38 - 3206: 0,39 - 3207: -1,38 - - node: - color: '#DE3A3A96' - id: QuarterTileOverlayGreyscale - decals: - 2791: 57,-13 - - node: - color: '#1D1D21FF' - id: QuarterTileOverlayGreyscale180 - decals: - 2490: 43,39 - 2493: 43,36 - - node: - color: '#334E6DC8' - id: QuarterTileOverlayGreyscale180 - decals: - 641: 27,5 - 1357: 33,-9 - - node: - color: '#52B4E996' - id: QuarterTileOverlayGreyscale180 - decals: - 207: -5,-36 - 213: -6,-36 - 214: -7,-36 - 215: -8,-36 - 216: -9,-36 - 217: -10,-36 - 219: -4,-36 - 259: -8,-38 - 271: -11,-36 - 312: -12,-36 - 323: -23,-32 - 324: -24,-32 - 325: -25,-32 - 326: -26,-32 - 327: -27,-32 - 328: -28,-32 - 329: -29,-32 - 330: -32,-32 - 331: -33,-32 - 332: -31,-32 - 333: -30,-32 - 334: -13,-36 - 355: -22,-32 - 356: -21,-37 - 357: -21,-38 - 358: -21,-39 - 359: -21,-40 - 366: -20,-40 - 367: -22,-40 - 368: -22,-33 - 372: -12,-32 - 374: -13,-32 - 376: -13,-33 - 382: -19,-32 - 383: -19,-31 - 384: -19,-30 - 385: -19,-29 - 386: -20,-28 - 387: -21,-28 - 388: -22,-28 - 389: -23,-28 - 390: -18,-28 - 391: -17,-28 - 392: -16,-28 - 393: -15,-28 - 402: -19,-28 - 533: -31,-31 - 534: -31,-33 - 537: -22,-36 - 538: -22,-35 - 539: -24,-28 - 550: -14,-28 - 562: -27,-40 - 580: -12,-31 - 592: -12,-33 - 3087: -36,-32 - 3088: -37,-32 - 3089: -38,-32 - 3095: -35,-32 - 3097: -34,-32 + 382: -20,-28 + 383: -21,-28 + 384: -22,-28 + 385: -23,-28 + 386: -18,-28 + 387: -17,-28 + 388: -16,-28 + 389: -15,-28 + 398: -19,-28 + 529: -31,-31 + 530: -31,-33 + 533: -22,-36 + 534: -22,-35 + 535: -24,-28 + 546: -14,-28 + 558: -27,-40 + 576: -12,-31 + 588: -12,-33 + 3082: -36,-32 + 3083: -37,-32 + 3084: -38,-32 + 3090: -35,-32 + 3092: -34,-32 - node: color: '#639137FF' id: QuarterTileOverlayGreyscale180 decals: - 650: 4,22 + 646: 4,22 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale180 decals: - 837: -14,-48 + 833: -14,-48 - node: color: '#D4D4D428' id: QuarterTileOverlayGreyscale180 decals: - 1052: -18,-1 - 1053: -19,-1 - 1054: -20,-1 - 1055: -21,-1 - 1056: -22,-1 - 1057: -23,-1 - 1058: -27,-1 - 1059: -28,-1 - 1060: -29,-1 - 1061: -29,-2 - 1062: -31,-2 - 1064: -33,-2 - 1067: -34,-1 - 1068: -35,-1 - 1069: -36,-1 - 1070: -37,-1 - 1071: -38,-1 - 1072: -39,-1 - 1073: -40,-1 - 1074: -41,-1 - 1075: -41,-2 - 1076: -41,-3 - 1077: -41,-4 - 1078: -41,-5 - 1079: -41,-6 - 1080: -41,-7 - 1081: -41,-8 - 1082: -41,-9 - 1083: -41,-10 - 1084: -41,-13 - 1085: -41,-14 - 1086: -41,-15 - 1087: -41,-16 - 1088: -41,-17 - 1089: -41,-18 - 1090: -41,-19 - 1091: -41,-20 - 1092: -41,-21 - 1093: -41,-22 - 1094: -41,-23 - 1095: -41,-24 - 1096: -41,-25 - 1097: -41,-26 - 1098: -41,-27 - 1099: -41,-28 - 1100: -41,-29 - 1101: -41,-30 - 1102: -41,-31 - 1103: -43,-31 - 1170: -9,53 - 1171: -9,52 - 1172: -9,51 - 1188: 1,53 - 1213: 2,31 - 1216: -2,31 - 1279: 52,-1 - 1280: 51,-1 - 1281: 50,-1 - 1282: 49,-1 - 1283: 48,-1 - 1284: 47,-2 - 1285: 47,-3 - 1286: 46,-3 - 1287: 44,-1 - 1288: 42,-1 - 1289: 39,-1 - 1290: 38,-1 - 1291: 37,-1 - 1292: 36,-1 - 1293: 35,-1 - 1294: 34,-1 - 1295: 33,-1 - 1296: 32,-1 - 1297: 31,-1 - 1298: 29,-1 - 1299: 28,-2 - 1300: 27,-2 - 1301: 26,-2 - 1302: 25,-1 - 1303: 24,-1 - 1304: 23,-1 - 1305: 22,-1 - 1306: 21,-1 - 1307: 20,-1 - 1308: 19,-1 - 1309: 18,-1 - 1312: 45,-3 - 1327: 57,2 - 1328: 57,1 - 1329: 57,0 - 1330: 57,-1 - 1345: 61,5 - 1346: 61,4 - 1347: 61,3 - 1348: 61,2 - 1349: 61,1 - 1353: 62,-1 - 1354: 30,-1 - 1935: 1,-19 - 1936: 1,-20 - 1937: 1,-18 - 1938: 1,-21 - 1939: 1,-22 - 1940: 1,-23 - 1941: 2,-26 - 1942: 2,-28 - 1943: 1,-29 - 1944: 1,-30 - 1945: 1,-31 - 1946: 1,-32 - 1985: 4,-83 - 1986: 3,-83 - 2007: 2,-63 - 2008: 1,-63 - 2009: 0,-63 - 2010: -1,-63 - 2011: -2,-63 - 2018: -3,-63 - 2098: 1,-33 - 2099: 1,-34 - 2100: 1,-35 - 2101: 1,-36 - 2102: 1,-37 - 2103: 1,-38 - 2104: 1,-39 - 2105: 1,-40 - 2125: 1,-25 + 1048: -18,-1 + 1049: -19,-1 + 1050: -20,-1 + 1051: -21,-1 + 1052: -22,-1 + 1053: -23,-1 + 1054: -27,-1 + 1055: -28,-1 + 1056: -29,-1 + 1057: -29,-2 + 1058: -31,-2 + 1060: -33,-2 + 1063: -34,-1 + 1064: -35,-1 + 1065: -36,-1 + 1066: -37,-1 + 1067: -38,-1 + 1068: -39,-1 + 1069: -40,-1 + 1070: -41,-1 + 1071: -41,-2 + 1072: -41,-3 + 1073: -41,-4 + 1074: -41,-5 + 1075: -41,-6 + 1076: -41,-7 + 1077: -41,-8 + 1078: -41,-9 + 1079: -41,-10 + 1080: -41,-13 + 1081: -41,-14 + 1082: -41,-15 + 1083: -41,-16 + 1084: -41,-17 + 1085: -41,-18 + 1086: -41,-19 + 1087: -41,-20 + 1088: -41,-21 + 1089: -41,-22 + 1090: -41,-23 + 1091: -41,-24 + 1092: -41,-25 + 1093: -41,-26 + 1094: -41,-27 + 1095: -41,-28 + 1096: -41,-29 + 1097: -41,-30 + 1098: -41,-31 + 1099: -43,-31 + 1166: -9,53 + 1167: -9,52 + 1168: -9,51 + 1184: 1,53 + 1209: 2,31 + 1212: -2,31 + 1275: 52,-1 + 1276: 51,-1 + 1277: 50,-1 + 1278: 49,-1 + 1279: 48,-1 + 1280: 47,-2 + 1281: 47,-3 + 1282: 46,-3 + 1283: 44,-1 + 1284: 42,-1 + 1285: 39,-1 + 1286: 38,-1 + 1287: 37,-1 + 1288: 36,-1 + 1289: 35,-1 + 1290: 34,-1 + 1291: 33,-1 + 1292: 32,-1 + 1293: 31,-1 + 1294: 29,-1 + 1295: 28,-2 + 1296: 27,-2 + 1297: 26,-2 + 1298: 25,-1 + 1299: 24,-1 + 1300: 23,-1 + 1301: 22,-1 + 1302: 21,-1 + 1303: 20,-1 + 1304: 19,-1 + 1305: 18,-1 + 1308: 45,-3 + 1323: 57,2 + 1324: 57,1 + 1325: 57,0 + 1326: 57,-1 + 1341: 61,5 + 1342: 61,4 + 1343: 61,3 + 1344: 61,2 + 1345: 61,1 + 1349: 62,-1 + 1350: 30,-1 + 1931: 1,-19 + 1932: 1,-20 + 1933: 1,-18 + 1934: 1,-21 + 1935: 1,-22 + 1936: 1,-23 + 1937: 2,-26 + 1938: 2,-28 + 1939: 1,-29 + 1940: 1,-30 + 1941: 1,-31 + 1942: 1,-32 + 1981: 4,-83 + 1982: 3,-83 + 2003: 2,-63 + 2004: 1,-63 + 2005: 0,-63 + 2006: -1,-63 + 2007: -2,-63 + 2014: -3,-63 + 2094: 1,-33 + 2095: 1,-34 + 2096: 1,-35 + 2097: 1,-36 + 2098: 1,-37 + 2099: 1,-38 + 2100: 1,-39 + 2101: 1,-40 + 2121: 1,-25 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 decals: - 1356: 30,-9 - 1360: 30,-7 - 1361: 30,-4 - 1364: 30,-6 + 1352: 30,-9 + 1356: 30,-7 + 1357: 30,-4 + 1360: 30,-6 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale270 decals: - 260: -7,-38 - 564: -25,-40 - 749: -2,-36 - 3092: -37,-32 + 256: -7,-38 + 560: -25,-40 + 745: -2,-36 + 3087: -37,-32 - node: color: '#639137FF' id: QuarterTileOverlayGreyscale270 decals: - 649: 9,22 + 645: 9,22 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale270 decals: - 838: -11,-48 + 834: -11,-48 - node: color: '#D4D4D428' id: QuarterTileOverlayGreyscale270 decals: - 1030: -48,3 - 1063: -31,-2 - 1065: -33,-2 - 1105: -43,-29 - 1106: -43,-28 - 1107: -43,-27 - 1108: -43,-26 - 1109: -43,-25 - 1110: -43,-24 - 1111: -43,-23 - 1112: -43,-22 - 1113: -43,-21 - 1114: -43,-20 - 1115: -43,-19 - 1116: -43,-18 - 1117: -43,-14 - 1118: -43,-13 - 1119: -43,-12 - 1120: -43,-8 - 1121: -43,-7 - 1122: -43,-6 - 1123: -44,-5 - 1124: -45,-5 - 1125: -46,-5 - 1126: -47,-5 - 1127: -48,-5 - 1128: -43,-5 - 1129: -29,-2 - 1149: -4,49 - 1150: -5,49 - 1151: -6,49 - 1152: -7,49 - 1153: -8,49 - 1154: -9,49 - 1155: -10,49 - 1156: -11,49 - 1157: -12,49 - 1158: -13,49 - 1159: -13,50 - 1160: -13,51 - 1161: -13,52 - 1162: -13,53 - 1214: 2,31 - 1215: -2,31 - 1273: 53,-3 - 1274: 54,-4 - 1275: 55,-5 - 1276: 56,-6 - 1277: 53,-1 - 1278: 53,-2 - 1310: 41,-1 - 1311: 45,-3 - 1325: 59,2 - 1331: 59,-1 - 1332: 59,0 - 1333: 59,1 - 1334: 61,-6 - 1351: 62,-1 - 2012: -8,-63 - 2013: -7,-63 - 2014: -6,-63 - 2015: -5,-63 - 2016: -4,-63 - 2017: -3,-63 - 2039: -9,-83 - 2040: -10,-83 - 2087: -1,-32 - 2088: -1,-31 - 2089: -1,-29 - 2090: -1,-30 - 2091: -1,-26 - 2092: -2,-23 - 2093: -2,-22 - 2094: -1,-21 - 2095: -1,-20 - 2096: -1,-19 - 2097: -1,-18 - 2118: 4,-51 - 2119: 3,-51 - 2120: 2,-51 - 2121: -1,-24 - 2122: -1,-25 - 2123: -1,-27 - 2124: -1,-28 + 1026: -48,3 + 1059: -31,-2 + 1061: -33,-2 + 1101: -43,-29 + 1102: -43,-28 + 1103: -43,-27 + 1104: -43,-26 + 1105: -43,-25 + 1106: -43,-24 + 1107: -43,-23 + 1108: -43,-22 + 1109: -43,-21 + 1110: -43,-20 + 1111: -43,-19 + 1112: -43,-18 + 1113: -43,-14 + 1114: -43,-13 + 1115: -43,-12 + 1116: -43,-8 + 1117: -43,-7 + 1118: -43,-6 + 1119: -44,-5 + 1120: -45,-5 + 1121: -46,-5 + 1122: -47,-5 + 1123: -48,-5 + 1124: -43,-5 + 1125: -29,-2 + 1145: -4,49 + 1146: -5,49 + 1147: -6,49 + 1148: -7,49 + 1149: -8,49 + 1150: -9,49 + 1151: -10,49 + 1152: -11,49 + 1153: -12,49 + 1154: -13,49 + 1155: -13,50 + 1156: -13,51 + 1157: -13,52 + 1158: -13,53 + 1210: 2,31 + 1211: -2,31 + 1269: 53,-3 + 1270: 54,-4 + 1271: 55,-5 + 1272: 56,-6 + 1273: 53,-1 + 1274: 53,-2 + 1306: 41,-1 + 1307: 45,-3 + 1321: 59,2 + 1327: 59,-1 + 1328: 59,0 + 1329: 59,1 + 1330: 61,-6 + 1347: 62,-1 + 2008: -8,-63 + 2009: -7,-63 + 2010: -6,-63 + 2011: -5,-63 + 2012: -4,-63 + 2013: -3,-63 + 2035: -9,-83 + 2036: -10,-83 + 2083: -1,-32 + 2084: -1,-31 + 2085: -1,-29 + 2086: -1,-30 + 2087: -1,-26 + 2088: -2,-23 + 2089: -2,-22 + 2090: -1,-21 + 2091: -1,-20 + 2092: -1,-19 + 2093: -1,-18 + 2114: 4,-51 + 2115: 3,-51 + 2116: 2,-51 + 2117: -1,-24 + 2118: -1,-25 + 2119: -1,-27 + 2120: -1,-28 - node: color: '#D4D4D433' id: QuarterTileOverlayGreyscale270 decals: - 3192: -3,49 - 3193: -2,49 - 3194: -1,49 + 3187: -3,49 + 3188: -2,49 + 3189: -1,49 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 decals: - 2790: 57,-9 + 2785: 57,-9 - node: color: '#1D1D21FF' id: QuarterTileOverlayGreyscale90 decals: - 2491: 42,40 + 2487: 42,40 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 decals: - 640: 27,8 - 1358: 33,-3 + 636: 27,8 + 1354: 33,-3 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale90 decals: - 258: -8,-40 - 563: -27,-42 - 3091: -38,-33 + 254: -8,-40 + 559: -27,-42 + 3086: -38,-33 - node: color: '#9FED5896' id: QuarterTileOverlayGreyscale90 decals: - 499: -32,-20 + 495: -32,-20 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale90 decals: - 844: -14,-50 + 840: -14,-50 - node: color: '#D4D4D428' id: QuarterTileOverlayGreyscale90 decals: - 1032: -48,3 - 1033: -47,3 - 1034: -46,3 - 1035: -46,2 - 1036: -46,1 - 1037: -45,1 - 1038: -34,1 - 1039: -33,1 - 1040: -32,1 - 1041: -31,1 - 1042: -30,1 - 1043: -29,1 - 1044: -28,1 - 1045: -27,1 - 1046: -23,1 - 1047: -22,1 - 1048: -21,1 - 1049: -20,1 - 1050: -19,1 - 1051: -18,1 - 1104: -44,-30 - 1130: -29,-2 - 1164: -13,53 - 1169: -9,53 - 1186: 1,53 - 1189: 1,52 - 1190: 1,51 - 1191: 1,50 - 1192: 1,48 - 1193: 1,47 - 1194: 1,46 - 1195: 1,45 - 1196: 1,44 - 1197: 1,43 - 1198: 1,42 - 1199: 1,41 - 1200: 1,40 - 1201: 1,39 - 1202: 1,38 - 1203: 2,38 - 1204: 2,37 - 1205: 2,37 - 1206: 2,36 - 1207: 2,35 - 1208: 2,34 - 1209: 2,33 - 1210: 2,32 - 1211: 2,31 - 1212: 1,30 - 1217: 1,29 - 1218: 1,25 - 1219: 1,24 - 1220: 1,23 - 1221: 1,22 - 1222: 1,21 - 1223: 1,20 - 1224: 1,20 - 1225: 1,19 - 1226: 1,18 - 1227: 2,26 - 1228: 2,27 - 1233: 18,1 - 1234: 19,1 - 1235: 20,1 - 1236: 21,1 - 1237: 22,1 - 1238: 23,1 - 1239: 24,1 - 1240: 25,1 - 1241: 26,1 - 1242: 27,1 - 1243: 28,1 - 1244: 29,1 - 1245: 30,1 - 1246: 31,1 - 1247: 32,1 - 1248: 33,1 - 1249: 34,2 - 1250: 35,2 - 1251: 36,2 - 1252: 37,1 - 1253: 38,1 - 1254: 39,1 - 1255: 40,1 - 1256: 41,1 - 1257: 42,1 - 1258: 43,1 - 1259: 44,1 - 1260: 45,1 - 1261: 46,1 - 1262: 47,1 - 1263: 48,1 - 1264: 49,1 - 1265: 50,1 - 1266: 51,1 - 1267: 52,1 - 1324: 57,-3 - 1335: 61,-6 - 1336: 61,-5 - 1337: 61,-4 - 1338: 61,-3 - 1339: 61,-2 - 1352: 62,0 - 1947: 1,-52 - 1948: 1,-53 - 1949: 1,-54 - 1950: 1,-55 - 1951: 1,-56 - 1952: 1,-57 - 1953: 1,-58 - 1954: 1,-59 - 1955: 1,-60 - 1956: 2,-60 - 1957: 3,-60 - 1958: 4,-60 - 1959: 4,-61 - 1960: 4,-62 - 1961: 4,-63 - 1962: 4,-64 - 1963: 4,-65 - 1964: 4,-66 - 1965: 4,-68 - 1966: 5,-68 - 1967: 5,-69 - 1968: 5,-70 - 1969: 4,-71 - 1970: 4,-67 - 1971: 4,-72 - 1972: 4,-73 - 1973: 4,-74 - 1974: 4,-75 - 1975: 5,-75 - 1976: 5,-76 - 1977: 5,-77 - 1978: 4,-78 - 1979: 4,-79 - 1980: 4,-80 - 1981: 4,-81 - 1982: 5,-81 - 1983: 5,-82 - 1984: 5,-83 - 2019: -9,-64 - 2020: -9,-65 - 2021: -9,-66 - 2022: -9,-67 - 2023: -9,-68 - 2024: -9,-69 - 2025: -9,-70 - 2026: -9,-71 - 2027: -9,-72 - 2028: -9,-73 - 2029: -9,-74 - 2030: -9,-75 - 2031: -9,-76 - 2032: -9,-77 - 2033: -9,-78 - 2034: -9,-79 - 2035: -9,-80 - 2036: -9,-81 - 2037: -9,-82 - 2038: -9,-83 - 2106: 1,-41 - 2107: 2,-42 - 2108: 3,-42 - 2109: 3,-43 - 2110: 3,-44 - 2111: 3,-45 - 2112: 3,-46 - 2113: 3,-47 - 2114: 3,-48 - 2115: 4,-49 - 2116: 4,-50 - 2117: 4,-51 + 1028: -48,3 + 1029: -47,3 + 1030: -46,3 + 1031: -46,2 + 1032: -46,1 + 1033: -45,1 + 1034: -34,1 + 1035: -33,1 + 1036: -32,1 + 1037: -31,1 + 1038: -30,1 + 1039: -29,1 + 1040: -28,1 + 1041: -27,1 + 1042: -23,1 + 1043: -22,1 + 1044: -21,1 + 1045: -20,1 + 1046: -19,1 + 1047: -18,1 + 1100: -44,-30 + 1126: -29,-2 + 1160: -13,53 + 1165: -9,53 + 1182: 1,53 + 1185: 1,52 + 1186: 1,51 + 1187: 1,50 + 1188: 1,48 + 1189: 1,47 + 1190: 1,46 + 1191: 1,45 + 1192: 1,44 + 1193: 1,43 + 1194: 1,42 + 1195: 1,41 + 1196: 1,40 + 1197: 1,39 + 1198: 1,38 + 1199: 2,38 + 1200: 2,37 + 1201: 2,37 + 1202: 2,36 + 1203: 2,35 + 1204: 2,34 + 1205: 2,33 + 1206: 2,32 + 1207: 2,31 + 1208: 1,30 + 1213: 1,29 + 1214: 1,25 + 1215: 1,24 + 1216: 1,23 + 1217: 1,22 + 1218: 1,21 + 1219: 1,20 + 1220: 1,20 + 1221: 1,19 + 1222: 1,18 + 1223: 2,26 + 1224: 2,27 + 1229: 18,1 + 1230: 19,1 + 1231: 20,1 + 1232: 21,1 + 1233: 22,1 + 1234: 23,1 + 1235: 24,1 + 1236: 25,1 + 1237: 26,1 + 1238: 27,1 + 1239: 28,1 + 1240: 29,1 + 1241: 30,1 + 1242: 31,1 + 1243: 32,1 + 1244: 33,1 + 1245: 34,2 + 1246: 35,2 + 1247: 36,2 + 1248: 37,1 + 1249: 38,1 + 1250: 39,1 + 1251: 40,1 + 1252: 41,1 + 1253: 42,1 + 1254: 43,1 + 1255: 44,1 + 1256: 45,1 + 1257: 46,1 + 1258: 47,1 + 1259: 48,1 + 1260: 49,1 + 1261: 50,1 + 1262: 51,1 + 1263: 52,1 + 1320: 57,-3 + 1331: 61,-6 + 1332: 61,-5 + 1333: 61,-4 + 1334: 61,-3 + 1335: 61,-2 + 1348: 62,0 + 1943: 1,-52 + 1944: 1,-53 + 1945: 1,-54 + 1946: 1,-55 + 1947: 1,-56 + 1948: 1,-57 + 1949: 1,-58 + 1950: 1,-59 + 1951: 1,-60 + 1952: 2,-60 + 1953: 3,-60 + 1954: 4,-60 + 1955: 4,-61 + 1956: 4,-62 + 1957: 4,-63 + 1958: 4,-64 + 1959: 4,-65 + 1960: 4,-66 + 1961: 4,-68 + 1962: 5,-68 + 1963: 5,-69 + 1964: 5,-70 + 1965: 4,-71 + 1966: 4,-67 + 1967: 4,-72 + 1968: 4,-73 + 1969: 4,-74 + 1970: 4,-75 + 1971: 5,-75 + 1972: 5,-76 + 1973: 5,-77 + 1974: 4,-78 + 1975: 4,-79 + 1976: 4,-80 + 1977: 4,-81 + 1978: 5,-81 + 1979: 5,-82 + 1980: 5,-83 + 2015: -9,-64 + 2016: -9,-65 + 2017: -9,-66 + 2018: -9,-67 + 2019: -9,-68 + 2020: -9,-69 + 2021: -9,-70 + 2022: -9,-71 + 2023: -9,-72 + 2024: -9,-73 + 2025: -9,-74 + 2026: -9,-75 + 2027: -9,-76 + 2028: -9,-77 + 2029: -9,-78 + 2030: -9,-79 + 2031: -9,-80 + 2032: -9,-81 + 2033: -9,-82 + 2034: -9,-83 + 2102: 1,-41 + 2103: 2,-42 + 2104: 3,-42 + 2105: 3,-43 + 2106: 3,-44 + 2107: 3,-45 + 2108: 3,-46 + 2109: 3,-47 + 2110: 3,-48 + 2111: 4,-49 + 2112: 4,-50 + 2113: 4,-51 - node: color: '#D4D4D433' id: QuarterTileOverlayGreyscale90 decals: - 3195: 1,49 - 3266: -35,1 + 3190: 1,49 + 3261: -35,1 - node: color: '#FFFFFFFF' id: Rock06 decals: - 2741: -6.549043,-18.995234 + 2736: -6.549043,-18.995234 - node: color: '#FFFFFFFF' id: Rock07 decals: - 2742: -10.21571,-19.245234 - 2743: -19.922543,-12.716649 - 2744: -18.60001,-10.259648 - 2745: -18.846893,-8.106161 + 2737: -10.21571,-19.245234 + 2738: -19.922543,-12.716649 + 2739: -18.60001,-10.259648 + 2740: -18.846893,-8.106161 - node: color: '#FFFFFFFF' id: SpaceStationSign1 decals: - 967: 31,0 + 963: 31,0 - node: color: '#FFFFFFFF' id: SpaceStationSign2 decals: - 966: 32,0 + 962: 32,0 - node: color: '#FFFFFFFF' id: SpaceStationSign3 decals: - 965: 33,0 + 961: 33,0 - node: color: '#FFFFFFFF' id: SpaceStationSign4 decals: - 964: 34,0 + 960: 34,0 - node: color: '#FFFFFFFF' id: SpaceStationSign5 decals: - 963: 35,0 + 959: 35,0 - node: color: '#FFFFFFFF' id: SpaceStationSign6 decals: - 962: 36,0 + 958: 36,0 - node: color: '#FFFFFFFF' id: SpaceStationSign7 decals: - 961: 37,0 + 957: 37,0 - node: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: StandClearGreyscale decals: - 3426: -56,-4 + 3421: -56,-4 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale decals: - 593: 19,9 + 589: 19,9 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale decals: - 335: -21,-33 + 331: -21,-33 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale decals: - 672: 3,24 + 668: 3,24 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale decals: - 179: -33,-15 - 180: -33,-11 - 181: -30,-11 - 182: -27,-19 - 206: -27,-11 - 493: -33,-23 + 175: -33,-15 + 176: -33,-11 + 177: -30,-11 + 178: -27,-19 + 202: -27,-11 + 489: -33,-23 - node: color: '#C6FF91FF' id: ThreeQuarterTileOverlayGreyscale decals: - 3082: -39,-31 + 3077: -39,-31 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale180 decals: - 635: 27,4 - 636: 28,5 - 637: 28,5 + 631: 27,4 + 632: 28,5 + 633: 28,5 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale180 decals: - 500: -14,-36 - 551: -12,-28 + 496: -14,-36 + 547: -12,-28 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale180 decals: - 675: 10,19 + 671: 10,19 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale180 decals: - 172: -29,-21 - 191: -25,-21 - 192: -25,-13 - 193: -29,-13 - 194: -32,-13 - 495: -29,-24 - 496: -32,-16 + 168: -29,-21 + 187: -25,-21 + 188: -25,-13 + 189: -29,-13 + 190: -32,-13 + 491: -29,-24 + 492: -32,-16 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale270 decals: - 594: 19,4 + 590: 19,4 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale270 decals: - 337: -21,-36 + 333: -21,-36 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale270 decals: - 674: 3,19 + 670: 3,19 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale270 decals: - 173: -33,-21 - 187: -33,-13 - 188: -30,-13 - 189: -27,-13 - 190: -27,-21 - 492: -33,-24 - 497: -30,-16 + 169: -33,-21 + 183: -33,-13 + 184: -30,-13 + 185: -27,-13 + 186: -27,-21 + 488: -33,-24 + 493: -30,-16 - node: color: '#C6FF91FF' id: ThreeQuarterTileOverlayGreyscale270 decals: - 3073: -39,-35 + 3068: -39,-35 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale90 decals: - 638: 28,8 - 639: 27,9 + 634: 28,8 + 635: 27,9 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale90 decals: - 336: -14,-33 + 332: -14,-33 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale90 decals: - 673: 10,24 + 669: 10,24 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale90 decals: - 183: -25,-11 - 184: -25,-19 - 185: -29,-11 - 186: -32,-11 - 494: -29,-23 - 3093: -35,-31 + 179: -25,-11 + 180: -25,-19 + 181: -29,-11 + 182: -32,-11 + 490: -29,-23 + 3088: -35,-31 + - node: + color: '#FFFFFFFF' + id: WarnCornerGreyscaleNW + decals: + 3739: -6,-26 + - node: + color: '#FFFFFFFF' + id: WarnCornerSmallGreyscaleNW + decals: + 3755: -6,-29 - node: color: '#FFFFFFFF' id: WarnCornerSmallNE decals: - 3399: -58,-13 + 3394: -58,-13 - node: color: '#FFFFFFFF' id: WarnCornerSmallNW decals: - 992: -56,-7 - 996: -56,-3 - 1012: -54,-13 + 988: -56,-7 + 992: -56,-3 + 1008: -54,-13 - node: color: '#FFFFFFFF' id: WarnCornerSmallSE decals: - 3398: -58,-8 + 3393: -58,-8 - node: color: '#FFFFFFFF' id: WarnCornerSmallSW decals: - 990: -56,-1 - 991: -56,-1 - 997: -56,-5 - 1011: -54,-8 + 986: -56,-1 + 987: -56,-1 + 993: -56,-5 + 1007: -54,-8 - node: color: '#FFFFFFFF' id: WarnFull decals: - 2537: 12,53 - 2538: 13,53 - 2539: 14,53 + 2533: 12,53 + 2534: 13,53 + 2535: 14,53 - node: color: '#BC863FFF' id: WarnFullGreyscale decals: - 3422: -51,-1 - 3423: -51,0 - 3424: -52,-1 - 3425: -52,0 + 3417: -51,-1 + 3418: -51,0 + 3419: -52,-1 + 3420: -52,0 - node: color: '#FFFFFFFF' id: WarnLineE decals: - 2519: 9,49 - 2521: 19,49 - 2522: 19,48 - 2523: 19,47 - 2524: 19,46 - 3393: -58,-12 - 3394: -58,-11 - 3395: -58,-10 - 3396: -58,-9 + 2515: 9,49 + 2517: 19,49 + 2518: 19,48 + 2519: 19,47 + 2520: 19,46 + 3388: -58,-12 + 3389: -58,-11 + 3390: -58,-10 + 3391: -58,-9 + - node: + color: '#FFFFFFFF' + id: WarnLineGreyscaleN + decals: + 3740: -5,-26 + 3741: -4,-26 + 3742: -3,-26 + 3752: -9,-29 + 3753: -8,-29 + 3754: -7,-29 + - node: + color: '#FFFFFFFF' + id: WarnLineGreyscaleS + decals: + 3745: -9,-30 + 3746: -8,-30 + 3747: -7,-30 + 3748: -6,-30 + 3749: -5,-30 + 3750: -4,-30 + 3751: -3,-30 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleW decals: - 993: -56,-5 - 994: -56,-4 - 995: -56,-3 + 989: -56,-5 + 990: -56,-4 + 991: -56,-3 + 3743: -6,-27 + 3744: -6,-28 - node: color: '#FFFFFFFF' id: WarnLineN decals: - 987: -57,-1 - 1001: -57,-8 - 1002: -56,-8 - 1003: -56,-8 - 1004: -55,-8 - 3400: -58,-1 + 983: -57,-1 + 997: -57,-8 + 998: -56,-8 + 999: -56,-8 + 1000: -55,-8 + 3395: -58,-1 - node: color: '#FFFFFFFF' id: WarnLineS decals: - 988: -56,-6 - 989: -56,-2 - 1005: -54,-10 - 1006: -54,-11 - 1007: -54,-12 - 2520: 17,49 - 3397: -54,-9 + 984: -56,-6 + 985: -56,-2 + 1001: -54,-10 + 1002: -54,-11 + 1003: -54,-12 + 2516: 17,49 + 3392: -54,-9 - node: color: '#FFFFFFFF' id: WarnLineW decals: - 986: -57,-7 - 1008: -55,-13 - 1009: -56,-13 - 1010: -57,-13 - 2516: 12,46 - 2517: 13,46 - 2518: 14,46 - 2529: 7,51 - 2530: 8,51 - 2531: 9,51 - 2532: 17,51 - 2533: 18,51 - 2534: 19,51 - 2535: 15,53 - 2536: 11,53 - 3401: -58,-7 + 982: -57,-7 + 1004: -55,-13 + 1005: -56,-13 + 1006: -57,-13 + 2512: 12,46 + 2513: 13,46 + 2514: 14,46 + 2525: 7,51 + 2526: 8,51 + 2527: 9,51 + 2528: 17,51 + 2529: 18,51 + 2530: 19,51 + 2531: 15,53 + 2532: 11,53 + 3396: -58,-7 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNe decals: - 277: -30,-39 - 297: -29,-35 - 696: 37,-7 - 702: 44,-5 - 750: -4,38 - 751: -12,33 - 792: -16,32 - 808: -19,-3 - 862: -49,7 - 865: -53,12 - 866: -51,10 - 908: 36,18 - 915: 40,16 - 935: 44,-9 - 942: 17,-30 - 943: 20,-30 - 2888: 41,23 - 3123: 19,37 + 273: -30,-39 + 293: -29,-35 + 692: 37,-7 + 698: 44,-5 + 746: -4,38 + 747: -12,33 + 788: -16,32 + 804: -19,-3 + 858: -49,7 + 861: -53,12 + 862: -51,10 + 904: 36,18 + 911: 40,16 + 931: 44,-9 + 938: 17,-30 + 939: 20,-30 + 2883: 41,23 + 3118: 19,37 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNw decals: - 280: -31,-39 - 281: -31,-39 - 298: -33,-35 - 689: 35,-7 - 690: 35,-3 - 703: 39,-5 - 752: -14,38 - 753: -14,33 - 793: -19,32 - 809: -22,-3 - 861: -50,7 - 867: -55,12 - 868: -57,10 - 909: 35,18 - 916: 38,16 - 917: 35,15 - 932: 42,-9 - 944: 13,-30 - 945: 19,-30 - 2889: 39,23 - 3124: 12,37 + 276: -31,-39 + 277: -31,-39 + 294: -33,-35 + 685: 35,-7 + 686: 35,-3 + 699: 39,-5 + 748: -14,38 + 749: -14,33 + 789: -19,32 + 805: -22,-3 + 857: -50,7 + 863: -55,12 + 864: -57,10 + 905: 35,18 + 912: 38,16 + 913: 35,15 + 928: 42,-9 + 940: 13,-30 + 941: 19,-30 + 2884: 39,23 + 3119: 12,37 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSe decals: - 279: -30,-41 - 308: -29,-37 - 700: 37,-5 - 715: 44,-7 - 754: -12,31 - 755: -4,31 - 794: -16,27 - 810: -19,-5 - 859: -49,5 - 870: -51,9 - 900: 41,18 - 911: 36,17 - 912: 40,11 - 933: 44,-10 - 946: 17,-32 - 947: 20,-32 - 3134: 19,36 + 275: -30,-41 + 304: -29,-37 + 696: 37,-5 + 711: 44,-7 + 750: -12,31 + 751: -4,31 + 790: -16,27 + 806: -19,-5 + 855: -49,5 + 866: -51,9 + 896: 41,18 + 907: 36,17 + 908: 40,11 + 929: 44,-10 + 942: 17,-32 + 943: 20,-32 + 3129: 19,36 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSw decals: - 278: -31,-41 - 306: -33,-37 - 687: 35,-5 - 688: 35,-9 - 704: 39,-7 - 756: -14,31 - 757: -14,35 - 758: -10,31 - 795: -19,27 - 811: -22,-5 - 860: -50,5 - 869: -57,9 - 899: 39,18 - 910: 35,17 - 913: 38,11 - 914: 35,12 - 934: 42,-10 - 948: 13,-32 - 949: 19,-32 + 274: -31,-41 + 302: -33,-37 + 683: 35,-5 + 684: 35,-9 + 700: 39,-7 + 752: -14,31 + 753: -14,35 + 754: -10,31 + 791: -19,27 + 807: -22,-5 + 856: -50,5 + 865: -57,9 + 895: 39,18 + 906: 35,17 + 909: 38,11 + 910: 35,12 + 930: 42,-10 + 944: 13,-32 + 945: 19,-32 - node: color: '#FFFFFFFF' id: WoodTrimThinEndE decals: - 682: 38,-3 - 683: 38,-9 + 678: 38,-3 + 679: 38,-9 - node: color: '#FFFFFFFF' id: WoodTrimThinEndN decals: - 930: 46,-5 + 926: 46,-5 - node: color: '#FFFFFFFF' id: WoodTrimThinEndS decals: - 931: 46,-6 + 927: 46,-6 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNe decals: - 698: 37,-9 - 881: -53,10 + 694: 37,-9 + 877: -53,10 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNw decals: - 882: -55,10 - 929: 38,15 + 878: -55,10 + 925: 38,15 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSe decals: - 701: 37,-3 - 3136: 17,36 + 697: 37,-3 + 3131: 17,36 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSw decals: - 788: -10,35 - 928: 38,12 + 784: -10,35 + 924: 38,12 - node: color: '#FFFFFFFF' id: WoodTrimThinLineE decals: - 276: -32,-39 - 282: -30,-40 - 283: -32.14971,-38.99947 - 284: -32.14971,-38.99947 - 285: -32,-41 - 286: -32,-40 - 287: -32.150627,-40.002556 - 288: -32.150627,-40.99947 - 289: -32.296745,-39.00201 - 290: -32.293655,-40.00201 - 291: -32.29232,-41.003887 - 309: -29,-36 - 697: 37,-8 - 699: 37,-4 - 716: 44,-6 - 765: -4,32 - 766: -4,33 - 767: -4,34 - 768: -4,35 - 769: -4,36 - 770: -4,37 - 771: -12,32 - 796: -16,31 - 797: -16,30 - 798: -16,29 - 799: -16,28 - 812: -19,-4 - 864: -49,6 - 880: -53,11 - 901: 41,19 - 902: 41,20 - 903: 41,21 - 918: 40,14 - 919: 40,15 - 920: 40,12 - 921: 40,13 - 950: 20,-31 - 951: 17,-31 - 2890: 41,22 - 3125: 17,35 + 272: -32,-39 + 278: -30,-40 + 279: -32.14971,-38.99947 + 280: -32.14971,-38.99947 + 281: -32,-41 + 282: -32,-40 + 283: -32.150627,-40.002556 + 284: -32.150627,-40.99947 + 285: -32.296745,-39.00201 + 286: -32.293655,-40.00201 + 287: -32.29232,-41.003887 + 305: -29,-36 + 693: 37,-8 + 695: 37,-4 + 712: 44,-6 + 761: -4,32 + 762: -4,33 + 763: -4,34 + 764: -4,35 + 765: -4,36 + 766: -4,37 + 767: -12,32 + 792: -16,31 + 793: -16,30 + 794: -16,29 + 795: -16,28 + 808: -19,-4 + 860: -49,6 + 876: -53,11 + 897: 41,19 + 898: 41,20 + 899: 41,21 + 914: 40,14 + 915: 40,15 + 916: 40,12 + 917: 40,13 + 946: 20,-31 + 947: 17,-31 + 2885: 41,22 + 3120: 17,35 - node: color: '#FFFFFFFF' id: WoodTrimThinLineN decals: - 295: -36,-39 - 296: -35,-39 - 299: -32,-35 - 300: -31,-35 - 301: -30,-35 - 691: 36,-3 - 692: 37,-3 - 695: 36,-7 - 710: 40,-5 - 711: 41,-5 - 712: 41,-5 - 713: 42,-5 - 714: 43,-5 - 772: -5,38 - 773: -6,38 - 774: -7,38 - 775: -8,38 - 776: -9,38 - 777: -10,38 - 778: -11,38 - 779: -12,38 - 780: -13,38 - 781: -13,33 - 802: -17,32 - 803: -18,32 - 816: -21,-3 - 817: -20,-3 - 818: -19,-3 - 876: -54,12 - 877: -56,10 - 878: -52,10 - 924: 36,15 - 925: 37,15 - 937: 43,-9 - 957: 14,-30 - 958: 15,-30 - 959: 15,-30 - 960: 16,-30 - 2892: 40,23 - 3128: 13,37 - 3129: 14,37 - 3130: 15,37 - 3131: 16,37 - 3132: 17,37 - 3133: 18,37 + 291: -36,-39 + 292: -35,-39 + 295: -32,-35 + 296: -31,-35 + 297: -30,-35 + 687: 36,-3 + 688: 37,-3 + 691: 36,-7 + 706: 40,-5 + 707: 41,-5 + 708: 41,-5 + 709: 42,-5 + 710: 43,-5 + 768: -5,38 + 769: -6,38 + 770: -7,38 + 771: -8,38 + 772: -9,38 + 773: -10,38 + 774: -11,38 + 775: -12,38 + 776: -13,38 + 777: -13,33 + 798: -17,32 + 799: -18,32 + 812: -21,-3 + 813: -20,-3 + 814: -19,-3 + 872: -54,12 + 873: -56,10 + 874: -52,10 + 920: 36,15 + 921: 37,15 + 933: 43,-9 + 953: 14,-30 + 954: 15,-30 + 955: 15,-30 + 956: 16,-30 + 2887: 40,23 + 3123: 13,37 + 3124: 14,37 + 3125: 15,37 + 3126: 16,37 + 3127: 17,37 + 3128: 18,37 - node: color: '#FFFFFFFF' id: WoodTrimThinLineS decals: - 292: -36,-38 - 293: -36,-38 - 294: -35,-38 - 302: -32,-37 - 303: -31,-37 - 304: -31,-37 - 305: -30,-37 - 684: 37,-9 - 685: 36,-9 - 686: 36,-5 - 706: 40,-7 - 707: 41,-7 - 708: 42,-7 - 709: 43,-7 - 759: -13,31 - 760: -9,31 - 761: -8,31 - 762: -7,31 - 763: -6,31 - 764: -5,31 - 789: -11,35 - 790: -12,35 - 791: -13,35 - 800: -17,27 - 801: -18,27 - 814: -21,-5 - 815: -20,-5 - 871: -56,9 - 872: -55,9 - 873: -54,9 - 874: -53,9 - 875: -52,9 - 904: 40,18 - 926: 36,12 - 927: 37,12 - 936: 43,-10 - 954: 14,-32 - 955: 15,-32 - 956: 16,-32 - 3135: 18,36 + 288: -36,-38 + 289: -36,-38 + 290: -35,-38 + 298: -32,-37 + 299: -31,-37 + 300: -31,-37 + 301: -30,-37 + 680: 37,-9 + 681: 36,-9 + 682: 36,-5 + 702: 40,-7 + 703: 41,-7 + 704: 42,-7 + 705: 43,-7 + 755: -13,31 + 756: -9,31 + 757: -8,31 + 758: -7,31 + 759: -6,31 + 760: -5,31 + 785: -11,35 + 786: -12,35 + 787: -13,35 + 796: -17,27 + 797: -18,27 + 810: -21,-5 + 811: -20,-5 + 867: -56,9 + 868: -55,9 + 869: -54,9 + 870: -53,9 + 871: -52,9 + 900: 40,18 + 922: 36,12 + 923: 37,12 + 932: 43,-10 + 950: 14,-32 + 951: 15,-32 + 952: 16,-32 + 3130: 18,36 - node: color: '#FFFFFFFF' id: WoodTrimThinLineW decals: - 275: -31,-40 - 307: -33,-36 - 693: 35,-4 - 694: 35,-8 - 705: 39,-6 - 782: -14,37 - 783: -14,36 - 784: -14,32 - 785: -10,32 - 786: -10,33 - 787: -10,34 - 804: -19,31 - 805: -19,30 - 806: -19,29 - 807: -19,28 - 813: -22,-4 - 863: -50,6 - 879: -55,11 - 905: 39,19 - 906: 39,20 - 907: 39,21 - 922: 35,13 - 923: 35,14 - 952: 19,-31 - 953: 13,-31 - 2891: 39,22 - 3126: 12,35 - 3127: 12,36 + 271: -31,-40 + 303: -33,-36 + 689: 35,-4 + 690: 35,-8 + 701: 39,-6 + 778: -14,37 + 779: -14,36 + 780: -14,32 + 781: -10,32 + 782: -10,33 + 783: -10,34 + 800: -19,31 + 801: -19,30 + 802: -19,29 + 803: -19,28 + 809: -22,-4 + 859: -50,6 + 875: -55,11 + 901: 39,19 + 902: 39,20 + 903: 39,21 + 918: 35,13 + 919: 35,14 + 948: 19,-31 + 949: 13,-31 + 2886: 39,22 + 3121: 12,35 + 3122: 12,36 - type: GridAtmosphere version: 2 data: @@ -7113,7 +7206,8 @@ entities: 4,15: 0: 44971 5,12: - 0: 65535 + 0: 65503 + 5: 32 5,13: 0: 15359 5,14: @@ -7202,10 +7296,10 @@ entities: 0: 34956 -11,2: 0: 8191 - 5: 57344 + 6: 57344 -11,3: 0: 65311 - 6: 224 + 7: 224 -12,4: 0: 53192 -12,7: @@ -7216,7 +7310,7 @@ entities: 0: 34952 -11,4: 0: 7967 - 7: 224 + 8: 224 4: 57344 -11,5: 0: 7967 @@ -7935,6 +8029,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14975 + moles: + - 20.078888 + - 75.53487 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -9897,7 +10006,6 @@ entities: - 183 - 182 - 16486 - - 16487 - 18267 - uid: 18273 components: @@ -10178,7 +10286,6 @@ entities: - 16514 - 18295 - 16520 - - 16519 - uid: 18336 components: - type: Transform @@ -10357,7 +10464,6 @@ entities: - 16550 - 18349 - 16556 - - 16555 - uid: 18501 components: - type: Transform @@ -12958,18 +13064,17 @@ entities: parent: 2 - proto: AirlockHydroGlassLocked entities: + - uid: 16 + components: + - type: Transform + pos: 11.5,21.5 + parent: 2 - uid: 3300 components: - type: Transform rot: 1.5707963267948966 rad pos: 2.5,23.5 parent: 2 - - uid: 3328 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 11.5,21.5 - parent: 2 - uid: 3329 components: - type: Transform @@ -13080,7 +13185,7 @@ entities: pos: 46.5,-40.5 parent: 2 - type: Door - secondsUntilStateChange: -152903.86 + secondsUntilStateChange: -164910.06 state: Opening - uid: 4137 components: @@ -13517,7 +13622,7 @@ entities: pos: -3.5,-35.5 parent: 2 - type: Door - secondsUntilStateChange: -269071.25 + secondsUntilStateChange: -281077.44 state: Opening - uid: 1496 components: @@ -64736,26 +64841,6 @@ entities: - type: Transform pos: -52.5,-9.5 parent: 2 - - uid: 11702 - components: - - type: Transform - pos: -51.5,-9.5 - parent: 2 - - uid: 11703 - components: - - type: Transform - pos: -50.5,-9.5 - parent: 2 - - uid: 11704 - components: - - type: Transform - pos: -49.5,-9.5 - parent: 2 - - uid: 11705 - components: - - type: Transform - pos: -48.5,-9.5 - parent: 2 - uid: 11706 components: - type: Transform @@ -65231,6 +65316,11 @@ entities: - type: Transform pos: 28.5,-7.5 parent: 2 + - uid: 15081 + components: + - type: Transform + pos: -46.5,-9.5 + parent: 2 - uid: 15495 components: - type: Transform @@ -65316,6 +65406,11 @@ entities: - type: Transform pos: 54.5,4.5 parent: 2 + - uid: 16519 + components: + - type: Transform + pos: -45.5,-9.5 + parent: 2 - uid: 17914 components: - type: Transform @@ -66106,6 +66201,11 @@ entities: - type: Transform pos: 24.5,-26.5 parent: 2 + - uid: 20807 + components: + - type: Transform + pos: -44.5,-9.5 + parent: 2 - uid: 22780 components: - type: Transform @@ -66126,6 +66226,111 @@ entities: - type: Transform pos: 3.5,-4.5 parent: 21002 + - uid: 23128 + components: + - type: Transform + pos: -43.5,-9.5 + parent: 2 + - uid: 23129 + components: + - type: Transform + pos: -42.5,-9.5 + parent: 2 + - uid: 23130 + components: + - type: Transform + pos: -41.5,-9.5 + parent: 2 + - uid: 23131 + components: + - type: Transform + pos: -41.5,-10.5 + parent: 2 + - uid: 23132 + components: + - type: Transform + pos: -41.5,-11.5 + parent: 2 + - uid: 23133 + components: + - type: Transform + pos: -41.5,-12.5 + parent: 2 + - uid: 23134 + components: + - type: Transform + pos: -41.5,-13.5 + parent: 2 + - uid: 23135 + components: + - type: Transform + pos: -41.5,-14.5 + parent: 2 + - uid: 23136 + components: + - type: Transform + pos: -41.5,-15.5 + parent: 2 + - uid: 23137 + components: + - type: Transform + pos: -41.5,-16.5 + parent: 2 + - uid: 23138 + components: + - type: Transform + pos: -41.5,-17.5 + parent: 2 + - uid: 23139 + components: + - type: Transform + pos: -41.5,-18.5 + parent: 2 + - uid: 23140 + components: + - type: Transform + pos: -41.5,-19.5 + parent: 2 + - uid: 23141 + components: + - type: Transform + pos: -41.5,-20.5 + parent: 2 + - uid: 23142 + components: + - type: Transform + pos: -41.5,-21.5 + parent: 2 + - uid: 23143 + components: + - type: Transform + pos: -41.5,-22.5 + parent: 2 + - uid: 23144 + components: + - type: Transform + pos: -41.5,-23.5 + parent: 2 + - uid: 23145 + components: + - type: Transform + pos: -41.5,-24.5 + parent: 2 + - uid: 23146 + components: + - type: Transform + pos: -41.5,-25.5 + parent: 2 + - uid: 23147 + components: + - type: Transform + pos: -41.5,-26.5 + parent: 2 + - uid: 23148 + components: + - type: Transform + pos: -41.5,-27.5 + parent: 2 - uid: 23346 components: - type: Transform @@ -66654,13 +66859,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.7441,-49.319046 parent: 2 -- proto: CaptainIDCard - entities: - - uid: 2741 - components: - - type: Transform - pos: 24.370218,14.675703 - parent: 2 - proto: CarbonDioxideCanister entities: - uid: 8865 @@ -72818,55 +73016,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-3.5 parent: 2 - - uid: 879 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 19.5,-19.5 - parent: 2 - - uid: 881 - components: - - type: Transform - pos: 20.5,-18.5 - parent: 2 - - uid: 882 - components: - - type: Transform - pos: 21.5,-18.5 - parent: 2 - - uid: 883 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 19.5,-20.5 - parent: 2 - - uid: 895 - components: - - type: Transform - pos: 20.5,-17.5 - parent: 2 - - uid: 896 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 18.5,-20.5 - parent: 2 - - uid: 898 - components: - - type: Transform - pos: 20.5,-17.5 - parent: 2 - - uid: 900 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 18.5,-19.5 - parent: 2 - - uid: 906 - components: - - type: Transform - pos: 21.5,-17.5 - parent: 2 - uid: 960 components: - type: Transform @@ -73197,10 +73346,10 @@ entities: parent: 2 - proto: ChurchOrganInstrument entities: - - uid: 1063 + - uid: 45 components: - type: Transform - rot: 1.5707963267948966 rad + rot: -1.5707963267948966 rad pos: 23.5,-22.5 parent: 2 - proto: Cigar @@ -75748,6 +75897,12 @@ entities: parent: 21002 - proto: ContainmentFieldGenerator entities: + - uid: 1046 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,49.5 + parent: 2 - uid: 3868 components: - type: MetaData @@ -75814,12 +75969,6 @@ entities: rot: 3.141592653589793 rad pos: 22.5,49.5 parent: 2 - - uid: 7364 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 21.5,49.5 - parent: 2 - proto: ConveyorBelt entities: - uid: 1666 @@ -76295,6 +76444,13 @@ entities: - type: Transform pos: 26.5,20.5 parent: 2 +- proto: CrateEngineeringCableBulk + entities: + - uid: 23066 + components: + - type: Transform + pos: 21.5,47.5 + parent: 2 - proto: CrateEngineeringCableHV entities: - uid: 23688 @@ -76494,6 +76650,42 @@ entities: - 0 - proto: CrateGenericSteel entities: + - uid: 13200 + components: + - type: Transform + pos: 21.5,49.5 + parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 13258 + - 13370 + - 13398 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null - uid: 21559 components: - type: Transform @@ -86271,6 +86463,13 @@ entities: - type: Transform pos: -36.6906,-34.412094 parent: 2 +- proto: DrinkGlassCoupeShaped + entities: + - uid: 11702 + components: + - type: Transform + pos: 22.45992,-14.325507 + parent: 2 - proto: DrinkGoldenCup entities: - uid: 11453 @@ -86518,6 +86717,11 @@ entities: parent: 2 - proto: DrinkSodaWaterBottleFull entities: + - uid: 18 + components: + - type: Transform + pos: 24.350317,14.880395 + parent: 2 - uid: 3589 components: - type: Transform @@ -87489,15 +87693,6 @@ entities: parent: 2 - proto: Emitter entities: - - uid: 3081 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 60.5,-32.5 - parent: 2 - - type: DeviceLinkSink - links: - - 4246 - uid: 3921 components: - type: Transform @@ -87570,11 +87765,11 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,48.5 parent: 2 - - uid: 7360 + - uid: 13653 components: - type: Transform rot: -1.5707963267948966 rad - pos: 21.5,48.5 + pos: 25.5,48.5 parent: 2 - proto: EncryptionKeyCargo entities: @@ -94066,6 +94261,38 @@ entities: parent: 21002 - proto: GasPipeBend entities: + - uid: 51 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -53.5,-6.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 52 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -41.5,-9.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 896 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -54.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 898 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -52.5,-6.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 3203 components: - type: Transform @@ -94105,6 +94332,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 7356 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 8106 components: - type: Transform @@ -95397,14 +95632,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15060 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -53.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15083 components: - type: Transform @@ -96142,6 +96369,14 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23072 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23497 components: - type: Transform @@ -96363,6 +96598,20 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 7344 + components: + - type: Transform + pos: 13.5,-0.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7350 + components: + - type: Transform + pos: 1.5,12.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 7765 components: - type: Transform @@ -96624,6 +96873,108 @@ entities: color: '#FF1212FF' - proto: GasPipeStraight entities: + - uid: 46 + components: + - type: Transform + pos: -53.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 48 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -42.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 49 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -42.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 50 + components: + - type: Transform + pos: -53.5,-7.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 54 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -43.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 55 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -44.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 881 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -43.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 882 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -44.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 883 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -45.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 895 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -46.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 900 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -45.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 906 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -46.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 1063 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -41.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 1093 components: - type: Transform @@ -96731,6 +97082,22 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 7355 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7360 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 7732 components: - type: Transform @@ -97882,11 +98249,11 @@ entities: - uid: 8706 components: - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,24.5 + rot: 1.5707963267948966 rad + pos: 0.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#FF1212FF' - uid: 8707 components: - type: Transform @@ -98207,14 +98574,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 8761 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,25.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 8762 components: - type: Transform @@ -99454,14 +99813,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13258 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,25.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13260 components: - type: Transform @@ -100592,14 +100943,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13450 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 12.5,1.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13452 components: - type: Transform @@ -101016,14 +101359,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13531 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,25.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13534 components: - type: Transform @@ -101096,14 +101431,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13546 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13547 components: - type: Transform @@ -101600,14 +101927,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13641 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -11.5,5.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13642 components: - type: Transform @@ -101696,14 +102015,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13653 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -10.5,7.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13654 components: - type: Transform @@ -107491,14 +107802,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 14778 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -42.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 14779 components: - type: Transform @@ -107507,14 +107810,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 14780 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -42.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 14783 components: - type: Transform @@ -107683,14 +107978,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 14818 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -40.5,-9.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 14819 components: - type: Transform @@ -108906,22 +109193,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 15057 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -52.5,-6.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15058 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -52.5,-7.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15061 components: - type: Transform @@ -108986,86 +109257,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15071 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -51.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15072 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -50.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15073 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15074 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -48.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15075 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -53.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15076 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -52.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15077 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -51.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15078 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -50.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15079 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15080 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -48.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 15084 components: - type: Transform @@ -116761,6 +116952,382 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23073 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,12.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23078 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 12.5,2.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23079 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,2.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23080 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,1.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23081 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,0.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23083 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23084 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23085 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -17.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23086 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23087 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23088 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23089 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23090 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23091 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -11.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23092 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23093 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23094 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23095 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23096 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23097 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23098 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23099 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23100 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23101 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23102 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23103 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23104 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23105 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23106 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -17.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23107 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23108 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23109 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23110 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23111 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23112 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -11.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23113 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23114 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23115 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23116 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23117 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23118 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23119 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23120 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23121 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23122 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23123 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23127 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,7.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23460 components: - type: Transform @@ -117471,6 +118038,22 @@ entities: color: '#0335FCFF' - proto: GasPipeTJunction entities: + - uid: 17 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -40.5,-9.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 47 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -42.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 737 components: - type: Transform @@ -117495,6 +118078,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 3081 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 3284 components: - type: Transform @@ -117596,6 +118187,54 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 7228 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7333 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7343 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7345 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7347 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7354 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 12.5,1.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 7761 components: - type: Transform @@ -117954,14 +118593,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13200 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,12.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13201 components: - type: Transform @@ -118176,13 +118807,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13370 - components: - - type: Transform - pos: 13.5,-0.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13376 components: - type: Transform @@ -118212,14 +118836,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13398 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,11.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13400 components: - type: Transform @@ -119302,14 +119918,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 15059 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -54.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 15062 components: - type: Transform @@ -119318,14 +119926,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15070 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -52.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15177 components: - type: Transform @@ -120190,6 +120790,30 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23082 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -21.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23125 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23126 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.5,7.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23495 components: - type: Transform @@ -120428,7 +121052,7 @@ entities: pos: -19.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#BB55BBFF' + color: '#0335FCFF' - uid: 23527 components: - type: Transform @@ -120583,6 +121207,14 @@ entities: open: False - proto: GasVentPump entities: + - uid: 56 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -47.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 1922 components: - type: Transform @@ -120593,6 +121225,14 @@ entities: - 5583 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 7348 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 10592 components: - type: Transform @@ -121322,14 +121962,6 @@ entities: - 18584 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 15082 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -47.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15106 components: - type: Transform @@ -122199,17 +122831,6 @@ entities: - 18247 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 16555 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,24.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18499 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 16774 components: - type: Transform @@ -122329,6 +122950,29 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 23074 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,12.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23076 + components: + - type: Transform + pos: 13.5,3.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23124 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 23704 components: - type: Transform @@ -122384,6 +123028,14 @@ entities: color: '#0335FCFF' - proto: GasVentScrubber entities: + - uid: 53 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -41.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 412 components: - type: Transform @@ -122394,6 +123046,22 @@ entities: - 5583 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 879 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -47.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7349 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,7.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 8128 components: - type: Transform @@ -123098,14 +123766,6 @@ entities: - 18584 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15081 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -47.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 15105 components: - type: Transform @@ -123859,17 +124519,6 @@ entities: - 18288 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 16487 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,11.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18272 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 16490 components: - type: Transform @@ -123942,17 +124591,6 @@ entities: - 18332 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 16519 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -41.5,-10.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18333 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 16522 components: - type: Transform @@ -124142,6 +124780,28 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23071 + components: + - type: Transform + pos: 0.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23075 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23077 + components: + - type: Transform + pos: 12.5,3.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23703 components: - type: Transform @@ -131461,74 +132121,74 @@ entities: parent: 21002 - proto: GrilleDiagonal entities: - - uid: 21 + - uid: 14778 + components: + - type: Transform + pos: -3.5,4.5 + parent: 2 + - uid: 14780 components: - type: Transform rot: -1.5707963267948966 rad pos: 5.5,3.5 parent: 2 - - uid: 22 + - uid: 14818 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,4.5 + rot: 1.5707963267948966 rad + pos: -2.5,-4.5 parent: 2 - - uid: 23 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,5.5 - parent: 2 - - uid: 38 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 5.5,-2.5 - parent: 2 - - uid: 39 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 4.5,-3.5 - parent: 2 - - uid: 40 + - uid: 15058 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-4.5 parent: 2 - - uid: 51 + - uid: 15059 components: - type: Transform - pos: -4.5,3.5 + rot: -1.5707963267948966 rad + pos: 4.5,4.5 parent: 2 - - uid: 52 - components: - - type: Transform - pos: -3.5,4.5 - parent: 2 - - uid: 53 + - uid: 15075 components: - type: Transform pos: -2.5,5.5 parent: 2 - - uid: 54 + - uid: 15076 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,-2.5 + rot: 3.141592653589793 rad + pos: 5.5,-2.5 parent: 2 - - uid: 55 + - uid: 15077 components: - type: Transform rot: 1.5707963267948966 rad pos: -3.5,-3.5 parent: 2 - - uid: 56 + - uid: 15078 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,5.5 + parent: 2 + - uid: 15079 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,-3.5 + parent: 2 + - uid: 15080 components: - type: Transform rot: 1.5707963267948966 rad - pos: -2.5,-4.5 + pos: -4.5,-2.5 + parent: 2 + - uid: 15082 + components: + - type: Transform + pos: -4.5,3.5 parent: 2 - uid: 23946 components: @@ -133525,6 +134185,11 @@ entities: rot: -1.5707963267948966 rad pos: 42.546173,-40.193848 parent: 2 + - uid: 7364 + components: + - type: Transform + pos: 8.466017,-18.14467 + parent: 2 - uid: 9899 components: - type: Transform @@ -133648,11 +134313,6 @@ entities: parent: 2 - proto: LampInterrogator entities: - - uid: 1046 - components: - - type: Transform - pos: 8.440077,-18.25892 - parent: 2 - uid: 3763 components: - type: Transform @@ -134546,14 +135206,7 @@ entities: - uid: 4205 components: - type: Transform - pos: 32.40636,-20.502666 - parent: 2 -- proto: MagazineMagnumRubber - entities: - - uid: 4206 - components: - - type: Transform - pos: 32.65636,-20.533916 + pos: 32.59941,-20.510296 parent: 2 - proto: MagazinePistolSubMachineGunTopMounted entities: @@ -136164,12 +136817,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,52.5 parent: 2 - - uid: 7228 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 14.5,52.5 - parent: 2 - proto: ParticleAcceleratorEndCapUnfinished entities: - uid: 7232 @@ -136245,6 +136892,13 @@ entities: - type: Transform pos: -52.375683,-20.40928 parent: 2 + - uid: 13258 + components: + - type: Transform + parent: 13200 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 21846 components: - type: Transform @@ -147875,74 +148529,74 @@ entities: parent: 21002 - proto: ReinforcedWindowDiagonal entities: - - uid: 16 + - uid: 2741 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,5.5 + pos: -4.5,3.5 parent: 2 - - uid: 17 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,4.5 - parent: 2 - - uid: 18 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 5.5,3.5 - parent: 2 - - uid: 31 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 5.5,-2.5 - parent: 2 - - uid: 34 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 4.5,-3.5 - parent: 2 - - uid: 35 + - uid: 3328 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-4.5 parent: 2 - - uid: 45 + - uid: 11703 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,4.5 + parent: 2 + - uid: 11704 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,5.5 + parent: 2 + - uid: 11705 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,-3.5 + parent: 2 + - uid: 15057 components: - type: Transform rot: 1.5707963267948966 rad pos: -2.5,-4.5 parent: 2 - - uid: 46 + - uid: 15060 components: - type: Transform rot: 1.5707963267948966 rad pos: -3.5,-3.5 parent: 2 - - uid: 47 + - uid: 15070 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,-2.5 + rot: 3.141592653589793 rad + pos: 5.5,-2.5 parent: 2 - - uid: 48 + - uid: 15071 components: - type: Transform - pos: -4.5,3.5 + pos: -2.5,5.5 parent: 2 - - uid: 49 + - uid: 15072 components: - type: Transform pos: -3.5,4.5 parent: 2 - - uid: 50 + - uid: 15073 components: - type: Transform - pos: -2.5,5.5 + rot: -1.5707963267948966 rad + pos: 5.5,3.5 + parent: 2 + - uid: 15074 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,-2.5 parent: 2 - proto: RemoteSignaller entities: @@ -147970,8 +148624,6 @@ entities: linkedPorts: 3921: - Pressed: Toggle - 3081: - - Pressed: Toggle - uid: 6115 components: - type: MetaData @@ -148314,6 +148966,13 @@ entities: - type: Transform pos: 28.332474,49.774113 parent: 2 + - uid: 13398 + components: + - type: Transform + parent: 13200 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: SheetPlasma entities: - uid: 7631 @@ -148421,6 +149080,13 @@ entities: - type: Transform pos: 28.676224,49.727238 parent: 2 + - uid: 13370 + components: + - type: Transform + parent: 13200 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 21560 components: - type: Transform @@ -149261,7 +149927,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9767 components: @@ -149271,7 +149936,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9768 components: @@ -149281,7 +149945,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9769 components: @@ -149318,7 +149981,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9773 components: @@ -149971,14 +150633,6 @@ entities: linkedPorts: 9715: - Pressed: Toggle - 9772: - - Pressed: Toggle - 9766: - - Pressed: Toggle - 9767: - - Pressed: Toggle - 9768: - - Pressed: Toggle - uid: 10222 components: - type: Transform @@ -151066,10 +151720,10 @@ entities: - type: Transform pos: 13.5,62.5 parent: 2 - - uid: 7356 + - uid: 23068 components: - type: Transform - pos: 25.5,48.5 + pos: 24.5,47.5 parent: 2 - proto: Sink entities: @@ -154186,6 +154840,11 @@ entities: parent: 2 - proto: SpawnPointMedicalIntern entities: + - uid: 22 + components: + - type: Transform + pos: -3.5,-27.5 + parent: 2 - uid: 20805 components: - type: Transform @@ -154196,11 +154855,6 @@ entities: - type: Transform pos: -5.5,-33.5 parent: 2 - - uid: 20807 - components: - - type: Transform - pos: -5.5,-25.5 - parent: 2 - uid: 20811 components: - type: Transform @@ -159284,60 +159938,46 @@ entities: parent: 2 - proto: TeslaCoil entities: - - uid: 7333 + - uid: 4206 components: - type: Transform + rot: -1.5707963267948966 rad pos: 25.5,47.5 parent: 2 - - uid: 7343 - components: - - type: Transform - pos: 21.5,46.5 - parent: 2 - - uid: 7344 - components: - - type: Transform - pos: 23.5,46.5 - parent: 2 - - uid: 7345 - components: - - type: Transform - pos: 22.5,46.5 - parent: 2 - uid: 7346 components: - type: Transform pos: 24.5,46.5 parent: 2 - - uid: 7348 + - uid: 8761 + components: + - type: Transform + pos: 19.5,67.5 + parent: 2 + - uid: 13450 components: - type: Transform pos: 25.5,46.5 parent: 2 + - uid: 16487 + components: + - type: Transform + pos: 23.5,46.5 + parent: 2 + - uid: 23069 + components: + - type: Transform + pos: 7.5,64.5 + parent: 2 - proto: TeslaGenerator entities: - - uid: 7355 - components: - - type: Transform - pos: 25.5,49.5 - parent: 2 -- proto: TeslaGroundingRod - entities: - - uid: 7347 - components: - - type: Transform - pos: 22.5,47.5 - parent: 2 - - uid: 7349 - components: - - type: Transform - pos: 21.5,47.5 - parent: 2 - - uid: 7350 + - uid: 23067 components: - type: Transform pos: 23.5,47.5 parent: 2 +- proto: TeslaGroundingRod + entities: - uid: 7352 components: - type: Transform @@ -159348,10 +159988,30 @@ entities: - type: Transform pos: 7.5,68.5 parent: 2 - - uid: 7354 + - uid: 13531 components: - type: Transform - pos: 24.5,47.5 + pos: 22.5,47.5 + parent: 2 + - uid: 13546 + components: + - type: Transform + pos: 21.5,46.5 + parent: 2 + - uid: 13641 + components: + - type: Transform + pos: 22.5,46.5 + parent: 2 + - uid: 16555 + components: + - type: Transform + pos: 22.5,47.5 + parent: 2 + - uid: 23070 + components: + - type: Transform + pos: 8.5,68.5 parent: 2 - proto: ThermomachineFreezerMachineCircuitBoard entities: @@ -180135,10 +180795,54 @@ entities: pos: 24.5,2.5 parent: 21002 - type: Door - secondsUntilStateChange: -47203.098 + secondsUntilStateChange: -59209.29 state: Opening - proto: WoodenBench entities: + - uid: 21 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,-19.5 + parent: 2 + - uid: 23 + components: + - type: Transform + pos: 21.5,-18.5 + parent: 2 + - uid: 31 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,-19.5 + parent: 2 + - uid: 34 + components: + - type: Transform + pos: 21.5,-17.5 + parent: 2 + - uid: 35 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,-20.5 + parent: 2 + - uid: 38 + components: + - type: Transform + pos: 20.5,-18.5 + parent: 2 + - uid: 39 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,-20.5 + parent: 2 + - uid: 40 + components: + - type: Transform + pos: 20.5,-17.5 + parent: 2 - uid: 4172 components: - type: Transform From 8af23749a1efc22305f8247e0254b9a9da23c1fd Mon Sep 17 00:00:00 2001 From: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:01:21 +0200 Subject: [PATCH 20/66] Cluster med refactor + un-abandoning of surgery room (#27293) * done * cryo tweaks * fixes error --- Resources/Maps/cluster.yml | 3801 ++++++++++++------------------------ 1 file changed, 1273 insertions(+), 2528 deletions(-) diff --git a/Resources/Maps/cluster.yml b/Resources/Maps/cluster.yml index 607d8fb4f3..1a2d2ffd8c 100644 --- a/Resources/Maps/cluster.yml +++ b/Resources/Maps/cluster.yml @@ -36,6 +36,7 @@ tilemap: 111: FloorWhiteHerringbone 112: FloorWhiteMini 113: FloorWhiteMono + 1: FloorWhitePlastic 118: FloorWood 120: Lattice 121: Plating @@ -56,7 +57,7 @@ entities: version: 6 -1,0: ind: -1,0 - tiles: eQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAABWQAAAAADWQAAAAACWQAAAAADWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAABYAAAAAAAWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABTAAAAAAAWQAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAAAWQAAAAABWQAAAAADYAAAAAAAWQAAAAABeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAACYAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbQAAAAABbQAAAAADeQAAAAAAbAAAAAAAbAAAAAADcQAAAAADbQAAAAACbQAAAAADeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAACeQAAAAAAdgAAAAACdgAAAAADdgAAAAACbQAAAAACbQAAAAACeQAAAAAAbAAAAAACbAAAAAACcQAAAAADbQAAAAABbQAAAAACeQAAAAAAYAAAAAAATAAAAAAAWQAAAAABeQAAAAAAdgAAAAACdgAAAAABdgAAAAACcQAAAAADcQAAAAADeQAAAAAAbAAAAAACbAAAAAABeQAAAAAAcQAAAAABcQAAAAAAeQAAAAAAWQAAAAAAWQAAAAACWQAAAAABeQAAAAAAdgAAAAADdgAAAAADdgAAAAACbAAAAAADbAAAAAAAbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAABbAAAAAABbAAAAAACWQAAAAACYAAAAAAAWQAAAAADDgAAAAADDgAAAAADDgAAAAABDgAAAAABbAAAAAAAbAAAAAACbAAAAAAAbAAAAAABbAAAAAABcQAAAAABbAAAAAACbAAAAAAAbAAAAAAAWQAAAAACTAAAAAAAWQAAAAACDgAAAAABDgAAAAABDgAAAAADDgAAAAAAbAAAAAACbAAAAAAAbAAAAAACbAAAAAADbAAAAAAAcQAAAAACbAAAAAABbAAAAAABbAAAAAAAYAAAAAAAWQAAAAAAWQAAAAADeQAAAAAAdgAAAAACdgAAAAACDgAAAAAAbAAAAAADbAAAAAADbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAABWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAdgAAAAACDgAAAAAAbAAAAAABeQAAAAAAeQAAAAAAcQAAAAACeQAAAAAAeQAAAAAAcQAAAAAAcQAAAAABeQAAAAAAWQAAAAABWQAAAAABYAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAADgAAAAADbAAAAAACeQAAAAAAcAAAAAADcAAAAAABcAAAAAABcAAAAAABcAAAAAACcAAAAAADeQAAAAAAWQAAAAABTAAAAAAAWQAAAAADWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAcAAAAAAAcAAAAAACcAAAAAAAcAAAAAADcAAAAAAAcAAAAAACeQAAAAAAWQAAAAABWQAAAAACYAAAAAAAWQAAAAACYAAAAAAAYAAAAAAAWQAAAAAAbAAAAAAAcQAAAAACcAAAAAABcAAAAAABcAAAAAAAcAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAADTAAAAAAAWQAAAAACWQAAAAAB + tiles: eQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAABWQAAAAADWQAAAAACWQAAAAADWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAABYAAAAAAAWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABTAAAAAAAWQAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAAAWQAAAAABWQAAAAADYAAAAAAAWQAAAAABeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAACYAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAbAAAAAAAbAAAAAADcQAAAAADbQAAAAACbQAAAAADeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAACeQAAAAAAdgAAAAACdgAAAAADdgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAbAAAAAACbAAAAAACcQAAAAADbQAAAAABbQAAAAACeQAAAAAAYAAAAAAATAAAAAAAWQAAAAABeQAAAAAAdgAAAAACdgAAAAABdgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAbAAAAAACbAAAAAABeQAAAAAAcQAAAAABcQAAAAAAeQAAAAAAWQAAAAAAWQAAAAACWQAAAAABeQAAAAAAdgAAAAADdgAAAAADdgAAAAACbAAAAAADbAAAAAAAbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAABbAAAAAABbAAAAAACWQAAAAACYAAAAAAAWQAAAAADDgAAAAADDgAAAAADDgAAAAABDgAAAAABbAAAAAAAbAAAAAACbAAAAAAAbAAAAAABbAAAAAABcQAAAAABbAAAAAACbAAAAAAAbAAAAAAAWQAAAAACTAAAAAAAWQAAAAACDgAAAAABDgAAAAABDgAAAAADDgAAAAAAbAAAAAACbAAAAAAAbAAAAAACbAAAAAADbAAAAAAAcQAAAAACbAAAAAABbAAAAAABbAAAAAAAYAAAAAAAWQAAAAAAWQAAAAADeQAAAAAAdgAAAAACdgAAAAACDgAAAAAAbAAAAAADbAAAAAADbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAABWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAdgAAAAACDgAAAAAAbAAAAAABeQAAAAAAeQAAAAAAcQAAAAACeQAAAAAAeQAAAAAAcQAAAAAAcQAAAAABeQAAAAAAWQAAAAABWQAAAAABYAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAADgAAAAADbAAAAAACeQAAAAAAcAAAAAADcAAAAAABcAAAAAABcAAAAAABcAAAAAACcAAAAAADeQAAAAAAWQAAAAABTAAAAAAAWQAAAAADWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAcAAAAAAAcAAAAAACcAAAAAAAcAAAAAADcAAAAAAAcAAAAAACeQAAAAAAWQAAAAABWQAAAAACYAAAAAAAWQAAAAACYAAAAAAAYAAAAAAAWQAAAAAAbAAAAAAAcQAAAAACcAAAAAABcAAAAAABcAAAAAAAcAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAADTAAAAAAAWQAAAAACWQAAAAAB version: 6 -1,-1: ind: -1,-1 @@ -76,7 +77,7 @@ entities: version: 6 -2,0: ind: -2,0 - tiles: YAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACWQAAAAACWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAADWQAAAAABWQAAAAABWQAAAAAAWQAAAAADWQAAAAABWQAAAAAAYAAAAAAAWQAAAAACWQAAAAABWQAAAAADWQAAAAABWQAAAAACWQAAAAABYAAAAAAAWQAAAAACWQAAAAACWQAAAAAAYAAAAAAAWQAAAAABYAAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAADWQAAAAADWQAAAAABWQAAAAADYAAAAAAAWQAAAAABWQAAAAABWQAAAAAAWQAAAAACWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbwAAAAAAbwAAAAADbwAAAAABbwAAAAADeQAAAAAAbQAAAAADbQAAAAACeQAAAAAAbQAAAAAAbQAAAAADeQAAAAAAdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbwAAAAACbwAAAAABbwAAAAAAbwAAAAAAeQAAAAAAbQAAAAABbQAAAAACeQAAAAAAbQAAAAADbQAAAAADeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbwAAAAABbwAAAAADbwAAAAAAbwAAAAAAeQAAAAAAcQAAAAADcQAAAAAAeQAAAAAAcQAAAAABcQAAAAABeQAAAAAAdgAAAAADeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAADeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAACdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAAAbAAAAAADbAAAAAADbAAAAAABbAAAAAADbAAAAAADbAAAAAABdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAADbAAAAAADbAAAAAACbAAAAAADbAAAAAADbAAAAAAAbAAAAAADbAAAAAADbAAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAAAbAAAAAADbAAAAAABbAAAAAABbAAAAAABbAAAAAADbAAAAAAAbAAAAAABbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAACHgAAAAACHgAAAAACHgAAAAADeQAAAAAAHQAAAAACHQAAAAABHQAAAAABeQAAAAAAbAAAAAADPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAADeQAAAAAAHQAAAAADHQAAAAACHQAAAAAAeQAAAAAAbAAAAAACPgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHgAAAAAAHgAAAAADHgAAAAAAHgAAAAADHgAAAAAAeQAAAAAAHQAAAAADHQAAAAADHQAAAAACIgAAAAAAbAAAAAAC + tiles: YAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACWQAAAAACWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAADWQAAAAABWQAAAAABWQAAAAAAWQAAAAADWQAAAAABWQAAAAAAYAAAAAAAWQAAAAACWQAAAAABWQAAAAADWQAAAAABWQAAAAACWQAAAAABYAAAAAAAWQAAAAACWQAAAAACWQAAAAAAYAAAAAAAWQAAAAABYAAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAADWQAAAAADWQAAAAABWQAAAAADYAAAAAAAWQAAAAABWQAAAAABWQAAAAAAWQAAAAACWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbwAAAAAAbwAAAAADbwAAAAABbwAAAAADeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbwAAAAACbwAAAAABbwAAAAAAbwAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbwAAAAABbwAAAAADbwAAAAAAbwAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAdgAAAAADeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAADeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAACdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAAAbAAAAAADbAAAAAADbAAAAAABbAAAAAADbAAAAAADbAAAAAABdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAADbAAAAAADbAAAAAACbAAAAAADbAAAAAADbAAAAAAAbAAAAAADbAAAAAADbAAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAAAbAAAAAADbAAAAAABbAAAAAABbAAAAAABbAAAAAADbAAAAAAAbAAAAAABbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAACHgAAAAACHgAAAAACHgAAAAADeQAAAAAAHQAAAAACHQAAAAABHQAAAAABeQAAAAAAbAAAAAADPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAADeQAAAAAAHQAAAAADHQAAAAACHQAAAAAAeQAAAAAAbAAAAAACPgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHgAAAAAAHgAAAAADHgAAAAAAHgAAAAADHgAAAAAAeQAAAAAAHQAAAAADHQAAAAADHQAAAAACIgAAAAAAbAAAAAAC version: 6 1,0: ind: 1,0 @@ -88,7 +89,7 @@ entities: version: 6 -2,1: ind: -2,1 - tiles: PgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAHgAAAAAAHgAAAAACHgAAAAABHgAAAAADHgAAAAAAeQAAAAAAHQAAAAAAHQAAAAABHQAAAAABeQAAAAAAbAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAMAAAAAADbAAAAAACbAAAAAAAMAAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAACeQAAAAAAMAAAAAACeQAAAAAAbAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAMAAAAAABbAAAAAABbAAAAAACMAAAAAAAMAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAMAAAAAADbAAAAAABeQAAAAAAbAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAMAAAAAADMAAAAAADeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA + tiles: PgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAHgAAAAAAHgAAAAACHgAAAAABHgAAAAADHgAAAAAAeQAAAAAAHQAAAAAAHQAAAAABHQAAAAABeQAAAAAAbAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA version: 6 0,2: ind: 0,2 @@ -252,83 +253,128 @@ entities: color: '#FFFFFFFF' id: Basalt1 decals: - 1352: 25.881918,34.192333 - 1355: 36.05116,32.59352 - 1380: -23.029747,20.063555 + 1340: 25.881918,34.192333 + 1343: 36.05116,32.59352 - node: color: '#FFFFFFFF' id: Basalt5 decals: - 1353: 31.894993,33.661083 - 1365: 25.780825,32.109146 - 1386: -27.154747,21.001055 + 1341: 31.894993,33.661083 + 1353: 25.780825,32.109146 - node: color: '#FFFFFFFF' id: Basalt8 decals: - 1354: 33.992474,34.93727 - 1385: -26.029747,22.04793 + 1342: 33.992474,34.93727 - node: color: '#A46106FF' id: BotLeft decals: - 1109: 22,-28 - 1110: 21,-28 - 1111: 20,-28 - 1112: 20,-27 - 1113: 21,-27 - 1114: 22,-27 - 1115: 15,-22 - 1116: 15,-23 - 1117: 15,-24 - 1118: 15,-25 - 1119: 14,-25 - 1120: 14,-24 - 1121: 14,-23 - 1122: 14,-22 - 1123: 18,-28 - 1124: 18,-27 - 1125: 17,-27 - 1126: 17,-28 - 1127: 16,-27 - 1128: 16,-28 + 1097: 22,-28 + 1098: 21,-28 + 1099: 20,-28 + 1100: 20,-27 + 1101: 21,-27 + 1102: 22,-27 + 1103: 15,-22 + 1104: 15,-23 + 1105: 15,-24 + 1106: 15,-25 + 1107: 14,-25 + 1108: 14,-24 + 1109: 14,-23 + 1110: 14,-22 + 1111: 18,-28 + 1112: 18,-27 + 1113: 17,-27 + 1114: 17,-28 + 1115: 16,-27 + 1116: 16,-28 - node: color: '#FFFFFFFF' id: BotLeft decals: - 1443: 6,-22 - 1444: 6,-21 - 1445: 6,-20 - 1446: 5,-20 - 1447: 4,-20 - 1448: -3,17 - 1449: -2,17 - 1450: -1,17 - 1451: 0,17 + 1417: 6,-22 + 1418: 6,-21 + 1419: 6,-20 + 1420: 5,-20 + 1421: 4,-20 + 1422: -3,17 + 1423: -2,17 + 1424: -1,17 + 1425: 0,17 - node: color: '#EFB341FF' id: BotRight decals: - 1032: 26,-7 - 1033: 26,-6 - 1034: 26,-5 - 1035: 26,-4 - 1036: 27,-4 - 1037: 27,-5 - 1038: 27,-6 - 1039: 27,-7 - 1040: 28,-7 - 1041: 28,-6 - 1042: 28,-5 - 1043: 28,-4 + 1020: 26,-7 + 1021: 26,-6 + 1022: 26,-5 + 1023: 26,-4 + 1024: 27,-4 + 1025: 27,-5 + 1026: 27,-6 + 1027: 27,-7 + 1028: 28,-7 + 1029: 28,-6 + 1030: 28,-5 + 1031: 28,-4 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlayNE + decals: + 1456: -23,24 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlayNW + decals: + 1453: -27,24 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlaySE + decals: + 1454: -23,20 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlaySW + decals: + 1455: -27,20 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayE + decals: + 1466: -23,23 + 1467: -23,22 + 1468: -23,21 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayN + decals: + 1463: -26,24 + 1464: -25,24 + 1465: -24,24 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayS + decals: + 1457: -26,20 + 1458: -25,20 + 1459: -24,20 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayW + decals: + 1460: -27,21 + 1461: -27,22 + 1462: -27,23 - node: color: '#FFFFFFFF' id: BrickTileDarkBox decals: - 955: -17,-9 - 970: -17,-13 - 971: -17,-11 - 972: -17,-15 + 943: -17,-9 + 958: -17,-13 + 959: -17,-11 + 960: -17,-15 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNe @@ -361,12 +407,12 @@ entities: color: '#FFFFFFFF' id: BrickTileDarkEndE decals: - 836: -10,-3 + 824: -10,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkEndW decals: - 833: -12,-3 + 821: -12,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNe @@ -408,7 +454,7 @@ entities: 96: -5,56 97: -6,56 128: -7,46 - 835: -11,-3 + 823: -11,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkLineS @@ -419,7 +465,7 @@ entities: 107: -6,48 108: -5,48 127: -7,44 - 834: -11,-3 + 822: -11,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkLineW @@ -484,13 +530,13 @@ entities: color: '#52B4E9FF' id: BrickTileSteelCornerNe decals: - 746: -19,16 - 747: -23,16 + 734: -19,16 + 735: -23,16 - node: color: '#D381C9FF' id: BrickTileSteelCornerNe decals: - 894: -21,-1 + 882: -21,-1 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerNe @@ -500,21 +546,21 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerNe decals: - 811: 2,-5 - 812: -2,-5 - 1238: -14,-51 - 1245: -41,-18 + 799: 2,-5 + 800: -2,-5 + 1226: -14,-51 + 1233: -41,-18 - node: color: '#52B4E9FF' id: BrickTileSteelCornerNw decals: - 744: -27,16 - 745: -21,16 + 732: -27,16 + 733: -21,16 - node: color: '#D381C9FF' id: BrickTileSteelCornerNw decals: - 895: -23,-1 + 883: -23,-1 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerNw @@ -524,22 +570,22 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerNw decals: - 813: 0,-5 - 814: 4,-5 - 1239: -16,-51 - 1244: -44,-18 + 801: 0,-5 + 802: 4,-5 + 1227: -16,-51 + 1232: -44,-18 - node: color: '#52B4E9FF' id: BrickTileSteelCornerSe decals: - 742: -19,13 - 743: -23,13 + 730: -19,13 + 731: -23,13 - node: color: '#D381C9FF' id: BrickTileSteelCornerSe decals: - 897: -21,-4 - 966: -15,-19 + 885: -21,-4 + 954: -15,-19 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerSe @@ -549,20 +595,20 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerSe decals: - 1243: -14,-52 - 1247: -41,-21 + 1231: -14,-52 + 1235: -41,-21 - node: color: '#52B4E9FF' id: BrickTileSteelCornerSw decals: - 748: -27,13 - 749: -21,13 + 736: -27,13 + 737: -21,13 - node: color: '#D381C9FF' id: BrickTileSteelCornerSw decals: - 896: -23,-4 - 965: -21,-19 + 884: -23,-4 + 953: -21,-19 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerSw @@ -572,41 +618,41 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerSw decals: - 1242: -16,-52 - 1246: -44,-21 + 1230: -16,-52 + 1234: -44,-21 - node: color: '#FFFFFFFF' id: BrickTileSteelEndE decals: - 822: 2,-3 + 810: 2,-3 - node: color: '#FFFFFFFF' id: BrickTileSteelEndW decals: - 823: 4,-3 - 824: 0,-3 + 811: 4,-3 + 812: 0,-3 - node: color: '#52B4E9FF' id: BrickTileSteelLineE decals: - 726: -19,14 - 727: -19,15 - 731: -23,15 - 732: -23,14 + 714: -19,14 + 715: -19,15 + 719: -23,15 + 720: -23,14 - node: color: '#D381C9FF' id: BrickTileSteelLineE decals: - 888: -21,-2 - 889: -21,-3 - 956: -15,-17 - 957: -15,-18 - 1407: -15,-15 - 1408: -15,-14 - 1409: -15,-13 - 1410: -15,-11 - 1411: -15,-10 - 1412: -15,-9 + 876: -21,-2 + 877: -21,-3 + 944: -15,-17 + 945: -15,-18 + 1381: -15,-15 + 1382: -15,-14 + 1383: -15,-13 + 1384: -15,-11 + 1385: -15,-10 + 1386: -15,-9 - node: color: '#DE3A3AFF' id: BrickTileSteelLineE @@ -616,23 +662,23 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelLineE decals: - 820: -2,-6 - 821: 2,-6 - 1250: -41,-19 - 1251: -41,-20 + 808: -2,-6 + 809: 2,-6 + 1238: -41,-19 + 1239: -41,-20 - node: color: '#52B4E9FF' id: BrickTileSteelLineN decals: - 728: -24,16 - 729: -25,16 - 730: -26,16 - 741: -20,16 + 716: -24,16 + 717: -25,16 + 718: -26,16 + 729: -20,16 - node: color: '#D381C9FF' id: BrickTileSteelLineN decals: - 890: -22,-1 + 878: -22,-1 - node: color: '#DE3A3AFF' id: BrickTileSteelLineN @@ -645,32 +691,32 @@ entities: id: BrickTileSteelLineN decals: 215: -4,26 - 815: -3,-5 - 816: 1,-5 - 817: 5,-5 - 825: 1,-3 - 828: 5,-3 - 1240: -15,-51 - 1248: -43,-18 - 1249: -42,-18 + 803: -3,-5 + 804: 1,-5 + 805: 5,-5 + 813: 1,-3 + 816: 5,-3 + 1228: -15,-51 + 1236: -43,-18 + 1237: -42,-18 - node: color: '#52B4E9FF' id: BrickTileSteelLineS decals: - 737: -26,13 - 738: -25,13 - 739: -24,13 - 740: -20,13 + 725: -26,13 + 726: -25,13 + 727: -24,13 + 728: -20,13 - node: color: '#D381C9FF' id: BrickTileSteelLineS decals: - 891: -22,-4 - 958: -17,-19 - 959: -16,-19 - 960: -18,-19 - 961: -19,-19 - 962: -20,-19 + 879: -22,-4 + 946: -17,-19 + 947: -16,-19 + 948: -18,-19 + 949: -19,-19 + 950: -20,-19 - node: color: '#DE3A3AFF' id: BrickTileSteelLineS @@ -682,38 +728,38 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelLineS decals: - 826: 1,-3 - 827: 5,-3 - 1241: -15,-52 - 1254: -43,-21 - 1255: -42,-21 - 1454: -3,-3 - 1455: -2,-3 - 1456: -1,-3 + 814: 1,-3 + 815: 5,-3 + 1229: -15,-52 + 1242: -43,-21 + 1243: -42,-21 + 1428: -3,-3 + 1429: -2,-3 + 1430: -1,-3 - node: color: '#52B4E9FF' id: BrickTileSteelLineW decals: - 733: -27,15 - 734: -27,14 - 735: -21,15 - 736: -21,14 + 721: -27,15 + 722: -27,14 + 723: -21,15 + 724: -21,14 - node: color: '#D381C9FF' id: BrickTileSteelLineW decals: - 892: -23,-3 - 893: -23,-2 - 963: -21,-18 - 964: -21,-17 - 1413: -18,-15 - 1414: -18,-14 - 1415: -18,-13 - 1416: -18,-11 - 1417: -18,-10 - 1418: -18,-9 - 1420: -18,-12 - 1421: -18,-16 + 880: -23,-3 + 881: -23,-2 + 951: -21,-18 + 952: -21,-17 + 1387: -18,-15 + 1388: -18,-14 + 1389: -18,-13 + 1390: -18,-11 + 1391: -18,-10 + 1392: -18,-9 + 1394: -18,-12 + 1395: -18,-16 - node: color: '#DE3A3AFF' id: BrickTileSteelLineW @@ -724,40 +770,37 @@ entities: id: BrickTileSteelLineW decals: 214: 2,28 - 818: 4,-6 - 819: 0,-6 - 1252: -44,-19 - 1253: -44,-20 + 806: 4,-6 + 807: 0,-6 + 1240: -44,-19 + 1241: -44,-20 - node: color: '#EFB341FF' id: BrickTileWhiteBox decals: - 1104: 19,-15 + 1092: 19,-15 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerNe decals: - 629: -21,6 - 630: -18,6 - 631: -15,6 - 775: -9,6 + 763: -9,6 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerNe decals: - 1299: 46,28 - 1322: 43,27 + 1287: 46,28 + 1310: 43,27 - node: color: '#9FED58FF' id: BrickTileWhiteCornerNe decals: - 705: -11,21 - 708: -11,19 + 693: -11,21 + 696: -11,19 - node: color: '#A46106FF' id: BrickTileWhiteCornerNe decals: - 1161: 11,-18 + 1149: 11,-18 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNe @@ -767,38 +810,35 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerNe decals: - 1092: 20,-14 - 1108: 21,-6 + 1080: 20,-14 + 1096: 21,-6 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNe decals: - 806: 4,2 + 794: 4,2 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerNw decals: - 626: -22,6 - 627: -19,6 - 628: -16,6 - 772: -10,6 + 760: -10,6 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerNw decals: - 1300: 39,28 - 1321: 42,27 + 1288: 39,28 + 1309: 42,27 - node: color: '#9FED58FF' id: BrickTileWhiteCornerNw decals: - 703: -12,21 - 707: -12,19 + 691: -12,21 + 695: -12,19 - node: color: '#A46106FF' id: BrickTileWhiteCornerNw decals: - 1226: 8,-18 + 1214: 8,-18 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNw @@ -808,43 +848,40 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerNw decals: - 1093: 16,-14 - 1107: 20,-6 + 1081: 16,-14 + 1095: 20,-6 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNw decals: - 803: 1,2 + 791: 1,2 - node: color: '#334E6DFF' id: BrickTileWhiteCornerSe decals: - 1295: 44,33 + 1283: 44,33 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerSe decals: - 632: -21,5 - 633: -18,5 - 634: -15,5 - 773: -9,5 + 761: -9,5 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerSe decals: - 1317: 46,25 - 1320: 43,26 + 1305: 46,25 + 1308: 43,26 - node: color: '#9FED58FF' id: BrickTileWhiteCornerSe decals: - 704: -11,18 - 706: -11,20 + 692: -11,18 + 694: -11,20 - node: color: '#A46106FF' id: BrickTileWhiteCornerSe decals: - 1160: 11,-24 + 1148: 11,-24 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSe @@ -854,38 +891,35 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerSe decals: - 1094: 20,-16 - 1105: 21,-7 + 1082: 20,-16 + 1093: 21,-7 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSe decals: - 804: 4,1 + 792: 4,1 - node: color: '#334E6DFF' id: BrickTileWhiteCornerSw decals: - 1296: 41,33 + 1284: 41,33 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerSw decals: - 635: -22,5 - 636: -19,5 - 637: -16,5 - 774: -10,5 + 762: -10,5 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerSw decals: - 1318: 39,25 - 1319: 42,26 + 1306: 39,25 + 1307: 42,26 - node: color: '#9FED58FF' id: BrickTileWhiteCornerSw decals: - 702: -12,18 - 709: -12,20 + 690: -12,18 + 697: -12,20 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSw @@ -895,13 +929,13 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerSw decals: - 1095: 16,-16 - 1106: 20,-7 + 1083: 16,-16 + 1094: 20,-7 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSw decals: - 805: 1,1 + 793: 1,1 - node: color: '#9FED5896' id: BrickTileWhiteInnerNe @@ -926,7 +960,7 @@ entities: color: '#FFFFFFFF' id: BrickTileWhiteInnerNe decals: - 1234: -5,-25 + 1222: -5,-25 - node: color: '#9FED5896' id: BrickTileWhiteInnerNw @@ -937,7 +971,7 @@ entities: id: BrickTileWhiteInnerNw decals: 180: 1,54 - 1225: 8,-19 + 1213: 8,-19 - node: color: '#D381C9FF' id: BrickTileWhiteInnerNw @@ -947,7 +981,7 @@ entities: color: '#FFFFFFFF' id: BrickTileWhiteInnerNw decals: - 1392: -3,-25 + 1366: -3,-25 - node: color: '#D381C9FF' id: BrickTileWhiteInnerSe @@ -977,28 +1011,28 @@ entities: color: '#334E6DFF' id: BrickTileWhiteLineE decals: - 1294: 44,34 + 1282: 44,34 - node: color: '#7C5C98FF' id: BrickTileWhiteLineE decals: - 1393: 9,-2 + 1367: 9,-2 - node: color: '#9D9D97FF' id: BrickTileWhiteLineE decals: - 1307: 46,27 - 1308: 46,26 + 1295: 46,27 + 1296: 46,26 - node: color: '#A46106FF' id: BrickTileWhiteLineE decals: - 1152: 11,-19 - 1153: 11,-20 - 1154: 11,-21 - 1155: 11,-22 - 1156: 11,-23 - 1224: 7,-18 + 1140: 11,-19 + 1141: 11,-20 + 1142: 11,-21 + 1143: 11,-22 + 1144: 11,-23 + 1212: 7,-18 - node: color: '#BDFF8593' id: BrickTileWhiteLineE @@ -1015,17 +1049,17 @@ entities: id: BrickTileWhiteLineE decals: 166: 1,53 - 1102: 20,-15 + 1090: 20,-15 - node: color: '#9D9D97FF' id: BrickTileWhiteLineN decals: - 1301: 40,28 - 1302: 41,28 - 1303: 42,28 - 1304: 43,28 - 1305: 44,28 - 1306: 45,28 + 1289: 40,28 + 1290: 41,28 + 1291: 42,28 + 1292: 43,28 + 1293: 44,28 + 1294: 45,28 - node: color: '#9FED5896' id: BrickTileWhiteLineN @@ -1038,8 +1072,8 @@ entities: decals: 177: -1,54 178: 0,54 - 1150: 9,-18 - 1151: 10,-18 + 1138: 9,-18 + 1139: 10,-18 - node: color: '#BDFF8593' id: BrickTileWhiteLineN @@ -1065,26 +1099,26 @@ entities: decals: 169: 2,52 170: 3,52 - 1096: 17,-14 - 1097: 18,-14 - 1098: 19,-14 + 1084: 17,-14 + 1085: 18,-14 + 1086: 19,-14 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineN decals: - 807: 2,2 - 808: 3,2 - 829: 3,-1 - 830: 4,-1 - 1233: -4,-25 + 795: 2,2 + 796: 3,2 + 817: 3,-1 + 818: 4,-1 + 1221: -4,-25 - node: color: '#334E6DFF' id: BrickTileWhiteLineS decals: 141: 2,50 142: 3,50 - 1291: 42,33 - 1292: 43,33 + 1279: 42,33 + 1280: 43,33 - node: color: '#52B4E9FF' id: BrickTileWhiteLineS @@ -1092,23 +1126,23 @@ entities: 138: -1,50 139: 0,50 140: 1,50 - 1327: -4,-34 + 1315: -4,-34 - node: color: '#7C5C98FF' id: BrickTileWhiteLineS decals: - 1398: 14,1 - 1399: 15,1 + 1372: 14,1 + 1373: 15,1 - node: color: '#9D9D97FF' id: BrickTileWhiteLineS decals: - 1309: 45,25 - 1310: 44,25 - 1311: 43,25 - 1312: 42,25 - 1313: 41,25 - 1314: 40,25 + 1297: 45,25 + 1298: 44,25 + 1299: 43,25 + 1300: 42,25 + 1301: 41,25 + 1302: 40,25 - node: color: '#9FED5896' id: BrickTileWhiteLineS @@ -1119,17 +1153,17 @@ entities: color: '#A46106FF' id: BrickTileWhiteLineS decals: - 1157: 8,-24 - 1158: 9,-24 - 1159: 10,-24 - 1328: -3,-34 + 1145: 8,-24 + 1146: 9,-24 + 1147: 10,-24 + 1316: -3,-34 - node: color: '#D381C9FF' id: BrickTileWhiteLineS decals: 152: -1,52 153: 0,52 - 1329: -5,-34 + 1317: -5,-34 - node: color: '#DE3A3A96' id: BrickTileWhiteLineS @@ -1143,37 +1177,37 @@ entities: decals: 167: 2,54 168: 3,54 - 1099: 17,-16 - 1100: 18,-16 - 1101: 19,-16 - 1326: -2,-34 + 1087: 17,-16 + 1088: 18,-16 + 1089: 19,-16 + 1314: -2,-34 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineS decals: - 809: 2,1 - 810: 3,1 + 797: 2,1 + 798: 3,1 - node: color: '#334E6DC8' id: BrickTileWhiteLineW decals: - 1323: -7,-32 + 1311: -7,-32 - node: color: '#334E6DFF' id: BrickTileWhiteLineW decals: - 1293: 41,34 + 1281: 41,34 - node: color: '#70707093' id: BrickTileWhiteLineW decals: - 1325: -7,-34 + 1313: -7,-34 - node: color: '#9D9D97FF' id: BrickTileWhiteLineW decals: - 1315: 39,26 - 1316: 39,27 + 1303: 39,26 + 1304: 39,27 - node: color: '#9FED5896' id: BrickTileWhiteLineW @@ -1188,7 +1222,7 @@ entities: color: '#C78B1993' id: BrickTileWhiteLineW decals: - 1324: -7,-33 + 1312: -7,-33 - node: color: '#D381C9FF' id: BrickTileWhiteLineW @@ -1203,128 +1237,114 @@ entities: color: '#EFB341FF' id: BrickTileWhiteLineW decals: - 1103: 16,-15 + 1091: 16,-15 - node: color: '#FFFFFFFF' id: Busha1 decals: - 1348: 28.377537,33.036083 - 1378: -25.060997,23.98543 + 1336: 28.377537,33.036083 - node: color: '#FFFFFFFF' id: Bushb2 decals: - 1343: 22.922419,33.036083 - 1344: 19.880083,33.942333 - - node: - color: '#FFFFFFFF' - id: Bushb3 - decals: - 1377: -23.045372,22.032305 + 1331: 22.922419,33.036083 + 1332: 19.880083,33.942333 - node: color: '#FFFFFFFF' id: Bushc1 decals: - 1345: 18.98016,34.92671 - 1346: 19.38641,32.098583 - 1347: 24.355186,34.536083 + 1333: 18.98016,34.92671 + 1334: 19.38641,32.098583 + 1335: 24.355186,34.536083 - node: color: '#FFFFFFFF' id: Bushc2 decals: - 1369: 34.975742,34.972504 - 1387: -22.967247,20.969805 + 1357: 34.975742,34.972504 - node: color: '#FFFFFFFF' id: Bushi1 decals: - 1367: 28.499575,31.984146 - 1368: 36.95945,33.952896 - 1379: -26.967247,21.92293 - 1381: -23.998497,23.938555 - - node: - color: '#FFFFFFFF' - id: Bushi2 - decals: - 1384: -26.014122,20.92293 + 1355: 28.499575,31.984146 + 1356: 36.95945,33.952896 - node: color: '#FFFFFFFF' id: Bushi3 decals: - 1366: 27.04645,31.937271 + 1354: 27.04645,31.937271 - node: color: '#FFFFFFFF' id: Bushi4 decals: - 1349: 31.565037,34.80171 - 1350: 32.45566,32.92671 - 1351: 29.877537,34.89546 + 1337: 31.565037,34.80171 + 1338: 32.45566,32.92671 + 1339: 29.877537,34.89546 - node: color: '#FFFFFFFF' id: Caution decals: - 978: -27,-6 - 1131: 11,-28 - 1132: 13,-28 - 1232: -41,16 + 966: -27,-6 + 1119: 11,-28 + 1120: 13,-28 + 1220: -41,16 - node: color: '#000000FF' id: CheckerNESW decals: - 776: 0,3 - 777: 1,3 - 778: 2,3 - 779: 3,3 - 780: 4,3 - 781: 5,3 - 782: 5,2 - 783: 0,2 - 784: 0,1 - 785: 5,1 - 786: 5,0 - 787: 4,0 - 788: 3,0 - 789: 2,0 - 790: 1,0 - 791: 0,0 - 792: 4,4 - 793: 3,4 - 794: 6,2 + 764: 0,3 + 765: 1,3 + 766: 2,3 + 767: 3,3 + 768: 4,3 + 769: 5,3 + 770: 5,2 + 771: 0,2 + 772: 0,1 + 773: 5,1 + 774: 5,0 + 775: 4,0 + 776: 3,0 + 777: 2,0 + 778: 1,0 + 779: 0,0 + 780: 4,4 + 781: 3,4 + 782: 6,2 - node: color: '#52B4E996' id: CheckerNESW decals: - 638: -17,12 - 639: -16,12 - 640: -17,13 - 641: -16,13 - 642: -17,14 - 643: -16,14 - 644: -17,15 - 645: -16,15 - 646: -16,16 - 647: -17,16 + 626: -17,12 + 627: -16,12 + 628: -17,13 + 629: -16,13 + 630: -17,14 + 631: -16,14 + 632: -17,15 + 633: -16,15 + 634: -16,16 + 635: -17,16 - node: color: '#A4610696' id: CheckerNESW decals: - 1215: 6,-28 - 1216: 6,-27 - 1217: 6,-26 - 1218: 5,-26 - 1219: 5,-27 - 1220: 5,-28 - 1221: 4,-28 - 1222: 4,-27 - 1223: 4,-26 + 1203: 6,-28 + 1204: 6,-27 + 1205: 6,-26 + 1206: 5,-26 + 1207: 5,-27 + 1208: 5,-28 + 1209: 4,-28 + 1210: 4,-27 + 1211: 4,-26 - node: color: '#D381C996' id: CheckerNESW decals: - 937: -13,-7 - 938: -13,-6 - 939: -12,-6 - 940: -12,-7 + 925: -13,-7 + 926: -13,-6 + 927: -12,-6 + 928: -12,-7 - node: color: '#DE3A3A96' id: CheckerNESW @@ -1376,18 +1396,18 @@ entities: color: '#52B4E996' id: CheckerNWSE decals: - 690: -8,8 - 691: -9,8 - 692: -10,8 - 693: -10,9 - 694: -9,9 - 695: -8,9 - 696: -8,10 - 697: -9,10 - 698: -10,10 - 699: -10,11 - 700: -9,11 - 701: -8,11 + 678: -8,8 + 679: -9,8 + 680: -10,8 + 681: -10,9 + 682: -9,9 + 683: -8,9 + 684: -8,10 + 685: -9,10 + 686: -10,10 + 687: -10,11 + 688: -9,11 + 689: -8,11 - node: color: '#DE3A3A96' id: CheckerNWSE @@ -1407,34 +1427,34 @@ entities: color: '#EFB34196' id: CheckerNWSE decals: - 1005: 17,-5 - 1006: 16,-5 - 1007: 15,-5 + 993: 17,-5 + 994: 16,-5 + 995: 15,-5 - node: color: '#FFFFFFFF' id: Delivery decals: - 976: -21,-14 - 977: -21,-10 - 1256: -6,52 - 1257: -7,53 - 1258: -8,52 - 1259: -7,51 - 1389: 11,27 - 1390: 12,27 - 1391: 13,27 + 964: -21,-14 + 965: -21,-10 + 1244: -6,52 + 1245: -7,53 + 1246: -8,52 + 1247: -7,51 + 1363: 11,27 + 1364: 12,27 + 1365: 13,27 - node: color: '#000000FF' id: DiagonalCheckerAOverlay decals: - 795: 2,2 - 796: 3,1 - 797: 1,1 - 798: 4,2 - 799: 2,1 - 800: 1,2 - 801: 3,2 - 802: 4,1 + 783: 2,2 + 784: 3,1 + 785: 1,1 + 786: 4,2 + 787: 2,1 + 788: 1,2 + 789: 3,2 + 790: 4,1 - node: color: '#334E6DC8' id: FullTileOverlayGreyscale @@ -1471,52 +1491,50 @@ entities: color: '#FFFFFFFF' id: Grassa3 decals: - 1338: 25.518755,33.161083 - 1339: 28.102278,34.536083 - 1340: 30.90701,33.067333 - 1382: -24.060997,21.969805 + 1326: 25.518755,33.161083 + 1327: 28.102278,34.536083 + 1328: 30.90701,33.067333 - node: color: '#FFFFFFFF' id: Grassc1 decals: - 1341: 33.051407,34.442333 - 1342: 35.00453,33.848583 + 1329: 33.051407,34.442333 + 1330: 35.00453,33.848583 - node: color: '#FFFFFFFF' id: Grassd1 decals: - 1337: 22.28438,34.23921 + 1325: 22.28438,34.23921 - node: color: '#FFFFFFFF' id: Grassd3 decals: - 1363: 28.9527,33.984146 - 1364: 26.85895,32.952896 + 1351: 28.9527,33.984146 + 1352: 26.85895,32.952896 - node: color: '#FFFFFFFF' id: Grasse1 decals: - 1362: 21.980526,32.077896 + 1350: 21.980526,32.077896 - node: color: '#FFFFFFFF' id: Grasse2 decals: - 1359: 23.027401,35.28102 - 1360: 24.996151,35.327896 - 1361: 23.902401,32.12477 + 1347: 23.027401,35.28102 + 1348: 24.996151,35.327896 + 1349: 23.902401,32.12477 - node: color: '#FFFFFFFF' id: Grasse3 decals: - 1356: 20.983843,34.62477 - 1357: 19.968218,33.077896 - 1358: 23.34307,34.234146 - 1383: -25.998497,19.938555 + 1344: 20.983843,34.62477 + 1345: 19.968218,33.077896 + 1346: 23.34307,34.234146 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale decals: - 1427: 32,-17 + 1401: 32,-17 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale @@ -1547,10 +1565,14 @@ entities: 467: 21,7 468: 22,7 471: 22,3 - 714: -17,21 - 715: -16,21 - 716: -15,21 - 717: -14,21 + 702: -17,21 + 703: -16,21 + 704: -15,21 + 705: -14,21 + 1474: -21,5 + 1475: -20,5 + 1476: -16,5 + 1477: -15,5 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale @@ -1560,11 +1582,11 @@ entities: color: '#D381C996' id: HalfTileOverlayGreyscale decals: - 843: -11,-2 - 844: -10,-2 - 898: -18,-1 - 899: -17,-1 - 900: -16,-1 + 831: -11,-2 + 832: -10,-2 + 886: -18,-1 + 887: -17,-1 + 888: -16,-1 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale @@ -1586,15 +1608,15 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale decals: - 1077: 12,-11 - 1078: 13,-11 - 1079: 14,-11 - 1080: 15,-11 + 1065: 12,-11 + 1066: 13,-11 + 1067: 14,-11 + 1068: 15,-11 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale180 decals: - 1428: 32,-19 + 1402: 32,-19 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale180 @@ -1617,10 +1639,11 @@ entities: decals: 469: 21,5 470: 22,5 - 710: -17,18 - 711: -16,18 - 712: -15,18 - 713: -14,18 + 698: -17,18 + 699: -16,18 + 700: -15,18 + 701: -14,18 + 1471: -18,5 - node: color: '#707070FF' id: HalfTileOverlayGreyscale180 @@ -1638,12 +1661,12 @@ entities: color: '#D381C996' id: HalfTileOverlayGreyscale180 decals: - 845: -12,-4 - 846: -11,-4 - 847: -10,-4 - 905: -16,-7 - 906: -17,-7 - 907: -18,-7 + 833: -12,-4 + 834: -11,-4 + 835: -10,-4 + 893: -16,-7 + 894: -17,-7 + 895: -18,-7 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 @@ -1663,14 +1686,14 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale180 decals: - 1074: 15,-12 - 1075: 12,-13 - 1076: 13,-13 + 1062: 15,-12 + 1063: 12,-13 + 1064: 13,-13 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale270 decals: - 1430: 31,-18 + 1404: 31,-18 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale270 @@ -1691,9 +1714,11 @@ entities: id: HalfTileOverlayGreyscale270 decals: 473: 20,6 - 669: -27,10 - 720: -18,20 - 725: -18,19 + 657: -27,10 + 708: -18,20 + 713: -18,19 + 1478: -22,6 + 1479: -22,7 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale270 @@ -1703,17 +1728,17 @@ entities: color: '#A4610696' id: HalfTileOverlayGreyscale270 decals: - 1200: 8,-27 + 1188: 8,-27 - node: color: '#D381C996' id: HalfTileOverlayGreyscale270 decals: - 849: -13,-3 - 850: -13,-2 - 908: -19,-6 - 909: -19,-5 - 910: -19,-4 - 911: -19,-2 + 837: -13,-3 + 838: -13,-2 + 896: -19,-6 + 897: -19,-5 + 898: -19,-4 + 899: -19,-2 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 @@ -1733,13 +1758,13 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale270 decals: - 1018: 15,-8 - 1081: 11,-12 + 1006: 15,-8 + 1069: 11,-12 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale90 decals: - 1429: 33,-18 + 1403: 33,-18 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale90 @@ -1761,10 +1786,10 @@ entities: id: HalfTileOverlayGreyscale90 decals: 472: 23,6 - 667: -12,10 - 668: -12,9 - 718: -13,20 - 719: -13,19 + 655: -12,10 + 656: -12,9 + 706: -13,20 + 707: -13,19 - node: color: '#707070FF' id: HalfTileOverlayGreyscale90 @@ -1783,18 +1808,18 @@ entities: color: '#A4610696' id: HalfTileOverlayGreyscale90 decals: - 1141: 6,-23 - 1142: 6,-22 - 1143: 6,-21 + 1129: 6,-23 + 1130: 6,-22 + 1131: 6,-21 - node: color: '#D381C996' id: HalfTileOverlayGreyscale90 decals: - 848: -9,-3 - 901: -15,-2 - 902: -15,-4 - 903: -15,-5 - 904: -15,-6 + 836: -9,-3 + 889: -15,-2 + 890: -15,-4 + 891: -15,-5 + 892: -15,-6 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 @@ -1813,71 +1838,71 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale90 decals: - 982: 13,-8 - 983: 13,-7 - 984: 13,-6 - 1017: 16,-8 + 970: 13,-8 + 971: 13,-7 + 972: 13,-6 + 1005: 16,-8 - node: color: '#FFFFFFFF' id: LoadingArea decals: - 1452: 1,17 + 1426: 1,17 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' id: LoadingArea decals: - 1453: 6,-23 + 1427: 6,-23 - node: color: '#D381C9FF' id: MiniTileSteelCornerNe decals: - 883: -32,-7 + 871: -32,-7 - node: color: '#D381C9FF' id: MiniTileSteelCornerNw decals: - 885: -31,-7 + 873: -31,-7 - node: color: '#D381C9FF' id: MiniTileSteelCornerSe decals: - 878: -25,-4 + 866: -25,-4 - node: color: '#D381C9FF' id: MiniTileSteelCornerSw decals: - 879: -29,-4 + 867: -29,-4 - node: color: '#D381C9FF' id: MiniTileSteelInnerNw decals: - 884: -30,-7 + 872: -30,-7 - node: color: '#D381C9FF' id: MiniTileSteelLineE decals: - 875: -25,-3 - 876: -25,-2 - 877: -25,-1 - 887: -32,-8 + 863: -25,-3 + 864: -25,-2 + 865: -25,-1 + 875: -32,-8 - node: color: '#D381C9FF' id: MiniTileSteelLineS decals: - 872: -28,-4 - 873: -27,-4 - 874: -26,-4 - 881: -32,-6 - 882: -31,-6 + 860: -28,-4 + 861: -27,-4 + 862: -26,-4 + 869: -32,-6 + 870: -31,-6 - node: color: '#D381C9FF' id: MiniTileSteelLineW decals: - 869: -29,-1 - 870: -29,-2 - 871: -29,-3 - 886: -31,-8 + 857: -29,-1 + 858: -29,-2 + 859: -29,-3 + 874: -31,-8 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerNe @@ -1887,8 +1912,8 @@ entities: color: '#EF7241FF' id: MiniTileWhiteCornerNe decals: - 750: -11,16 - 751: -9,14 + 738: -11,16 + 739: -9,14 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerNw @@ -1898,7 +1923,7 @@ entities: color: '#EF7241FF' id: MiniTileWhiteCornerNw decals: - 754: -14,16 + 742: -14,16 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerSe @@ -1908,12 +1933,12 @@ entities: color: '#D381C9FF' id: MiniTileWhiteCornerSe decals: - 923: -25,-8 + 911: -25,-8 - node: color: '#EF7241FF' id: MiniTileWhiteCornerSe decals: - 752: -9,13 + 740: -9,13 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerSw @@ -1923,33 +1948,33 @@ entities: color: '#D381C9FF' id: MiniTileWhiteCornerSw decals: - 924: -29,-8 + 912: -29,-8 - node: color: '#EF7241FF' id: MiniTileWhiteCornerSw decals: - 753: -14,13 + 741: -14,13 - node: color: '#7C5C98FF' id: MiniTileWhiteInnerNe decals: - 1396: 9,-3 + 1370: 9,-3 - node: color: '#EF7241FF' id: MiniTileWhiteInnerNe decals: - 764: -11,14 + 752: -11,14 - node: color: '#7C5C98FF' id: MiniTileWhiteInnerSe decals: - 1394: 13,1 - 1395: 9,-1 + 1368: 13,1 + 1369: 9,-1 - node: color: '#7C5C98FF' id: MiniTileWhiteInnerSw decals: - 1397: 16,1 + 1371: 16,1 - node: color: '#52B4E9FF' id: MiniTileWhiteLineE @@ -1959,13 +1984,13 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineE decals: - 916: -25,-6 - 917: -25,-7 + 904: -25,-6 + 905: -25,-7 - node: color: '#EF7241FF' id: MiniTileWhiteLineE decals: - 759: -11,15 + 747: -11,15 - node: color: '#52B4E9FF' id: MiniTileWhiteLineN @@ -1976,16 +2001,16 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineN decals: - 925: -21,-6 - 926: -22,-6 - 927: -23,-6 + 913: -21,-6 + 914: -22,-6 + 915: -23,-6 - node: color: '#EF7241FF' id: MiniTileWhiteLineN decals: - 762: -13,16 - 763: -12,16 - 765: -10,14 + 750: -13,16 + 751: -12,16 + 753: -10,14 - node: color: '#52B4E9FF' id: MiniTileWhiteLineS @@ -1997,20 +2022,20 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineS decals: - 918: -26,-8 - 919: -27,-8 - 920: -28,-8 - 928: -23,-7 - 929: -22,-7 - 930: -21,-7 + 906: -26,-8 + 907: -27,-8 + 908: -28,-8 + 916: -23,-7 + 917: -22,-7 + 918: -21,-7 - node: color: '#EF7241FF' id: MiniTileWhiteLineS decals: - 755: -13,13 - 756: -12,13 - 757: -11,13 - 758: -10,13 + 743: -13,13 + 744: -12,13 + 745: -11,13 + 746: -10,13 - node: color: '#52B4E9FF' id: MiniTileWhiteLineW @@ -2020,19 +2045,19 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineW decals: - 921: -29,-7 - 922: -29,-6 + 909: -29,-7 + 910: -29,-6 - node: color: '#EF7241FF' id: MiniTileWhiteLineW decals: - 760: -14,14 - 761: -14,15 + 748: -14,14 + 749: -14,15 - node: color: '#334E6DC8' id: MonoOverlay decals: - 1332: -8,-32 + 1320: -8,-32 - node: color: '#52B4E996' id: MonoOverlay @@ -2041,13 +2066,13 @@ entities: 623: -11,9 624: -11,6 625: -11,5 - 766: -10,7 - 767: -9,7 - 768: -13,12 - 769: -10,12 - 770: -9,12 - 771: -15,15 - 1331: -4,-35 + 754: -10,7 + 755: -9,7 + 756: -13,12 + 757: -10,12 + 758: -9,12 + 759: -15,15 + 1319: -4,-35 - node: color: '#52B4E9FF' id: MonoOverlay @@ -2057,88 +2082,88 @@ entities: color: '#70707093' id: MonoOverlay decals: - 1334: -8,-34 + 1322: -8,-34 - node: color: '#A14F9793' id: MonoOverlay decals: - 865: -27,-3 - 866: -28,-2 - 867: -27,-1 - 868: -26,-2 - 880: -27,-5 + 853: -27,-3 + 854: -28,-2 + 855: -27,-1 + 856: -26,-2 + 868: -27,-5 - node: color: '#A4610696' id: MonoOverlay decals: - 1162: 5,-25 - 1163: 7,-27 - 1164: 9,-25 - 1165: 10,-25 - 1166: 12,-23 - 1167: 12,-22 - 1168: 7,-22 - 1169: 7,-21 - 1170: 7,-24 - 1173: 17,-22 - 1174: 17,-23 - 1336: -3,-35 + 1150: 5,-25 + 1151: 7,-27 + 1152: 9,-25 + 1153: 10,-25 + 1154: 12,-23 + 1155: 12,-22 + 1156: 7,-22 + 1157: 7,-21 + 1158: 7,-24 + 1161: 17,-22 + 1162: 17,-23 + 1324: -3,-35 - node: color: '#A46106FF' id: MonoOverlay decals: - 1171: 20,-25 - 1172: 21,-25 + 1159: 20,-25 + 1160: 21,-25 - node: color: '#C78B1993' id: MonoOverlay decals: - 1333: -8,-33 + 1321: -8,-33 - node: color: '#D381C996' id: MonoOverlay decals: - 941: -13,-8 - 942: -12,-8 - 943: -11,-7 - 944: -11,-6 - 945: -12,-5 - 946: -13,-5 - 947: -17,-8 - 1330: -5,-35 + 929: -13,-8 + 930: -12,-8 + 931: -11,-7 + 932: -11,-6 + 933: -12,-5 + 934: -13,-5 + 935: -17,-8 + 1318: -5,-35 - node: color: '#D381C9FF' id: MonoOverlay decals: - 931: -24,-6 - 932: -24,-7 - 933: -20,-6 - 934: -20,-7 - 935: -14,-7 - 936: -14,-6 + 919: -24,-6 + 920: -24,-7 + 921: -20,-6 + 922: -20,-7 + 923: -14,-7 + 924: -14,-6 - node: color: '#EF663193' id: MonoOverlay decals: - 1372: 34,23 + 1360: 34,23 - node: color: '#EFB34196' id: MonoOverlay decals: - 1019: 14,-8 - 1020: 14,-7 - 1021: 15,-6 - 1022: 16,-6 - 1023: 22,-10 - 1024: 23,-10 - 1025: 24,-8 - 1026: 27,-10 - 1027: 17,-11 - 1028: 17,-12 - 1029: 25,-13 - 1030: 30,-12 - 1031: 30,-11 - 1335: -2,-35 + 1007: 14,-8 + 1008: 14,-7 + 1009: 15,-6 + 1010: 16,-6 + 1011: 22,-10 + 1012: 23,-10 + 1013: 24,-8 + 1014: 27,-10 + 1015: 17,-11 + 1016: 17,-12 + 1017: 25,-13 + 1018: 30,-12 + 1019: 30,-11 + 1323: -2,-35 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale @@ -2158,8 +2183,8 @@ entities: 619: -7,12 620: -7,13 621: -7,14 - 685: -13,7 - 686: -13,6 + 673: -13,7 + 674: -13,6 - node: color: '#79150096' id: QuarterTileOverlayGreyscale @@ -2189,25 +2214,25 @@ entities: color: '#A4610696' id: QuarterTileOverlayGreyscale decals: - 1147: 5,-20 - 1148: 4,-20 - 1149: 3,-20 - 1189: 13,-21 - 1190: 13,-22 - 1191: 13,-24 - 1192: 13,-23 - 1193: 13,-25 - 1194: 13,-26 - 1195: 12,-26 - 1196: 11,-26 - 1197: 10,-26 - 1198: 9,-26 - 1199: 8,-26 + 1135: 5,-20 + 1136: 4,-20 + 1137: 3,-20 + 1177: 13,-21 + 1178: 13,-22 + 1179: 13,-24 + 1180: 13,-23 + 1181: 13,-25 + 1182: 13,-26 + 1183: 12,-26 + 1184: 11,-26 + 1185: 10,-26 + 1186: 9,-26 + 1187: 8,-26 - node: color: '#B02E26FF' id: QuarterTileOverlayGreyscale decals: - 1297: 42,29 + 1285: 42,29 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale @@ -2224,8 +2249,8 @@ entities: id: QuarterTileOverlayGreyscale decals: 461: 31,10 - 1459: 10,-5 - 1460: 11,-5 + 1433: 10,-5 + 1434: 11,-5 - node: color: '#EF5C1F93' id: QuarterTileOverlayGreyscale @@ -2235,60 +2260,60 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale decals: - 985: 12,-5 - 987: 18,-5 - 988: 18,-4 - 989: 19,-4 - 990: 20,-4 - 991: 21,-4 - 992: 22,-4 - 1002: 18,-8 - 1003: 18,-7 - 1004: 18,-6 - 1054: 28,-11 - 1055: 27,-11 - 1056: 26,-11 - 1057: 25,-11 - 1058: 24,-11 - 1083: 25,-8 - 1084: 25,-7 - 1085: 25,-6 - 1086: 25,-5 - 1087: 25,-4 + 973: 12,-5 + 975: 18,-5 + 976: 18,-4 + 977: 19,-4 + 978: 20,-4 + 979: 21,-4 + 980: 22,-4 + 990: 18,-8 + 991: 18,-7 + 992: 18,-6 + 1042: 28,-11 + 1043: 27,-11 + 1044: 26,-11 + 1045: 25,-11 + 1046: 24,-11 + 1071: 25,-8 + 1072: 25,-7 + 1073: 25,-6 + 1074: 25,-5 + 1075: 25,-4 - node: color: '#F9801DFF' id: QuarterTileOverlayGreyscale decals: - 1286: 45,34 + 1274: 45,34 - node: color: '#3C44AAFF' id: QuarterTileOverlayGreyscale180 decals: - 1279: 43,30 - 1280: 43,31 - 1281: 43,32 - 1282: 44,32 - 1283: 45,32 - 1284: 46,32 + 1267: 43,30 + 1268: 43,31 + 1269: 43,32 + 1270: 44,32 + 1271: 45,32 + 1272: 46,32 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale180 decals: - 670: -26,9 - 671: -25,9 - 672: -24,9 - 673: -23,9 - 676: -21,8 - 677: -20,8 - 678: -19,8 - 679: -18,8 - 680: -17,8 - 681: -15,8 - 682: -16,8 - 683: -14,8 - 687: -12,8 - 688: -12,7 - 689: -12,6 + 658: -26,9 + 659: -25,9 + 660: -24,9 + 661: -23,9 + 664: -21,8 + 665: -20,8 + 666: -19,8 + 667: -18,8 + 668: -17,8 + 669: -15,8 + 670: -16,8 + 671: -14,8 + 675: -12,8 + 676: -12,7 + 677: -12,6 - node: color: '#707070FF' id: QuarterTileOverlayGreyscale180 @@ -2360,36 +2385,36 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale180 decals: - 993: 23,-5 - 994: 23,-6 - 995: 23,-7 - 996: 23,-8 - 997: 23,-9 - 998: 22,-9 - 999: 21,-9 - 1000: 20,-9 - 1001: 19,-9 - 1048: 23,-12 - 1049: 22,-12 - 1050: 21,-12 - 1051: 20,-12 - 1052: 19,-12 - 1072: 14,-12 - 1088: 26,-9 - 1089: 27,-9 - 1090: 28,-9 - 1091: 29,-9 + 981: 23,-5 + 982: 23,-6 + 983: 23,-7 + 984: 23,-8 + 985: 23,-9 + 986: 22,-9 + 987: 21,-9 + 988: 20,-9 + 989: 19,-9 + 1036: 23,-12 + 1037: 22,-12 + 1038: 21,-12 + 1039: 20,-12 + 1040: 19,-12 + 1060: 14,-12 + 1076: 26,-9 + 1077: 27,-9 + 1078: 28,-9 + 1079: 29,-9 - node: color: '#F9801DFF' id: QuarterTileOverlayGreyscale180 decals: - 1285: 46,33 + 1273: 46,33 - node: color: '#2BAF9D93' id: QuarterTileOverlayGreyscale270 decals: - 1441: 32,-12 - 1442: 31,-12 + 1415: 32,-12 + 1416: 31,-12 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 @@ -2400,10 +2425,10 @@ entities: color: '#52B4E996' id: QuarterTileOverlayGreyscale270 decals: - 674: -22,9 - 684: -13,8 - 1457: 10,-9 - 1458: 11,-9 + 662: -22,9 + 672: -13,8 + 1431: 10,-9 + 1432: 11,-9 - node: color: '#707070FF' id: QuarterTileOverlayGreyscale270 @@ -2421,7 +2446,7 @@ entities: color: '#9D9D97FF' id: QuarterTileOverlayGreyscale270 decals: - 1289: 39,33 + 1277: 39,33 - node: color: '#9FED5896' id: QuarterTileOverlayGreyscale270 @@ -2438,27 +2463,27 @@ entities: color: '#A4610696' id: QuarterTileOverlayGreyscale270 decals: - 1144: 5,-24 - 1145: 4,-24 - 1146: 3,-24 - 1175: 8,-28 - 1176: 9,-28 - 1207: 18,-22 - 1208: 18,-23 - 1209: 18,-24 - 1210: 19,-24 - 1211: 20,-24 - 1212: 21,-24 + 1132: 5,-24 + 1133: 4,-24 + 1134: 3,-24 + 1163: 8,-28 + 1164: 9,-28 + 1195: 18,-22 + 1196: 18,-23 + 1197: 18,-24 + 1198: 19,-24 + 1199: 20,-24 + 1200: 21,-24 - node: color: '#B02E26FF' id: QuarterTileOverlayGreyscale270 decals: - 1273: 39,32 - 1274: 40,32 - 1275: 41,32 - 1276: 42,32 - 1277: 42,31 - 1278: 42,30 + 1261: 39,32 + 1262: 40,32 + 1263: 41,32 + 1264: 42,32 + 1265: 42,31 + 1266: 42,30 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 @@ -2475,21 +2500,21 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 decals: - 986: 12,-9 - 1044: 28,-12 - 1045: 27,-12 - 1046: 26,-12 - 1047: 25,-12 - 1053: 24,-12 - 1436: 31,-11 - 1437: 32,-11 + 974: 12,-9 + 1032: 28,-12 + 1033: 27,-12 + 1034: 26,-12 + 1035: 25,-12 + 1041: 24,-12 + 1410: 31,-11 + 1411: 32,-11 - node: color: '#2BAF9D93' id: QuarterTileOverlayGreyscale90 decals: - 1435: 31,-11 - 1439: 32,-12 - 1440: 32,-11 + 1409: 31,-11 + 1413: 32,-12 + 1414: 32,-11 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 @@ -2501,27 +2526,27 @@ entities: color: '#3C44AAFF' id: QuarterTileOverlayGreyscale90 decals: - 1298: 43,29 + 1286: 43,29 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale90 decals: 474: 21,3 - 648: -12,11 - 649: -13,11 - 650: -15,11 - 651: -14,11 - 652: -16,11 - 653: -17,11 - 654: -18,11 - 655: -19,11 - 656: -20,11 - 657: -21,11 - 658: -22,11 - 659: -23,11 - 660: -24,11 - 661: -25,11 - 662: -26,11 + 636: -12,11 + 637: -13,11 + 638: -15,11 + 639: -14,11 + 640: -16,11 + 641: -17,11 + 642: -18,11 + 643: -19,11 + 644: -20,11 + 645: -21,11 + 646: -22,11 + 647: -23,11 + 648: -24,11 + 649: -25,11 + 650: -26,11 - node: color: '#79150096' id: QuarterTileOverlayGreyscale90 @@ -2538,7 +2563,7 @@ entities: color: '#9D9D97FF' id: QuarterTileOverlayGreyscale90 decals: - 1290: 40,34 + 1278: 40,34 - node: color: '#9FED5896' id: QuarterTileOverlayGreyscale90 @@ -2552,29 +2577,29 @@ entities: color: '#A4610696' id: QuarterTileOverlayGreyscale90 decals: - 1177: 22,-26 - 1178: 21,-26 - 1179: 20,-26 - 1180: 19,-26 - 1181: 18,-26 - 1182: 16,-26 - 1183: 17,-26 - 1184: 16,-25 - 1185: 16,-24 - 1186: 16,-23 - 1187: 16,-22 - 1188: 16,-21 - 1202: 22,-21 - 1203: 21,-21 - 1204: 20,-21 - 1205: 19,-21 - 1206: 22,-22 - 1463: 22,-23 + 1165: 22,-26 + 1166: 21,-26 + 1167: 20,-26 + 1168: 19,-26 + 1169: 18,-26 + 1170: 16,-26 + 1171: 17,-26 + 1172: 16,-25 + 1173: 16,-24 + 1174: 16,-23 + 1175: 16,-22 + 1176: 16,-21 + 1190: 22,-21 + 1191: 21,-21 + 1192: 20,-21 + 1193: 19,-21 + 1194: 22,-22 + 1437: 22,-23 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale90 decals: - 842: -12,-2 + 830: -12,-2 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 @@ -2611,64 +2636,49 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 decals: - 1059: 23,-11 - 1060: 22,-11 - 1061: 21,-11 - 1062: 20,-11 - 1063: 19,-11 - 1438: 31,-12 - - node: - color: '#FFFFFFFF' - id: Rock01 - decals: - 1373: -27.060997,22.876055 - - node: - color: '#FFFFFFFF' - id: Rock05 - decals: - 1374: -25.107872,21.001055 - - node: - color: '#FFFFFFFF' - id: Rock06 - decals: - 1375: -25.060997,22.89168 + 1047: 23,-11 + 1048: 22,-11 + 1049: 21,-11 + 1050: 20,-11 + 1051: 19,-11 + 1412: 31,-12 - node: color: '#FFFFFFFF' id: Rock07 decals: - 1376: -23.045372,24.001055 + 1361: -23.045372,24.001055 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' id: Rust decals: - 1470: 16,22 - 1471: 15,20 - 1472: 12,20 - 1473: 17,20 - 1474: 14,21 + 1444: 16,22 + 1445: 15,20 + 1446: 12,20 + 1447: 17,20 + 1448: 14,21 - node: color: '#FFFFFFFF' id: StandClear decals: - 973: -17,-7 - 974: -8,-10 - 975: -8,-15 - 979: -27,-4 - 1129: 10,-27 - 1130: 14,-27 - 1388: 12,26 + 961: -17,-7 + 962: -8,-10 + 963: -8,-15 + 967: -27,-4 + 1117: 10,-27 + 1118: 14,-27 + 1362: 12,26 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' id: StandClear decals: - 1231: -40,22 + 1219: -40,22 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale decals: - 1432: 31,-17 + 1406: 31,-17 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale @@ -2683,19 +2693,21 @@ entities: id: ThreeQuarterTileOverlayGreyscale decals: 476: 20,7 - 664: -27,11 - 721: -18,21 + 652: -27,11 + 709: -18,21 + 1470: -17,5 + 1473: -22,5 - node: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale decals: - 1213: 18,-21 + 1201: 18,-21 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale decals: - 841: -13,-1 - 912: -19,-1 + 829: -13,-1 + 900: -19,-1 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale @@ -2722,14 +2734,14 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale decals: - 1014: 15,-7 - 1065: 18,-11 - 1070: 11,-11 + 1002: 15,-7 + 1053: 18,-11 + 1058: 11,-11 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale180 decals: - 1434: 33,-19 + 1408: 33,-19 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale180 @@ -2743,25 +2755,25 @@ entities: id: ThreeQuarterTileOverlayGreyscale180 decals: 479: 23,5 - 666: -12,5 - 724: -13,18 + 654: -12,5 + 712: -13,18 - node: color: '#9D9D97FF' id: ThreeQuarterTileOverlayGreyscale180 decals: - 1288: 40,33 + 1276: 40,33 - node: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale180 decals: - 1140: 6,-24 - 1214: 22,-24 + 1128: 6,-24 + 1202: 22,-24 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale180 decals: - 838: -9,-4 - 915: -15,-7 + 826: -9,-4 + 903: -15,-7 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale180 @@ -2787,16 +2799,16 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale180 decals: - 981: 13,-9 - 1016: 16,-9 - 1067: 29,-12 - 1068: 16,-12 - 1073: 14,-13 + 969: 13,-9 + 1004: 16,-9 + 1055: 29,-12 + 1056: 16,-12 + 1061: 14,-13 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale270 decals: - 1433: 31,-19 + 1407: 31,-19 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale270 @@ -2812,16 +2824,16 @@ entities: id: ThreeQuarterTileOverlayGreyscale270 decals: 478: 20,5 - 663: -27,9 - 665: -13,5 - 675: -22,8 - 723: -18,18 + 651: -27,9 + 653: -13,5 + 663: -22,8 + 711: -18,18 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale270 decals: - 837: -13,-4 - 914: -19,-7 + 825: -13,-4 + 902: -19,-7 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale270 @@ -2847,21 +2859,21 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale270 decals: - 1008: 18,-9 - 1015: 15,-9 - 1066: 18,-12 - 1071: 11,-13 - 1082: 25,-9 + 996: 18,-9 + 1003: 15,-9 + 1054: 18,-12 + 1059: 11,-13 + 1070: 25,-9 - node: color: '#F9801DFF' id: ThreeQuarterTileOverlayGreyscale270 decals: - 1287: 45,33 + 1275: 45,33 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale90 decals: - 1431: 33,-17 + 1405: 33,-17 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale90 @@ -2877,19 +2889,21 @@ entities: id: ThreeQuarterTileOverlayGreyscale90 decals: 477: 23,7 - 722: -13,21 + 710: -13,21 + 1469: -19,5 + 1472: -14,5 - node: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale90 decals: - 1139: 6,-20 + 1127: 6,-20 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale90 decals: - 839: -9,-2 - 840: -12,-1 - 913: -15,-1 + 827: -9,-2 + 828: -12,-1 + 901: -15,-1 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale90 @@ -2915,22 +2929,22 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale90 decals: - 980: 13,-5 - 1009: 23,-4 - 1013: 16,-7 - 1064: 29,-11 - 1069: 16,-11 + 968: 13,-5 + 997: 23,-4 + 1001: 16,-7 + 1052: 29,-11 + 1057: 16,-11 - node: color: '#FFFFFFFF' id: VentSmall decals: - 969: -21,-18 + 957: -21,-18 - node: color: '#FFFFFFFF' id: WarnBox decals: 129: -1,46 - 1264: -7,52 + 1252: -7,52 - node: color: '#FFFFFFFF' id: WarnCornerNE @@ -2942,20 +2956,20 @@ entities: decals: 5: -9,-15 133: -1,45 - 1400: -12,-52 + 1374: -12,-52 - node: color: '#FFFFFFFF' id: WarnCornerSE decals: 209: -2,23 - 1010: 17,-4 - 1370: -41,23 - 1461: 18,-1 + 998: 17,-4 + 1358: -41,23 + 1435: 18,-1 - node: color: '#FFFFFFFF' id: WarnCornerSW decals: - 851: -11,-1 + 839: -11,-1 - node: color: '#FFFFFFFF' id: WarnCornerSmallNE @@ -2963,8 +2977,8 @@ entities: 81: -8,49 82: -9,50 135: -3,46 - 864: -29,-4 - 1230: -40,20 + 852: -29,-4 + 1218: -40,20 - node: color: '#FFFFFFFF' id: WarnCornerSmallNW @@ -2974,14 +2988,14 @@ entities: 80: -5,50 198: -2,23 213: -4,24 - 863: -25,-4 + 851: -25,-4 - node: color: '#FFFFFFFF' id: WarnCornerSmallSE decals: 83: -9,54 84: -8,55 - 1137: 9,-28 + 1125: 9,-28 - node: color: '#FFFFFFFF' id: WarnCornerSmallSW @@ -2989,7 +3003,7 @@ entities: 85: -6,55 86: -5,54 210: -4,26 - 1138: 15,-28 + 1126: 15,-28 - node: color: '#FFFFFFFF' id: WarnLineE @@ -3006,15 +3020,15 @@ entities: 137: -2,44 207: -2,24 208: -2,25 - 860: -29,-3 - 861: -29,-2 - 862: -29,-1 - 1227: -40,21 - 1228: -40,22 - 1229: -40,23 - 1263: -6,52 - 1477: -4,-30 - 1478: -4,-29 + 848: -29,-3 + 849: -29,-2 + 850: -29,-1 + 1215: -40,21 + 1216: -40,22 + 1217: -40,23 + 1251: -6,52 + 1451: -4,-30 + 1452: -4,-29 - node: color: '#FFFFFFFF' id: WarnLineN @@ -3027,24 +3041,24 @@ entities: 204: -5,23 205: -4,23 206: -3,23 - 852: -10,-1 - 853: -9,-1 - 1011: 16,-4 - 1012: 15,-4 - 1133: 11,-28 - 1134: 13,-28 - 1135: 14,-28 - 1136: 12,-28 - 1201: 10,-28 - 1260: -7,51 - 1371: -42,23 - 1403: -17,-12 - 1404: -16,-12 - 1422: -18,-16 - 1423: -17,-16 - 1424: -16,-16 - 1425: -18,-12 - 1462: 17,-1 + 840: -10,-1 + 841: -9,-1 + 999: 16,-4 + 1000: 15,-4 + 1121: 11,-28 + 1122: 13,-28 + 1123: 14,-28 + 1124: 12,-28 + 1189: 10,-28 + 1248: -7,51 + 1359: -42,23 + 1377: -17,-12 + 1378: -16,-12 + 1396: -18,-16 + 1397: -17,-16 + 1398: -16,-16 + 1399: -18,-12 + 1436: 17,-1 - node: color: '#FFFFFFFF' id: WarnLineS @@ -3065,14 +3079,14 @@ entities: 199: -2,25 200: -2,24 211: -4,25 - 854: -25,-1 - 855: -25,-2 - 856: -25,-3 - 1261: -8,52 - 1401: -12,-53 - 1402: -12,-54 - 1475: -2,-30 - 1476: -2,-29 + 842: -25,-1 + 843: -25,-2 + 844: -25,-3 + 1249: -8,52 + 1375: -12,-53 + 1376: -12,-54 + 1449: -2,-30 + 1450: -2,-29 - node: color: '#FFFFFFFF' id: WarnLineW @@ -3086,33 +3100,33 @@ entities: 202: -4,23 203: -3,23 212: -5,24 - 857: -28,-4 - 858: -27,-4 - 859: -26,-4 - 948: -17,-9 - 949: -16,-9 - 950: -18,-17 - 951: -17,-17 - 952: -16,-17 - 953: -19,-17 - 954: -20,-17 - 967: -21,-17 - 968: -15,-17 - 1262: -7,53 - 1405: -17,-12 - 1406: -16,-12 - 1419: -18,-9 - 1426: -18,-12 + 845: -28,-4 + 846: -27,-4 + 847: -26,-4 + 936: -17,-9 + 937: -16,-9 + 938: -18,-17 + 939: -17,-17 + 940: -16,-17 + 941: -19,-17 + 942: -20,-17 + 955: -21,-17 + 956: -15,-17 + 1250: -7,53 + 1379: -17,-12 + 1380: -16,-12 + 1393: -18,-9 + 1400: -18,-12 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNe decals: - 1266: 41,31 + 1254: 41,31 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNw decals: - 1265: 44,31 + 1253: 44,31 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNe @@ -3134,7 +3148,7 @@ entities: 251: -1,12 252: -4,8 253: 3,12 - 1237: -8,-27 + 1225: -8,-27 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSw @@ -3142,7 +3156,7 @@ entities: 248: 6,8 249: -1,12 250: 3,12 - 1236: -6,-27 + 1224: -6,-27 - node: color: '#FFFFFFFF' id: WoodTrimThinLineE @@ -3152,7 +3166,7 @@ entities: 245: -1,9 246: 3,10 247: 3,11 - 1268: 41,30 + 1256: 41,30 - node: color: '#FFFFFFFF' id: WoodTrimThinLineN @@ -3164,12 +3178,12 @@ entities: 238: -2,9 239: 4,9 240: 5,9 - 831: 3,4 - 832: 4,4 - 1269: 40,31 - 1270: 39,31 - 1271: 45,31 - 1272: 46,31 + 819: 3,4 + 820: 4,4 + 1257: 40,31 + 1258: 39,31 + 1259: 45,31 + 1260: 46,31 - node: color: '#FFFFFFFF' id: WoodTrimThinLineS @@ -3188,7 +3202,7 @@ entities: 227: 0,12 228: 1,12 229: 2,12 - 1235: -7,-27 + 1223: -7,-27 - node: color: '#FFFFFFFF' id: WoodTrimThinLineW @@ -3199,22 +3213,22 @@ entities: 233: 3,10 241: -1,10 242: -1,11 - 1267: 44,30 + 1255: 44,30 - node: angle: 4.71238898038469 rad color: '#69150079' id: footprint decals: - 1465: 12.797138,20.095083 - 1466: 13.359638,19.751333 - 1467: 13.890888,20.079458 - 1468: 14.422138,19.766958 - 1469: 12.219013,19.751333 + 1439: 12.797138,20.095083 + 1440: 13.359638,19.751333 + 1441: 13.890888,20.079458 + 1442: 14.422138,19.766958 + 1443: 12.219013,19.751333 - node: color: '#691500FF' id: splatter decals: - 1464: 12.062763,20.798208 + 1438: 12.062763,20.798208 - type: GridAtmosphere version: 2 data: @@ -4483,8 +4497,6 @@ entities: - 10600 - 10548 - 10550 - - type: AtmosDevice - joinedGrid: 1 - uid: 11592 components: - type: Transform @@ -4498,8 +4510,6 @@ entities: - 3198 - 10762 - 10763 - - type: AtmosDevice - joinedGrid: 1 - uid: 11593 components: - type: Transform @@ -4521,8 +4531,6 @@ entities: - 10727 - 10725 - 10726 - - type: AtmosDevice - joinedGrid: 1 - uid: 11594 components: - type: Transform @@ -4542,8 +4550,6 @@ entities: - 10706 - 10707 - 10813 - - type: AtmosDevice - joinedGrid: 1 - uid: 11598 components: - type: Transform @@ -4570,8 +4576,6 @@ entities: - 10664 - 10821 - 10814 - - type: AtmosDevice - joinedGrid: 1 - uid: 11601 components: - type: Transform @@ -4603,8 +4607,6 @@ entities: - 10509 - 11605 - 11604 - - type: AtmosDevice - joinedGrid: 1 - uid: 11611 components: - type: Transform @@ -4628,8 +4630,6 @@ entities: - 10660 - 10661 - 10659 - - type: AtmosDevice - joinedGrid: 1 - uid: 11612 components: - type: Transform @@ -4658,8 +4658,6 @@ entities: - 10786 - 10785 - 10772 - - type: AtmosDevice - joinedGrid: 1 - uid: 11623 components: - type: Transform @@ -4677,8 +4675,6 @@ entities: - 11176 - 10773 - 10246 - - type: AtmosDevice - joinedGrid: 1 - uid: 11625 components: - type: Transform @@ -4692,8 +4688,6 @@ entities: - 3142 - 11337 - 10248 - - type: AtmosDevice - joinedGrid: 1 - uid: 11630 components: - type: Transform @@ -4719,8 +4713,6 @@ entities: - 3136 - 10994 - 10995 - - type: AtmosDevice - joinedGrid: 1 - uid: 11632 components: - type: Transform @@ -4730,12 +4722,6 @@ entities: devices: - 3183 - 3184 - - 3171 - - 3170 - - 3169 - - 3168 - - 3167 - - 3166 - 3165 - 3189 - 3164 @@ -4743,24 +4729,18 @@ entities: - 3172 - 10879 - 10880 - - 10902 - - 10900 - - 11646 - - 11645 - - 10903 - - 10901 - - 10924 - - 10921 - - type: AtmosDevice - joinedGrid: 1 + - 5885 + - 5882 - uid: 11634 components: - type: Transform rot: -1.5707963267948966 rad pos: -22.5,7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 + - type: DeviceList + devices: + - 5322 + - 5599 - uid: 11636 components: - type: Transform @@ -4773,8 +4753,6 @@ entities: - 10922 - 3164 - 3188 - - type: AtmosDevice - joinedGrid: 1 - uid: 11638 components: - type: Transform @@ -4792,8 +4770,6 @@ entities: - 10969 - 10968 - 10970 - - type: AtmosDevice - joinedGrid: 1 - uid: 11642 components: - type: Transform @@ -4807,8 +4783,6 @@ entities: - 3181 - 10899 - 10944 - - type: AtmosDevice - joinedGrid: 1 - uid: 11647 components: - type: Transform @@ -4824,8 +4798,6 @@ entities: - 3157 - 11054 - 11057 - - type: AtmosDevice - joinedGrid: 1 - uid: 11649 components: - type: Transform @@ -4853,8 +4825,6 @@ entities: - 11055 - 11059 - 11042 - - type: AtmosDevice - joinedGrid: 1 - uid: 11651 components: - type: Transform @@ -4871,8 +4841,6 @@ entities: - 3159 - 3161 - 11653 - - type: AtmosDevice - joinedGrid: 1 - uid: 11655 components: - type: Transform @@ -4890,8 +4858,6 @@ entities: - 11147 - 11151 - 11150 - - type: AtmosDevice - joinedGrid: 1 - uid: 11657 components: - type: Transform @@ -4906,8 +4872,6 @@ entities: - 11175 - 3272 - 3273 - - type: AtmosDevice - joinedGrid: 1 - uid: 11658 components: - type: Transform @@ -4931,8 +4895,6 @@ entities: - 3118 - 3119 - 3120 - - type: AtmosDevice - joinedGrid: 1 - uid: 11660 components: - type: Transform @@ -4949,8 +4911,6 @@ entities: - 3103 - 3104 - 3105 - - type: AtmosDevice - joinedGrid: 1 - uid: 11661 components: - type: Transform @@ -4960,8 +4920,6 @@ entities: - type: DeviceList devices: - 11667 - - type: AtmosDevice - joinedGrid: 1 - uid: 11662 components: - type: Transform @@ -4971,8 +4929,6 @@ entities: - type: DeviceList devices: - 11666 - - type: AtmosDevice - joinedGrid: 1 - uid: 11664 components: - type: Transform @@ -4992,8 +4948,6 @@ entities: - 3107 - 3108 - 3109 - - type: AtmosDevice - joinedGrid: 1 - uid: 11670 components: - type: Transform @@ -5009,8 +4963,6 @@ entities: - 11322 - 11320 - 11323 - - type: AtmosDevice - joinedGrid: 1 - uid: 11672 components: - type: Transform @@ -5027,8 +4979,6 @@ entities: - 11261 - 11331 - 11330 - - type: AtmosDevice - joinedGrid: 1 - uid: 11674 components: - type: Transform @@ -5049,8 +4999,6 @@ entities: - 3264 - 11366 - 11367 - - type: AtmosDevice - joinedGrid: 1 - uid: 11676 components: - type: Transform @@ -5077,8 +5025,6 @@ entities: - 10220 - 1832 - 3055 - - type: AtmosDevice - joinedGrid: 1 - uid: 11678 components: - type: Transform @@ -5096,8 +5042,6 @@ entities: - 10113 - 11687 - 11688 - - type: AtmosDevice - joinedGrid: 1 - uid: 11680 components: - type: Transform @@ -5114,8 +5058,6 @@ entities: - 10144 - 10143 - 10142 - - type: AtmosDevice - joinedGrid: 1 - uid: 11682 components: - type: Transform @@ -5133,8 +5075,6 @@ entities: - 11687 - 11688 - 11689 - - type: AtmosDevice - joinedGrid: 1 - uid: 11684 components: - type: Transform @@ -5149,8 +5089,6 @@ entities: - 3237 - 1222 - 11686 - - type: AtmosDevice - joinedGrid: 1 - uid: 11690 components: - type: Transform @@ -5165,8 +5103,6 @@ entities: - 3499 - 10358 - 10361 - - type: AtmosDevice - joinedGrid: 1 - uid: 11692 components: - type: Transform @@ -5181,8 +5117,6 @@ entities: - 3503 - 10362 - 10359 - - type: AtmosDevice - joinedGrid: 1 - uid: 11694 components: - type: Transform @@ -5199,8 +5133,6 @@ entities: - 3506 - 10360 - 10363 - - type: AtmosDevice - joinedGrid: 1 - uid: 11697 components: - type: Transform @@ -5218,8 +5150,6 @@ entities: - 10390 - 10389 - 10391 - - type: AtmosDevice - joinedGrid: 1 - uid: 11698 components: - type: Transform @@ -5230,8 +5160,6 @@ entities: devices: - 10413 - 10414 - - type: AtmosDevice - joinedGrid: 1 - uid: 11699 components: - type: Transform @@ -5246,8 +5174,6 @@ entities: - 11704 - 10432 - 10433 - - type: AtmosDevice - joinedGrid: 1 - uid: 11700 components: - type: Transform @@ -5262,8 +5188,6 @@ entities: - 10450 - 10449 - 10451 - - type: AtmosDevice - joinedGrid: 1 - uid: 11705 components: - type: Transform @@ -5280,8 +5204,6 @@ entities: - 3266 - 11410 - 11408 - - type: AtmosDevice - joinedGrid: 1 - uid: 11707 components: - type: Transform @@ -5310,8 +5232,6 @@ entities: - 11474 - 11480 - 11475 - - type: AtmosDevice - joinedGrid: 1 - uid: 11709 components: - type: Transform @@ -5335,8 +5255,6 @@ entities: - 7085 - 11409 - 11411 - - type: AtmosDevice - joinedGrid: 1 - uid: 11711 components: - type: Transform @@ -5351,8 +5269,6 @@ entities: - 7085 - 11507 - 11510 - - type: AtmosDevice - joinedGrid: 1 - uid: 11714 components: - type: Transform @@ -5369,8 +5285,6 @@ entities: - 2186 - 11719 - 11720 - - type: AtmosDevice - joinedGrid: 1 - uid: 11718 components: - type: Transform @@ -5387,8 +5301,6 @@ entities: - 11587 - 11588 - 11590 - - type: AtmosDevice - joinedGrid: 1 - proto: AirCanister entities: - uid: 6999 @@ -5396,113 +5308,81 @@ entities: - type: Transform pos: 37.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7000 components: - type: Transform pos: 37.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7004 components: - type: Transform pos: 37.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7204 components: - type: Transform pos: 10.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8862 components: - type: Transform pos: -15.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8867 components: - type: Transform pos: -27.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8868 components: - type: Transform pos: -34.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9126 components: - type: Transform pos: 22.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9180 components: - type: Transform pos: 26.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9250 components: - type: Transform pos: 33.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9336 components: - type: Transform pos: 35.5,18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9337 components: - type: Transform pos: 21.5,25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9338 components: - type: Transform pos: 7.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9691 components: - type: Transform pos: -17.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9692 components: - type: Transform pos: -7.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 12006 components: - type: Transform pos: 11.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: Airlock entities: - uid: 3575 @@ -6683,12 +6563,6 @@ entities: rot: 3.141592653589793 rad pos: -27.5,10.5 parent: 1 - - uid: 3395 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -23.5,17.5 - parent: 1 - uid: 3396 components: - type: Transform @@ -6734,16 +6608,6 @@ entities: parent: 1 - proto: AirlockMedicalGlassLocked entities: - - uid: 1859 - components: - - type: Transform - pos: -15.5,7.5 - parent: 1 - - uid: 1860 - components: - - type: Transform - pos: -14.5,7.5 - parent: 1 - uid: 3388 components: - type: Transform @@ -6776,23 +6640,27 @@ entities: parent: 1 - proto: AirlockMedicalLocked entities: + - uid: 223 + components: + - type: Transform + pos: -23.5,19.5 + parent: 1 - uid: 734 components: - type: Transform pos: 22.5,4.5 parent: 1 + - uid: 1890 + components: + - type: Transform + pos: -23.5,17.5 + parent: 1 - uid: 3393 components: - type: Transform rot: 3.141592653589793 rad pos: -23.5,12.5 parent: 1 - - uid: 3560 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,21.5 - parent: 1 - proto: AirlockQuartermasterLocked entities: - uid: 3596 @@ -7048,7 +6916,7 @@ entities: - type: Transform pos: 29.5,-6.5 parent: 1 -- proto: AmePart +- proto: AmePartFlatpack entities: - uid: 6775 components: @@ -7735,8 +7603,6 @@ entities: rot: 3.141592653589793 rad pos: 35.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: BassGuitarInstrument entities: - uid: 12290 @@ -7943,17 +7809,21 @@ entities: parent: 1 - proto: BedsheetMedical entities: - - uid: 5621 + - uid: 236 components: - type: Transform - rot: 3.141592653589793 rad - pos: -18.5,5.5 + pos: -16.5,5.5 parent: 1 - - uid: 5622 + - uid: 1790 components: - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,5.5 + rot: -1.5707963267948966 rad + pos: -21.5,5.5 + parent: 1 + - uid: 1855 + components: + - type: Transform + pos: -18.5,5.5 parent: 1 - proto: BedsheetMime entities: @@ -8158,6 +8028,8 @@ entities: rot: 3.141592653589793 rad pos: 30.5,24.5 parent: 1 + - type: SpamEmitSound + enabled: False - proto: Bloodpack entities: - uid: 9642 @@ -8170,7 +8042,7 @@ entities: - type: Transform pos: -26.622076,24.452543 parent: 1 -- proto: BodyBag_Container +- proto: BodyBag entities: - uid: 8242 components: @@ -8351,6 +8223,11 @@ entities: parent: 1 - proto: BoxFolderBase entities: + - uid: 1801 + components: + - type: Transform + pos: -19.42504,5.668075 + parent: 1 - uid: 3983 components: - type: Transform @@ -8526,11 +8403,6 @@ entities: - type: Transform pos: -14.371586,5.6317506 parent: 1 - - uid: 5881 - components: - - type: Transform - pos: -17.378174,5.612771 - parent: 1 - proto: BoxFolderYellow entities: - uid: 5095 @@ -8621,10 +8493,10 @@ entities: parent: 1 - proto: BoxLatexGloves entities: - - uid: 5903 + - uid: 1792 components: - type: Transform - pos: -22.54765,11.635829 + pos: -15.733353,5.3666716 parent: 1 - uid: 5907 components: @@ -8697,6 +8569,11 @@ entities: parent: 1 - proto: BoxSterileMask entities: + - uid: 250 + components: + - type: Transform + pos: -15.436478,5.6635466 + parent: 1 - uid: 5905 components: - type: Transform @@ -8707,11 +8584,6 @@ entities: - type: Transform pos: -14.459891,-1.7880898 parent: 1 - - uid: 7183 - components: - - type: Transform - pos: -22.431108,11.63326 - parent: 1 - proto: BoxSyringe entities: - uid: 6049 @@ -8804,6 +8676,41 @@ entities: - type: Transform pos: -12.5,-46.5 parent: 1 + - uid: 1785 + components: + - type: Transform + pos: -23.5,17.5 + parent: 1 + - uid: 1885 + components: + - type: Transform + pos: -23.5,16.5 + parent: 1 + - uid: 1892 + components: + - type: Transform + pos: -23.5,22.5 + parent: 1 + - uid: 1896 + components: + - type: Transform + pos: -23.5,21.5 + parent: 1 + - uid: 1897 + components: + - type: Transform + pos: -23.5,20.5 + parent: 1 + - uid: 1898 + components: + - type: Transform + pos: -23.5,19.5 + parent: 1 + - uid: 1901 + components: + - type: Transform + pos: -23.5,18.5 + parent: 1 - uid: 1943 components: - type: Transform @@ -22255,15 +22162,11 @@ entities: - type: Transform pos: -19.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6809 components: - type: Transform pos: 43.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: Carpet entities: - uid: 5022 @@ -25583,24 +25486,6 @@ entities: rot: -1.5707963267948966 rad pos: 13.5,-5.5 parent: 1 - - uid: 1899 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -13.5,8.5 - parent: 1 - - uid: 1900 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,8.5 - parent: 1 - - uid: 1901 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -19.5,8.5 - parent: 1 - uid: 3210 components: - type: Transform @@ -26272,13 +26157,6 @@ entities: - type: Transform pos: -40.481712,-24.251455 parent: 1 -- proto: ChairGreyscale - entities: - - uid: 8007 - components: - - type: Transform - pos: -25.5,7.5 - parent: 1 - proto: ChairOfficeDark entities: - uid: 778 @@ -27162,17 +27040,6 @@ entities: - 0 - 0 - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 7660 - paper_label: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - proto: ClosetL3JanitorFilled entities: - uid: 7662 @@ -27491,10 +27358,10 @@ entities: parent: 1 - proto: ClothingEyesGlasses entities: - - uid: 5887 + - uid: 1900 components: - type: Transform - pos: -17.56469,5.4986477 + pos: -19.386711,5.3087 parent: 1 - uid: 6051 components: @@ -27621,13 +27488,6 @@ entities: - type: Transform pos: -21.389526,-28.408783 parent: 1 -- proto: ClothingHeadHatHairflower - entities: - - uid: 4135 - components: - - type: Transform - pos: -3.6820545,23.685793 - parent: 1 - proto: ClothingHeadHatHoodCulthood entities: - uid: 8797 @@ -28825,6 +28685,9 @@ entities: - type: Transform pos: 1.5,49.5 parent: 1 + - type: SingletonDeviceNetServer + active: False + available: False - proto: CrewMonitoringServerMachineCircuitboard entities: - uid: 4007 @@ -28837,7 +28700,7 @@ entities: - uid: 5601 components: - type: Transform - pos: -23.451687,5.4552503 + pos: -23.596352,6.739663 parent: 1 - uid: 6336 components: @@ -28897,6 +28760,13 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-29.5 parent: 1 +- proto: CryoPod + entities: + - uid: 5598 + components: + - type: Transform + pos: -26.5,7.5 + parent: 1 - proto: CryoPodMachineCircuitboard entities: - uid: 12611 @@ -29196,6 +29066,13 @@ entities: - type: Transform pos: -26.5,30.5 parent: 1 +- proto: DefaultStationBeaconSurgery + entities: + - uid: 222 + components: + - type: Transform + pos: -23.5,21.5 + parent: 1 - proto: DefaultStationBeaconTechVault entities: - uid: 12646 @@ -29790,12 +29667,6 @@ entities: - type: Transform pos: -16.5,11.5 parent: 1 - - uid: 6131 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,9.5 - parent: 1 - uid: 6172 components: - type: Transform @@ -29928,6 +29799,12 @@ entities: parent: 1 - proto: DisposalPipe entities: + - uid: 239 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,9.5 + parent: 1 - uid: 2203 components: - type: Transform @@ -30335,12 +30212,6 @@ entities: rot: -1.5707963267948966 rad pos: -13.5,9.5 parent: 1 - - uid: 6142 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -12.5,8.5 - parent: 1 - uid: 6143 components: - type: Transform @@ -32296,12 +32167,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,11.5 parent: 1 - - uid: 6126 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -12.5,7.5 - parent: 1 - uid: 6127 components: - type: Transform @@ -32436,11 +32301,6 @@ entities: - type: Transform pos: 13.5,-4.5 parent: 1 - - uid: 1892 - components: - - type: Transform - pos: -12.5,7.5 - parent: 1 - uid: 1903 components: - type: Transform @@ -33103,15 +32963,6 @@ entities: - type: PointLight enabled: True - type: ActiveEmergencyLight - - uid: 12380 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -13.5,8.5 - parent: 1 - - type: PointLight - enabled: True - - type: ActiveEmergencyLight - uid: 12381 components: - type: Transform @@ -33312,15 +33163,15 @@ entities: parent: 1 - proto: EmergencyMedipen entities: - - uid: 1925 + - uid: 240 components: - type: Transform - pos: -22.134233,11.75826 + pos: -14.827103,5.7729216 parent: 1 - - uid: 7681 + - uid: 241 components: - type: Transform - pos: -22.212358,11.492635 + pos: -14.983353,5.4135466 parent: 1 - proto: EmergencyRollerBed entities: @@ -33695,6 +33546,13 @@ entities: parent: 1 - proto: FaxMachineBase entities: + - uid: 237 + components: + - type: Transform + pos: -22.5,11.5 + parent: 1 + - type: FaxMachine + name: Medical - uid: 4111 components: - type: Transform @@ -33723,13 +33581,6 @@ entities: parent: 1 - type: FaxMachine name: Library - - uid: 5882 - components: - - type: Transform - pos: -12.5,6.5 - parent: 1 - - type: FaxMachine - name: Medical - uid: 5974 components: - type: Transform @@ -33793,8 +33644,6 @@ entities: - 3203 - 3204 - 3205 - - type: AtmosDevice - joinedGrid: 1 - uid: 11595 components: - type: Transform @@ -33806,8 +33655,6 @@ entities: - 3197 - 3194 - 3198 - - type: AtmosDevice - joinedGrid: 1 - uid: 11596 components: - type: Transform @@ -33821,8 +33668,6 @@ entities: - 3196 - 3194 - 3195 - - type: AtmosDevice - joinedGrid: 1 - uid: 11597 components: - type: Transform @@ -33836,8 +33681,6 @@ entities: - 3193 - 3192 - 3186 - - type: AtmosDevice - joinedGrid: 1 - uid: 11599 components: - type: Transform @@ -33859,8 +33702,6 @@ entities: - 5002 - 5000 - 5001 - - type: AtmosDevice - joinedGrid: 1 - uid: 11607 components: - type: Transform @@ -33877,8 +33718,6 @@ entities: - 3213 - 3214 - 3215 - - type: AtmosDevice - joinedGrid: 1 - uid: 11610 components: - type: Transform @@ -33896,8 +33735,6 @@ entities: - 3221 - 3222 - 3223 - - type: AtmosDevice - joinedGrid: 1 - uid: 11613 components: - type: Transform @@ -33922,8 +33759,6 @@ entities: - 11616 - 11615 - 11614 - - type: AtmosDevice - joinedGrid: 1 - uid: 11624 components: - type: Transform @@ -33937,8 +33772,6 @@ entities: - 3142 - 3139 - 3140 - - type: AtmosDevice - joinedGrid: 1 - uid: 11626 components: - type: Transform @@ -33950,8 +33783,6 @@ entities: - 3146 - 3143 - 3142 - - type: AtmosDevice - joinedGrid: 1 - uid: 11631 components: - type: Transform @@ -33975,8 +33806,6 @@ entities: - 5004 - 3135 - 3136 - - type: AtmosDevice - joinedGrid: 1 - uid: 11633 components: - type: Transform @@ -33986,27 +33815,17 @@ entities: devices: - 3183 - 3184 - - 3171 - - 3170 - - 3169 - - 3168 - - 3167 - - 3166 - 3165 - 3189 - 3164 - 3173 - 3172 - - type: AtmosDevice - joinedGrid: 1 - uid: 11635 components: - type: Transform rot: -1.5707963267948966 rad pos: -22.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 11639 components: - type: Transform @@ -34018,8 +33837,6 @@ entities: - 3187 - 11637 - 11643 - - type: AtmosDevice - joinedGrid: 1 - uid: 11640 components: - type: Transform @@ -34030,8 +33847,6 @@ entities: devices: - 3164 - 3188 - - type: AtmosDevice - joinedGrid: 1 - uid: 11641 components: - type: Transform @@ -34043,8 +33858,6 @@ entities: - 3179 - 3180 - 3181 - - type: AtmosDevice - joinedGrid: 1 - uid: 11648 components: - type: Transform @@ -34058,8 +33871,6 @@ entities: - 3155 - 3156 - 3157 - - type: AtmosDevice - joinedGrid: 1 - uid: 11650 components: - type: Transform @@ -34083,8 +33894,6 @@ entities: - 3158 - 3159 - 3161 - - type: AtmosDevice - joinedGrid: 1 - uid: 11652 components: - type: Transform @@ -34097,8 +33906,6 @@ entities: - 3159 - 3161 - 11653 - - type: AtmosDevice - joinedGrid: 1 - uid: 11654 components: - type: Transform @@ -34112,8 +33919,6 @@ entities: - 3160 - 3162 - 3163 - - type: AtmosDevice - joinedGrid: 1 - uid: 11656 components: - type: Transform @@ -34124,8 +33929,6 @@ entities: devices: - 3273 - 3272 - - type: AtmosDevice - joinedGrid: 1 - uid: 11659 components: - type: Transform @@ -34147,8 +33950,6 @@ entities: - 3118 - 3119 - 3120 - - type: AtmosDevice - joinedGrid: 1 - uid: 11663 components: - type: Transform @@ -34163,8 +33964,6 @@ entities: - 3103 - 3104 - 3105 - - type: AtmosDevice - joinedGrid: 1 - uid: 11665 components: - type: Transform @@ -34182,8 +33981,6 @@ entities: - 3109 - 11668 - 11669 - - type: AtmosDevice - joinedGrid: 1 - uid: 11671 components: - type: Transform @@ -34195,8 +33992,6 @@ entities: - 1979 - 2283 - 996 - - type: AtmosDevice - joinedGrid: 1 - uid: 11673 components: - type: Transform @@ -34209,8 +34004,6 @@ entities: - 3109 - 3093 - 3092 - - type: AtmosDevice - joinedGrid: 1 - uid: 11675 components: - type: Transform @@ -34229,8 +34022,6 @@ entities: - 3266 - 3265 - 3264 - - type: AtmosDevice - joinedGrid: 1 - uid: 11677 components: - type: Transform @@ -34251,8 +34042,6 @@ entities: - 3243 - 1832 - 3055 - - type: AtmosDevice - joinedGrid: 1 - uid: 11679 components: - type: Transform @@ -34266,8 +34055,6 @@ entities: - 3232 - 11687 - 11688 - - type: AtmosDevice - joinedGrid: 1 - uid: 11681 components: - type: Transform @@ -34281,8 +34068,6 @@ entities: - 3233 - 3241 - 3242 - - type: AtmosDevice - joinedGrid: 1 - uid: 11683 components: - type: Transform @@ -34299,8 +34084,6 @@ entities: - 11687 - 11688 - 11689 - - type: AtmosDevice - joinedGrid: 1 - uid: 11685 components: - type: Transform @@ -34313,8 +34096,6 @@ entities: - 3237 - 1222 - 11686 - - type: AtmosDevice - joinedGrid: 1 - uid: 11691 components: - type: Transform @@ -34327,8 +34108,6 @@ entities: - 3127 - 3498 - 3499 - - type: AtmosDevice - joinedGrid: 1 - uid: 11693 components: - type: Transform @@ -34341,8 +34120,6 @@ entities: - 3501 - 3502 - 3503 - - type: AtmosDevice - joinedGrid: 1 - uid: 11695 components: - type: Transform @@ -34357,8 +34134,6 @@ entities: - 3504 - 3505 - 3506 - - type: AtmosDevice - joinedGrid: 1 - uid: 11696 components: - type: Transform @@ -34372,8 +34147,6 @@ entities: - 3504 - 3507 - 4898 - - type: AtmosDevice - joinedGrid: 1 - uid: 11701 components: - type: Transform @@ -34384,8 +34157,6 @@ entities: devices: - 11703 - 11704 - - type: AtmosDevice - joinedGrid: 1 - uid: 11702 components: - type: Transform @@ -34398,8 +34169,6 @@ entities: - 4897 - 11703 - 11704 - - type: AtmosDevice - joinedGrid: 1 - uid: 11706 components: - type: Transform @@ -34414,8 +34183,6 @@ entities: - 3264 - 3265 - 3266 - - type: AtmosDevice - joinedGrid: 1 - uid: 11708 components: - type: Transform @@ -34432,8 +34199,6 @@ entities: - 3269 - 3271 - 3268 - - type: AtmosDevice - joinedGrid: 1 - uid: 11710 components: - type: Transform @@ -34455,8 +34220,6 @@ entities: - 7083 - 7084 - 7085 - - type: AtmosDevice - joinedGrid: 1 - uid: 11712 components: - type: Transform @@ -34469,8 +34232,6 @@ entities: - 7083 - 7084 - 7085 - - type: AtmosDevice - joinedGrid: 1 - uid: 11715 components: - type: Transform @@ -34485,8 +34246,6 @@ entities: - 3252 - 3253 - 2186 - - type: AtmosDevice - joinedGrid: 1 - uid: 11716 components: - type: Transform @@ -34497,8 +34256,6 @@ entities: devices: - 3248 - 3249 - - type: AtmosDevice - joinedGrid: 1 - uid: 11717 components: - type: Transform @@ -34511,8 +34268,6 @@ entities: - 3595 - 7301 - 3257 - - type: AtmosDevice - joinedGrid: 1 - proto: FireAxeCabinetFilled entities: - uid: 4101 @@ -35056,12 +34811,6 @@ entities: rot: -1.5707963267948966 rad pos: 31.5,-17.5 parent: 1 - - uid: 12112 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -22.5,21.5 - parent: 1 - proto: FirelockGlass entities: - uid: 46 @@ -35454,42 +35203,6 @@ entities: rot: 1.5707963267948966 rad pos: -24.5,8.5 parent: 1 - - uid: 3166 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -21.5,7.5 - parent: 1 - - uid: 3167 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -20.5,7.5 - parent: 1 - - uid: 3168 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -18.5,7.5 - parent: 1 - - uid: 3169 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -17.5,7.5 - parent: 1 - - uid: 3170 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -15.5,7.5 - parent: 1 - - uid: 3171 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -14.5,7.5 - parent: 1 - uid: 3172 components: - type: Transform @@ -36499,6 +36212,13 @@ entities: - type: Transform pos: -9.370507,-31.394722 parent: 1 +- proto: FoodPoppy + entities: + - uid: 4135 + components: + - type: Transform + pos: -3.6820545,23.685793 + parent: 1 - proto: FoodTartMime entities: - uid: 7783 @@ -36528,8 +36248,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6841 components: - type: MetaData @@ -36538,8 +36256,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6842 components: - type: MetaData @@ -36548,8 +36264,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6843 components: - type: MetaData @@ -36558,8 +36272,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6844 components: - type: MetaData @@ -36568,8 +36280,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6845 components: - type: MetaData @@ -36578,8 +36288,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6846 components: - type: MetaData @@ -36588,8 +36296,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerCarbonDioxide entities: - uid: 6804 @@ -36597,8 +36303,6 @@ entities: - type: Transform pos: 44.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerNitrogenStation entities: - uid: 6808 @@ -36606,8 +36310,6 @@ entities: - type: Transform pos: 44.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerOxygenStation entities: - uid: 6807 @@ -36615,8 +36317,6 @@ entities: - type: Transform pos: 44.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerWaterVapor entities: - uid: 6805 @@ -36624,8 +36324,6 @@ entities: - type: Transform pos: 44.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMixer entities: - uid: 6942 @@ -36635,8 +36333,6 @@ entities: - type: Transform pos: 37.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMixerFlipped entities: - uid: 6932 @@ -36650,8 +36346,6 @@ entities: - type: GasMixer inletTwoConcentration: 0.22000003 inletOneConcentration: 0.78 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 6943 @@ -36662,8 +36356,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6944 components: - type: MetaData @@ -36672,8 +36364,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6945 components: - type: MetaData @@ -36682,8 +36372,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6946 components: - type: MetaData @@ -36692,16 +36380,12 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6947 components: - type: Transform rot: 3.141592653589793 rad pos: 37.5,-16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasOutletInjector entities: - uid: 1436 @@ -36710,64 +36394,48 @@ entities: rot: -1.5707963267948966 rad pos: 43.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6815 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6816 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6817 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6818 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6819 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6821 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6959 components: - type: Transform rot: 3.141592653589793 rad pos: 36.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasPassiveVent entities: - uid: 6119 @@ -36776,114 +36444,94 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6120 components: - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6121 components: - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6122 components: - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6839 components: - type: Transform rot: 3.141592653589793 rad pos: 38.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6875 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6876 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6877 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6878 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6879 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6880 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6881 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6958 components: - type: Transform rot: 3.141592653589793 rad pos: 34.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6992 components: - type: Transform rot: -1.5707963267948966 rad pos: 41.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasPipeBend entities: + - uid: 5881 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 6882 components: - type: Transform @@ -37926,6 +37574,13 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 3171 + components: + - type: Transform + pos: -24.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 10454 components: - type: Transform @@ -37954,13 +37609,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' - - uid: 10877 - components: - - type: Transform - pos: -15.5,10.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 10926 components: - type: Transform @@ -38033,11 +37681,43 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 1925 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -24.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 3168 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 3169 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -21.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 3351 components: - type: Transform pos: 38.5,-4.5 parent: 1 + - uid: 4884 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 5007 components: - type: Transform @@ -38046,6 +37726,14 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 5621 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 6103 components: - type: Transform @@ -42961,86 +42649,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' - - uid: 10881 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10882 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10883 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10884 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10885 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10886 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10887 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10888 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10889 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10890 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 10891 components: - type: Transform @@ -43185,20 +42793,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 10919 - components: - - type: Transform - pos: -25.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10920 - components: - - type: Transform - pos: -24.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - uid: 10927 components: - type: Transform @@ -47517,6 +47111,35 @@ entities: color: '#0055CCFF' - proto: GasPipeTJunction entities: + - uid: 3395 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -15.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 5321 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -26.5,6.5 + parent: 1 + - uid: 5600 + components: + - type: Transform + pos: -17.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 5622 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -16.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 6820 components: - type: Transform @@ -48340,21 +47963,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 10863 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10864 - components: - - type: Transform - pos: -17.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - uid: 10872 components: - type: Transform @@ -48362,27 +47970,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' - - uid: 10875 - components: - - type: Transform - pos: -14.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10876 - components: - - type: Transform - pos: -20.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10878 - components: - - type: Transform - pos: -21.5,10.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 10905 components: - type: Transform @@ -49061,8 +48648,6 @@ entities: - type: Transform pos: 10.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 3835 @@ -49070,8 +48655,6 @@ entities: - type: Transform pos: 11.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 5918 @@ -49079,82 +48662,70 @@ entities: - type: Transform pos: 35.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6101 components: - type: Transform rot: -1.5707963267948966 rad pos: -14.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6102 components: - type: Transform rot: -1.5707963267948966 rad pos: -14.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6109 components: - type: Transform rot: -1.5707963267948966 rad pos: -15.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6110 components: - type: Transform rot: -1.5707963267948966 rad pos: -15.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6984 components: - type: Transform rot: -1.5707963267948966 rad pos: 35.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6985 components: - type: Transform rot: -1.5707963267948966 rad pos: 35.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6986 components: - type: Transform rot: -1.5707963267948966 rad pos: 35.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7199 components: - type: Transform rot: 3.141592653589793 rad pos: 10.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7203 components: - type: Transform rot: 3.141592653589793 rad pos: 11.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasPressurePump entities: + - uid: 3170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -25.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 3239 components: - type: MetaData @@ -49162,8 +48733,6 @@ entities: - type: Transform pos: 38.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 6104 @@ -49172,32 +48741,24 @@ entities: rot: -1.5707963267948966 rad pos: -16.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6106 components: - type: Transform rot: 1.5707963267948966 rad pos: -16.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6107 components: - type: Transform rot: -1.5707963267948966 rad pos: -16.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6108 components: - type: Transform rot: 1.5707963267948966 rad pos: -16.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6868 components: - type: MetaData @@ -49206,8 +48767,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6869 components: - type: MetaData @@ -49216,8 +48775,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6870 components: - type: MetaData @@ -49226,8 +48783,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6871 components: - type: MetaData @@ -49236,8 +48791,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6872 components: - type: MetaData @@ -49246,8 +48799,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6873 components: - type: MetaData @@ -49256,16 +48807,12 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6874 components: - type: Transform rot: -1.5707963267948966 rad pos: 39.5,-16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6964 components: - type: MetaData @@ -49273,8 +48820,6 @@ entities: - type: Transform pos: 35.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 6976 @@ -49284,8 +48829,6 @@ entities: - type: Transform pos: 35.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6977 components: - type: MetaData @@ -49293,8 +48836,6 @@ entities: - type: Transform pos: 36.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6980 components: - type: MetaData @@ -49303,15 +48844,11 @@ entities: rot: 3.141592653589793 rad pos: 34.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 10190 components: - type: Transform pos: 10.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10192 @@ -49319,26 +48856,26 @@ entities: - type: Transform pos: 11.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasThermoMachineFreezer entities: + - uid: 5319 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,5.5 + parent: 1 - uid: 7020 components: - type: Transform pos: 34.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7021 components: - type: Transform pos: 34.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasThermoMachineHeater entities: - uid: 6814 @@ -49346,8 +48883,6 @@ entities: - type: Transform pos: 34.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasValve entities: - uid: 6978 @@ -49358,8 +48893,6 @@ entities: parent: 1 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 1 - uid: 6990 components: - type: Transform @@ -49368,17 +48901,35 @@ entities: parent: 1 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 1 - proto: GasVentPump entities: + - uid: 5599 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -23.5,6.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11634 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 5885 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11632 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 7151 components: - type: Transform pos: 34.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 7182 @@ -49387,8 +48938,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10112 @@ -49396,8 +48945,6 @@ entities: - type: Transform pos: 27.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10115 @@ -49406,8 +48953,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10143 @@ -49416,8 +48961,6 @@ entities: rot: 3.141592653589793 rad pos: 16.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10144 @@ -49426,8 +48969,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10160 @@ -49435,8 +48976,6 @@ entities: - type: Transform pos: 20.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10204 @@ -49445,8 +48984,6 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10219 @@ -49455,8 +48992,6 @@ entities: rot: -1.5707963267948966 rad pos: 11.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10236 @@ -49465,8 +49000,6 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10246 @@ -49475,8 +49008,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10247 @@ -49485,8 +49016,6 @@ entities: rot: 1.5707963267948966 rad pos: -1.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10248 @@ -49495,8 +49024,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10358 @@ -49504,8 +49031,6 @@ entities: - type: Transform pos: 17.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10359 @@ -49513,8 +49038,6 @@ entities: - type: Transform pos: 29.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10360 @@ -49522,8 +49045,6 @@ entities: - type: Transform pos: 40.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10390 @@ -49532,8 +49053,6 @@ entities: rot: 1.5707963267948966 rad pos: 45.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10391 @@ -49542,8 +49061,6 @@ entities: rot: 1.5707963267948966 rad pos: 45.5,17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10413 @@ -49552,8 +49069,6 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10432 @@ -49562,8 +49077,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10450 @@ -49572,8 +49085,6 @@ entities: rot: -1.5707963267948966 rad pos: 44.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10451 @@ -49582,8 +49093,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,34.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10475 @@ -49592,8 +49101,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10512 @@ -49602,8 +49109,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10513 @@ -49612,8 +49117,6 @@ entities: rot: 3.141592653589793 rad pos: 15.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10514 @@ -49622,8 +49125,6 @@ entities: rot: 3.141592653589793 rad pos: 18.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10547 @@ -49632,8 +49133,6 @@ entities: rot: 3.141592653589793 rad pos: 22.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10548 @@ -49642,8 +49141,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10552 @@ -49651,8 +49148,6 @@ entities: - type: Transform pos: 20.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10600 @@ -49661,8 +49156,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10602 @@ -49671,8 +49164,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10604 @@ -49681,8 +49172,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10661 @@ -49691,8 +49180,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10662 @@ -49701,8 +49188,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,27.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10663 @@ -49710,8 +49195,6 @@ entities: - type: Transform pos: 29.5,26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10665 @@ -49719,8 +49202,6 @@ entities: - type: Transform pos: 7.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10697 @@ -49729,8 +49210,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10706 @@ -49738,8 +49217,6 @@ entities: - type: Transform pos: -0.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10707 @@ -49748,8 +49225,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10724 @@ -49757,8 +49232,6 @@ entities: - type: Transform pos: 3.5,30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10725 @@ -49767,8 +49240,6 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10748 @@ -49776,8 +49247,6 @@ entities: - type: Transform pos: -1.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10749 @@ -49786,8 +49255,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10762 @@ -49796,8 +49263,6 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10785 @@ -49806,8 +49271,6 @@ entities: rot: 3.141592653589793 rad pos: 0.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10786 @@ -49816,8 +49279,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10821 @@ -49825,8 +49286,6 @@ entities: - type: Transform pos: -3.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10843 @@ -49835,8 +49294,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10879 @@ -49845,28 +49302,6 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10902 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10903 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10923 @@ -49874,18 +49309,6 @@ entities: - type: Transform pos: -23.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10924 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -24.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10943 @@ -49894,8 +49317,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10944 @@ -49904,8 +49325,6 @@ entities: rot: -1.5707963267948966 rad pos: -12.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10967 @@ -49914,8 +49333,6 @@ entities: rot: 3.141592653589793 rad pos: -14.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10968 @@ -49924,8 +49341,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10969 @@ -49934,8 +49349,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10995 @@ -49944,8 +49357,6 @@ entities: rot: 1.5707963267948966 rad pos: -5.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11057 @@ -49953,8 +49364,6 @@ entities: - type: Transform pos: -12.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11058 @@ -49962,8 +49371,6 @@ entities: - type: Transform pos: -23.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11059 @@ -49971,8 +49378,6 @@ entities: - type: Transform pos: -34.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11082 @@ -49981,8 +49386,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11083 @@ -49990,8 +49393,6 @@ entities: - type: Transform pos: -32.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11121 @@ -50000,8 +49401,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11122 @@ -50010,8 +49409,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11123 @@ -50020,8 +49417,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11124 @@ -50030,8 +49425,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11129 @@ -50039,8 +49432,6 @@ entities: - type: Transform pos: -40.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11149 @@ -50049,8 +49440,6 @@ entities: rot: -1.5707963267948966 rad pos: -40.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11150 @@ -50059,8 +49448,6 @@ entities: rot: 3.141592653589793 rad pos: -40.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11162 @@ -50069,8 +49456,6 @@ entities: rot: 1.5707963267948966 rad pos: -38.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11163 @@ -50079,8 +49464,6 @@ entities: rot: 3.141592653589793 rad pos: -37.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11195 @@ -50089,8 +49472,6 @@ entities: rot: 1.5707963267948966 rad pos: -5.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11234 @@ -50099,8 +49480,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11242 @@ -50108,8 +49487,6 @@ entities: - type: Transform pos: -9.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11261 @@ -50117,8 +49494,6 @@ entities: - type: Transform pos: -17.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11285 @@ -50127,8 +49502,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11286 @@ -50137,8 +49510,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11320 @@ -50146,8 +49517,6 @@ entities: - type: Transform pos: -26.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11321 @@ -50156,8 +49525,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11330 @@ -50166,8 +49533,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11367 @@ -50176,8 +49541,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11410 @@ -50186,8 +49549,6 @@ entities: rot: 1.5707963267948966 rad pos: 1.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11411 @@ -50196,8 +49557,6 @@ entities: rot: 1.5707963267948966 rad pos: 1.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11476 @@ -50206,8 +49565,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11477 @@ -50216,8 +49573,6 @@ entities: rot: 3.141592653589793 rad pos: -6.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11478 @@ -50226,8 +49581,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11479 @@ -50235,8 +49588,6 @@ entities: - type: Transform pos: -3.5,-21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11480 @@ -50245,8 +49596,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11482 @@ -50254,8 +49603,6 @@ entities: - type: Transform pos: -7.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11510 @@ -50264,8 +49611,6 @@ entities: rot: 1.5707963267948966 rad pos: 1.5,-30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11511 @@ -50274,8 +49619,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,-33.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11512 @@ -50284,8 +49627,6 @@ entities: rot: 1.5707963267948966 rad pos: -6.5,-32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11526 @@ -50294,8 +49635,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11539 @@ -50304,8 +49643,6 @@ entities: rot: 1.5707963267948966 rad pos: 6.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11589 @@ -50314,8 +49651,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11590 @@ -50324,8 +49659,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11591 @@ -50334,8 +49667,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,-26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11605 @@ -50344,8 +49675,6 @@ entities: rot: 3.141592653589793 rad pos: 16.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11608 @@ -50354,18 +49683,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 11646 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -17.5,8.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11720 @@ -50374,8 +49691,6 @@ entities: rot: -1.5707963267948966 rad pos: 10.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12148 @@ -50384,8 +49699,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-49.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12268 @@ -50394,8 +49707,6 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,52.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12269 @@ -50404,8 +49715,6 @@ entities: rot: 1.5707963267948966 rad pos: -3.5,52.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12276 @@ -50414,8 +49723,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,52.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12279 @@ -50424,8 +49731,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,46.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12280 @@ -50434,8 +49739,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,44.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasVentScrubber @@ -50445,8 +49748,28 @@ entities: - type: Transform pos: 12.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 5322 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,7.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11634 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 5882 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -17.5,7.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11632 - type: AtmosPipeColor color: '#990000FF' - uid: 7152 @@ -50455,8 +49778,6 @@ entities: rot: -1.5707963267948966 rad pos: 34.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10113 @@ -50464,8 +49785,6 @@ entities: - type: Transform pos: 28.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10114 @@ -50473,8 +49792,6 @@ entities: - type: Transform pos: 25.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10142 @@ -50483,8 +49800,6 @@ entities: rot: 3.141592653589793 rad pos: 18.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10145 @@ -50493,8 +49808,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10161 @@ -50503,8 +49816,6 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10197 @@ -50513,8 +49824,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10220 @@ -50523,8 +49832,6 @@ entities: rot: -1.5707963267948966 rad pos: 11.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10237 @@ -50533,8 +49840,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10361 @@ -50543,8 +49848,6 @@ entities: rot: 3.141592653589793 rad pos: 16.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10362 @@ -50553,8 +49856,6 @@ entities: rot: 3.141592653589793 rad pos: 31.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10363 @@ -50563,8 +49864,6 @@ entities: rot: 3.141592653589793 rad pos: 41.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10388 @@ -50573,8 +49872,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10389 @@ -50583,8 +49880,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10414 @@ -50593,8 +49888,6 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10433 @@ -50603,8 +49896,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,27.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10448 @@ -50613,8 +49904,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10449 @@ -50623,8 +49912,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,33.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10474 @@ -50633,8 +49920,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10509 @@ -50643,8 +49928,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10510 @@ -50653,8 +49936,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10511 @@ -50663,8 +49944,6 @@ entities: rot: 3.141592653589793 rad pos: 17.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10549 @@ -50673,8 +49952,6 @@ entities: rot: 3.141592653589793 rad pos: 21.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10550 @@ -50683,8 +49960,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10551 @@ -50692,8 +49967,6 @@ entities: - type: Transform pos: 21.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10599 @@ -50702,8 +49975,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10601 @@ -50712,8 +49983,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10603 @@ -50722,8 +49991,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10658 @@ -50732,8 +49999,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10659 @@ -50742,8 +50007,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10660 @@ -50752,8 +50015,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,28.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10664 @@ -50762,8 +50023,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10696 @@ -50772,8 +50031,6 @@ entities: rot: 1.5707963267948966 rad pos: 4.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10726 @@ -50782,8 +50039,6 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,28.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10727 @@ -50791,8 +50046,6 @@ entities: - type: Transform pos: 4.5,30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10750 @@ -50801,8 +50054,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10751 @@ -50811,8 +50062,6 @@ entities: rot: 3.141592653589793 rad pos: -0.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10763 @@ -50821,8 +50070,6 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10772 @@ -50831,8 +50078,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10773 @@ -50841,8 +50086,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10778 @@ -50851,8 +50094,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10812 @@ -50860,8 +50101,6 @@ entities: - type: Transform pos: 0.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10813 @@ -50870,8 +50109,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10814 @@ -50880,8 +50117,6 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10842 @@ -50889,8 +50124,6 @@ entities: - type: Transform pos: -8.5,11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10880 @@ -50899,8 +50132,6 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10899 @@ -50908,38 +50139,6 @@ entities: - type: Transform pos: -12.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10900 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10901 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10921 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -25.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10922 @@ -50947,8 +50146,6 @@ entities: - type: Transform pos: -24.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10945 @@ -50957,8 +50154,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10970 @@ -50967,8 +50162,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10971 @@ -50977,8 +50170,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10972 @@ -50986,8 +50177,6 @@ entities: - type: Transform pos: -13.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10994 @@ -50996,8 +50185,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11042 @@ -51006,8 +50193,6 @@ entities: rot: 3.141592653589793 rad pos: -35.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11054 @@ -51016,8 +50201,6 @@ entities: rot: 3.141592653589793 rad pos: -13.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11055 @@ -51026,8 +50209,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11084 @@ -51036,8 +50217,6 @@ entities: rot: -1.5707963267948966 rad pos: -34.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11085 @@ -51046,8 +50225,6 @@ entities: rot: -1.5707963267948966 rad pos: -33.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11147 @@ -51056,8 +50233,6 @@ entities: rot: 1.5707963267948966 rad pos: -40.5,7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11148 @@ -51065,8 +50240,6 @@ entities: - type: Transform pos: -39.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11151 @@ -51075,8 +50248,6 @@ entities: rot: 1.5707963267948966 rad pos: -40.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11174 @@ -51085,8 +50256,6 @@ entities: rot: 1.5707963267948966 rad pos: -38.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11175 @@ -51095,8 +50264,6 @@ entities: rot: 3.141592653589793 rad pos: -36.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11176 @@ -51105,8 +50272,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11233 @@ -51115,8 +50280,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11241 @@ -51124,8 +50287,6 @@ entities: - type: Transform pos: -8.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11260 @@ -51133,8 +50294,6 @@ entities: - type: Transform pos: -15.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11283 @@ -51143,8 +50302,6 @@ entities: rot: -1.5707963267948966 rad pos: -14.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11284 @@ -51153,8 +50310,6 @@ entities: rot: 3.141592653589793 rad pos: -15.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11322 @@ -51163,8 +50318,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11323 @@ -51172,8 +50325,6 @@ entities: - type: Transform pos: -24.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11331 @@ -51182,8 +50333,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11332 @@ -51192,8 +50341,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11337 @@ -51202,8 +50349,6 @@ entities: rot: -1.5707963267948966 rad pos: -0.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11366 @@ -51211,8 +50356,6 @@ entities: - type: Transform pos: -1.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11408 @@ -51221,8 +50364,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11409 @@ -51231,8 +50372,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11471 @@ -51240,8 +50379,6 @@ entities: - type: Transform pos: -2.5,-21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11472 @@ -51250,8 +50387,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11473 @@ -51260,8 +50395,6 @@ entities: rot: 3.141592653589793 rad pos: -5.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11474 @@ -51270,8 +50403,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11475 @@ -51280,8 +50411,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11481 @@ -51290,8 +50419,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11507 @@ -51300,8 +50427,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11508 @@ -51310,8 +50435,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-33.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11509 @@ -51320,8 +50443,6 @@ entities: rot: 1.5707963267948966 rad pos: -6.5,-31.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11527 @@ -51330,8 +50451,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11538 @@ -51339,8 +50458,6 @@ entities: - type: Transform pos: 5.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11552 @@ -51349,8 +50466,6 @@ entities: rot: 3.141592653589793 rad pos: 10.5,-26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11587 @@ -51359,8 +50474,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11588 @@ -51369,8 +50482,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11604 @@ -51378,8 +50489,6 @@ entities: - type: Transform pos: 17.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11609 @@ -51387,18 +50496,6 @@ entities: - type: Transform pos: 31.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 11645 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -18.5,8.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11719 @@ -51407,8 +50504,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12147 @@ -51417,8 +50512,6 @@ entities: rot: 3.141592653589793 rad pos: -15.5,-49.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12270 @@ -51427,8 +50520,6 @@ entities: rot: -1.5707963267948966 rad pos: -3.5,51.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12271 @@ -51437,8 +50528,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,53.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12272 @@ -51447,8 +50536,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,53.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12277 @@ -51457,8 +50544,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,45.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12278 @@ -51467,8 +50552,6 @@ entities: rot: 3.141592653589793 rad pos: -7.5,44.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - proto: GeneratorBasic15kW @@ -51490,21 +50573,6 @@ entities: - type: Transform pos: -10.5,-19.5 parent: 1 - - uid: 1763 - components: - - type: Transform - pos: -25.5,19.5 - parent: 1 - - uid: 1788 - components: - - type: Transform - pos: -24.5,19.5 - parent: 1 - - uid: 1792 - components: - - type: Transform - pos: -27.5,22.5 - parent: 1 - proto: GravityGenerator entities: - uid: 7548 @@ -51763,16 +50831,6 @@ entities: - type: Transform pos: -25.5,8.5 parent: 1 - - uid: 240 - components: - - type: Transform - pos: -13.5,6.5 - parent: 1 - - uid: 241 - components: - - type: Transform - pos: -13.5,5.5 - parent: 1 - uid: 242 components: - type: Transform @@ -51793,16 +50851,6 @@ entities: - type: Transform pos: -11.5,4.5 parent: 1 - - uid: 246 - components: - - type: Transform - pos: -16.5,5.5 - parent: 1 - - uid: 247 - components: - - type: Transform - pos: -16.5,6.5 - parent: 1 - uid: 248 components: - type: Transform @@ -51813,16 +50861,6 @@ entities: - type: Transform pos: -18.5,4.5 parent: 1 - - uid: 250 - components: - - type: Transform - pos: -19.5,5.5 - parent: 1 - - uid: 251 - components: - - type: Transform - pos: -19.5,6.5 - parent: 1 - uid: 252 components: - type: Transform @@ -52873,22 +51911,11 @@ entities: - type: Transform pos: 21.5,-28.5 parent: 1 - - uid: 1785 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -24.5,25.5 - parent: 1 - uid: 1800 components: - type: Transform pos: 30.5,14.5 parent: 1 - - uid: 1801 - components: - - type: Transform - pos: -23.5,19.5 - parent: 1 - uid: 1953 components: - type: Transform @@ -55181,18 +54208,6 @@ entities: parent: 1 - proto: GrilleBroken entities: - - uid: 1786 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -23.5,25.5 - parent: 1 - - uid: 1790 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -27.5,23.5 - parent: 1 - uid: 2917 components: - type: Transform @@ -55879,7 +54894,7 @@ entities: - uid: 8243 components: - type: Transform - pos: -24.61685,20.770723 + pos: -24.643688,20.826443 parent: 1 - uid: 9627 components: @@ -55950,28 +54965,6 @@ entities: rot: -1.5707963267948966 rad pos: -18.5,16.5 parent: 1 - - uid: 1855 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,7.5 - parent: 1 - - uid: 1856 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -20.5,7.5 - parent: 1 - - uid: 1857 - components: - - type: Transform - pos: -17.5,7.5 - parent: 1 - - uid: 1858 - components: - - type: Transform - pos: -18.5,7.5 - parent: 1 - uid: 5371 components: - type: Transform @@ -57776,15 +56769,20 @@ entities: parent: 1 - proto: MedicalBed entities: - - uid: 1853 + - uid: 251 components: - type: Transform - pos: -18.5,5.5 + pos: -21.5,5.5 parent: 1 - uid: 1854 components: - type: Transform - pos: -15.5,5.5 + pos: -16.5,5.5 + parent: 1 + - uid: 1857 + components: + - type: Transform + pos: -18.5,5.5 parent: 1 - uid: 1862 components: @@ -58092,7 +57090,7 @@ entities: - uid: 5602 components: - type: Transform - pos: -23.538898,5.5020247 + pos: -23.518227,6.599038 parent: 1 - proto: NitrogenCanister entities: @@ -58101,99 +57099,71 @@ entities: - type: Transform pos: 43.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6996 components: - type: Transform pos: 36.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6998 components: - type: Transform pos: 35.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8864 components: - type: Transform pos: -13.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8865 components: - type: Transform pos: -29.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8869 components: - type: Transform pos: -32.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9127 components: - type: Transform pos: 24.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9182 components: - type: Transform pos: 28.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9251 components: - type: Transform pos: 31.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9342 components: - type: Transform pos: 35.5,16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9343 components: - type: Transform pos: 21.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9344 components: - type: Transform pos: 7.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9693 components: - type: Transform pos: -15.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9694 components: - type: Transform pos: -7.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: NitrogenTankFilled entities: - uid: 8927 @@ -58213,22 +57183,16 @@ entities: - type: Transform pos: -18.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6810 components: - type: Transform pos: 43.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7003 components: - type: Transform pos: 36.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: NuclearBomb entities: - uid: 4128 @@ -58278,141 +57242,113 @@ entities: - type: Transform pos: 28.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 4924 components: - type: Transform pos: 41.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6802 components: - type: Transform pos: 43.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6995 components: - type: Transform pos: 36.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6997 components: - type: Transform pos: 35.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7283 components: - type: Transform pos: 26.5,-23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8805 components: - type: Transform pos: -34.5,-23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8863 components: - type: Transform pos: -14.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8866 components: - type: Transform pos: -28.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8870 components: - type: Transform pos: -33.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9128 components: - type: Transform pos: 23.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9181 components: - type: Transform pos: 27.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9252 components: - type: Transform pos: 32.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9339 components: - type: Transform pos: 7.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9340 components: - type: Transform pos: 21.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9341 components: - type: Transform pos: 35.5,17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9662 components: - type: Transform pos: -29.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9664 components: - type: Transform pos: -18.5,31.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9695 components: - type: Transform pos: -16.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9696 components: - type: Transform pos: -7.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 +- proto: OxygenTankFilled + entities: + - uid: 8928 + components: + - type: Transform + pos: -33.421288,-7.524516 + parent: 1 + - uid: 9731 + components: + - type: Transform + pos: -28.423817,12.547613 + parent: 1 - proto: PaintingMonkey entities: - uid: 5040 @@ -58544,6 +57480,16 @@ entities: parent: 1 - proto: PaperOffice entities: + - uid: 232 + components: + - type: Transform + pos: -19.784414,5.480575 + parent: 1 + - uid: 1899 + components: + - type: Transform + pos: -19.565664,5.5587 + parent: 1 - uid: 3999 components: - type: Transform @@ -58769,16 +57715,6 @@ entities: - type: Transform pos: -14.637211,5.5536256 parent: 1 - - uid: 5885 - components: - - type: Transform - pos: -17.62719,5.5455227 - parent: 1 - - uid: 5886 - components: - - type: Transform - pos: -17.62719,5.5455227 - parent: 1 - uid: 5888 components: - type: Transform @@ -59315,22 +58251,16 @@ entities: - type: Transform pos: -20.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6812 components: - type: Transform pos: 43.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7002 components: - type: Transform pos: 35.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: PlasticFlapsAirtightClear entities: - uid: 1743 @@ -59927,6 +58857,11 @@ entities: parent: 1 - proto: PowerCellRecharger entities: + - uid: 246 + components: + - type: Transform + pos: -21.5,11.5 + parent: 1 - uid: 785 components: - type: Transform @@ -59952,11 +58887,6 @@ entities: - type: Transform pos: -9.5,7.5 parent: 1 - - uid: 5902 - components: - - type: Transform - pos: -21.5,11.5 - parent: 1 - uid: 5972 components: - type: Transform @@ -60007,6 +58937,11 @@ entities: parent: 1 - type: ApcPowerReceiver powerLoad: 0 + - uid: 1860 + components: + - type: Transform + pos: -24.5,24.5 + parent: 1 - uid: 3918 components: - type: Transform @@ -60350,14 +59285,6 @@ entities: parent: 1 - type: ApcPowerReceiver powerLoad: 0 - - uid: 5931 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,8.5 - parent: 1 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 5932 components: - type: Transform @@ -60397,22 +59324,6 @@ entities: parent: 1 - type: ApcPowerReceiver powerLoad: 0 - - uid: 5937 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -18.5,6.5 - parent: 1 - - type: ApcPowerReceiver - powerLoad: 0 - - uid: 5938 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -15.5,6.5 - parent: 1 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 5939 components: - type: Transform @@ -61534,6 +60445,12 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-48.5 parent: 1 + - uid: 3560 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -23.5,6.5 + parent: 1 - uid: 4842 components: - type: Transform @@ -61571,11 +60488,6 @@ entities: rot: 1.5707963267948966 rad pos: 44.5,20.5 parent: 1 - - uid: 5598 - components: - - type: Transform - pos: -23.5,5.5 - parent: 1 - uid: 7074 components: - type: Transform @@ -61611,11 +60523,6 @@ entities: - type: Transform pos: -5.5,-28.5 parent: 1 - - uid: 8232 - components: - - type: Transform - pos: -26.5,7.5 - parent: 1 - uid: 8240 components: - type: Transform @@ -62009,6 +60916,11 @@ entities: parent: 1 - proto: RandomArtifactSpawner entities: + - uid: 247 + components: + - type: Transform + pos: -20.5,24.5 + parent: 1 - uid: 6321 components: - type: Transform @@ -62031,11 +60943,6 @@ entities: - type: Transform pos: 42.5,19.5 parent: 1 - - uid: 8235 - components: - - type: Transform - pos: -25.5,23.5 - parent: 1 - proto: RandomBoard entities: - uid: 5005 @@ -62760,16 +61667,6 @@ entities: - type: Transform pos: -27.5,26.5 parent: 1 - - uid: 11805 - components: - - type: Transform - pos: -23.5,22.5 - parent: 1 - - uid: 11806 - components: - - type: Transform - pos: -25.5,21.5 - parent: 1 - uid: 11807 components: - type: Transform @@ -62895,11 +61792,6 @@ entities: - type: Transform pos: -29.5,15.5 parent: 1 - - uid: 11833 - components: - - type: Transform - pos: -23.5,18.5 - parent: 1 - uid: 11834 components: - type: Transform @@ -65619,10 +64511,11 @@ entities: parent: 1 - proto: SheetGlass entities: - - uid: 5600 + - uid: 3166 components: - type: Transform - pos: -23.623562,5.5177503 + rot: 3.141592653589793 rad + pos: -23.643227,6.536538 parent: 1 - uid: 6022 components: @@ -65739,16 +64632,17 @@ entities: parent: 1 - proto: SheetPlastic entities: + - uid: 3167 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -23.486977,6.645913 + parent: 1 - uid: 5419 components: - type: Transform pos: 37.26254,10.609375 parent: 1 - - uid: 5599 - components: - - type: Transform - pos: -23.404812,5.5177503 - parent: 1 - uid: 6020 components: - type: Transform @@ -65973,49 +64867,31 @@ entities: - type: Transform pos: -21.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1896 - uid: 1937 components: - type: Transform pos: -20.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1896 - uid: 1938 components: - type: Transform pos: -18.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1897 - uid: 1939 components: - type: Transform pos: -17.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1897 - uid: 1940 components: - type: Transform pos: -15.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1898 - uid: 1941 components: - type: Transform pos: -14.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1898 - uid: 3618 components: - type: Transform @@ -66364,42 +65240,6 @@ entities: - Pressed: Toggle 3433: - Pressed: Toggle - - uid: 1896 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -19.5,7.5 - parent: 1 - - type: DeviceLinkSource - linkedPorts: - 1937: - - Pressed: Toggle - 1936: - - Pressed: Toggle - - uid: 1897 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,7.5 - parent: 1 - - type: DeviceLinkSource - linkedPorts: - 1939: - - Pressed: Toggle - 1938: - - Pressed: Toggle - - uid: 1898 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -13.5,7.5 - parent: 1 - - type: DeviceLinkSource - linkedPorts: - 1941: - - Pressed: Toggle - 1940: - - Pressed: Toggle - uid: 1978 components: - type: Transform @@ -67281,11 +66121,10 @@ entities: parent: 1 - proto: SignSurgery entities: - - uid: 4884 + - uid: 1859 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,20.5 + pos: -24.5,19.5 parent: 1 - proto: SignTelecomms entities: @@ -67830,6 +66669,8 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,-50.5 parent: 1 + - type: SpamEmitSound + enabled: False - proto: SpawnMobAlexander entities: - uid: 11924 @@ -67872,23 +66713,6 @@ entities: - type: Transform pos: 36.5,-11.5 parent: 1 -- proto: SpawnMobDrone - entities: - - uid: 9658 - components: - - type: Transform - pos: 11.5,27.5 - parent: 1 - - uid: 9659 - components: - - type: Transform - pos: 12.5,27.5 - parent: 1 - - uid: 9661 - components: - - type: Transform - pos: 13.5,27.5 - parent: 1 - proto: SpawnMobFoxRenault entities: - uid: 4084 @@ -68329,25 +67153,6 @@ entities: - type: Transform pos: 28.5,17.5 parent: 1 -- proto: SpawnVehicleJanicart - entities: - - uid: 7663 - components: - - type: Transform - pos: 14.5,-1.5 - parent: 1 -- proto: SpawnVehicleSecway - entities: - - uid: 5319 - components: - - type: Transform - pos: 18.5,10.5 - parent: 1 - - uid: 5320 - components: - - type: Transform - pos: 19.5,10.5 - parent: 1 - proto: SpawnVendingMachineRestockDrink entities: - uid: 3058 @@ -68439,10 +67244,10 @@ entities: parent: 1 - proto: StasisBed entities: - - uid: 1885 + - uid: 238 components: - type: Transform - pos: -21.5,5.5 + pos: -13.5,5.5 parent: 1 - proto: StationMap entities: @@ -68560,50 +67365,36 @@ entities: - type: Transform pos: -17.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6813 components: - type: Transform pos: 43.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6993 components: - type: Transform pos: 34.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7001 components: - type: Transform pos: 34.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9561 components: - type: Transform pos: 35.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9562 components: - type: Transform pos: 35.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9563 components: - type: Transform pos: 35.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: Stunbaton entities: - uid: 5327 @@ -69293,6 +68084,11 @@ entities: parent: 1 - proto: Table entities: + - uid: 224 + components: + - type: Transform + pos: -14.5,5.5 + parent: 1 - uid: 233 components: - type: Transform @@ -69335,18 +68131,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,12.5 parent: 1 - - uid: 483 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -17.5,5.5 - parent: 1 - - uid: 484 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,5.5 - parent: 1 - uid: 485 components: - type: Transform @@ -69480,11 +68264,17 @@ entities: rot: -1.5707963267948966 rad pos: 24.5,27.5 parent: 1 - - uid: 1890 + - uid: 1853 components: - type: Transform - rot: 3.141592653589793 rad - pos: -12.5,6.5 + rot: -1.5707963267948966 rad + pos: -15.5,5.5 + parent: 1 + - uid: 1856 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,5.5 parent: 1 - uid: 1902 components: @@ -71252,36 +70042,6 @@ entities: - type: Transform pos: -3.5,-3.5 parent: 1 - - uid: 232 - components: - - type: Transform - pos: -13.5,6.5 - parent: 1 - - uid: 236 - components: - - type: Transform - pos: -16.5,6.5 - parent: 1 - - uid: 237 - components: - - type: Transform - pos: -16.5,5.5 - parent: 1 - - uid: 238 - components: - - type: Transform - pos: -19.5,5.5 - parent: 1 - - uid: 239 - components: - - type: Transform - pos: -19.5,6.5 - parent: 1 - - uid: 260 - components: - - type: Transform - pos: -13.5,5.5 - parent: 1 - uid: 453 components: - type: Transform @@ -71643,27 +70403,6 @@ entities: - type: Transform pos: -14.498325,-10.477551 parent: 1 -- proto: VehicleKeyJanicart - entities: - - uid: 7660 - components: - - type: Transform - parent: 7659 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: VehicleKeySecway - entities: - - uid: 5321 - components: - - type: Transform - pos: 25.427599,10.5971575 - parent: 1 - - uid: 5322 - components: - - type: Transform - pos: 25.708849,10.6596575 - parent: 1 - proto: VendingBarDrobe entities: - uid: 5952 @@ -71847,10 +70586,10 @@ entities: parent: 1 - proto: VendingMachineMediDrobe entities: - - uid: 5920 + - uid: 5320 components: - type: Transform - pos: -26.5,5.5 + pos: -23.5,5.5 parent: 1 - proto: VendingMachineNutri entities: @@ -77798,21 +76537,6 @@ entities: - type: Transform pos: -13.5,4.5 parent: 1 - - uid: 222 - components: - - type: Transform - pos: -16.5,7.5 - parent: 1 - - uid: 223 - components: - - type: Transform - pos: -13.5,7.5 - parent: 1 - - uid: 224 - components: - - type: Transform - pos: -19.5,7.5 - parent: 1 - uid: 227 components: - type: Transform @@ -77843,6 +76567,11 @@ entities: - type: Transform pos: -27.5,12.5 parent: 1 + - uid: 260 + components: + - type: Transform + pos: -27.5,23.5 + parent: 1 - uid: 271 components: - type: Transform @@ -78164,6 +76893,16 @@ entities: rot: 3.141592653589793 rad pos: -4.5,-10.5 parent: 1 + - uid: 483 + components: + - type: Transform + pos: -27.5,22.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: -23.5,25.5 + parent: 1 - uid: 486 components: - type: Transform @@ -79321,6 +78060,11 @@ entities: - type: Transform pos: -22.5,25.5 parent: 1 + - uid: 1763 + components: + - type: Transform + pos: -21.5,21.5 + parent: 1 - uid: 1774 components: - type: Transform @@ -79346,6 +78090,16 @@ entities: - type: Transform pos: -27.5,20.5 parent: 1 + - uid: 1786 + components: + - type: Transform + pos: -24.5,19.5 + parent: 1 + - uid: 1788 + components: + - type: Transform + pos: -24.5,25.5 + parent: 1 - uid: 1789 components: - type: Transform @@ -79411,6 +78165,11 @@ entities: rot: 1.5707963267948966 rad pos: 12.5,-3.5 parent: 1 + - uid: 1858 + components: + - type: Transform + pos: -25.5,19.5 + parent: 1 - uid: 1984 components: - type: Transform @@ -80985,8 +79744,6 @@ entities: - type: Transform pos: 43.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: WeaponCapacitorRecharger entities: - uid: 780 @@ -81913,25 +80670,13 @@ entities: - uid: 5603 components: - type: Transform - pos: -23.498562,5.5333753 + pos: -23.533852,6.770913 parent: 1 - uid: 6090 components: - type: Transform pos: -28.522102,-7.4028454 parent: 1 -- proto: YellowOxygenTankFilled - entities: - - uid: 8928 - components: - - type: Transform - pos: -33.421288,-7.524516 - parent: 1 - - uid: 9731 - components: - - type: Transform - pos: -28.423817,12.547613 - parent: 1 - proto: ZiptiesBroken entities: - uid: 9314 From 32b81de8c59a67ec21898924428d6d670727b1c8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 08:02:27 +0000 Subject: [PATCH 21/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9296e17355..dd488a6bcb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: Fixed disposals bins not automatically flushing after an item was inserted. - type: Fix - id: 5942 - time: '2024-02-15T20:52:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25233 - author: liltenhead changes: - message: Reduced energy shield's hp from 150 to 100. @@ -3850,3 +3843,10 @@ id: 6441 time: '2024-04-26T07:48:15.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27198 +- author: Boaz1111 + changes: + - message: Refactored Cluster's medbay, including cryo in the bottom left room + type: Tweak + id: 6442 + time: '2024-04-26T08:01:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27293 From 5896e6875266b22c565009b5d45f60ceb981d90a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 18:16:24 +1000 Subject: [PATCH 22/66] Content update for UI prediction (#27214) * Content update for UI refactor * Big update * Sharing * Remaining content updates * First big update * Prototype updates * AUGH * Fix UI comp ref * Cleanup - Fix predicted message, fix item slots, fix interaction range check. * Fix regressions * Make this predictive idk why it wasn't. * Fix slime merge * Merge conflict * Fix merge --- .../Components/HeadstandComponent.cs | 2 +- .../Components/KillSignComponent.cs | 5 +- Content.Client/Audio/Jukebox/JukeboxSystem.cs | 16 +- .../Extinguisher/FireExtinguisherComponent.cs | 6 +- Content.Client/PDA/PdaBoundUserInterface.cs | 7 +- Content.Client/Paper/PaperComponent.cs | 7 +- .../Power/ActivatableUIRequiresPowerSystem.cs | 21 +++ .../Storage/StorageBoundUserInterface.cs | 19 +- .../Storage/Systems/StorageSystem.cs | 2 +- Content.Client/Strip/StrippableSystem.cs | 2 +- .../Systems/Storage/StorageUIController.cs | 2 +- .../Interaction/InteractionTest.Helpers.cs | 2 +- .../Tests/Power/PowerTest.cs | 4 +- .../Access/Systems/AccessOverriderSystem.cs | 24 +-- .../Access/Systems/AgentIDCardSystem.cs | 4 +- .../Access/Systems/IdCardConsoleSystem.cs | 4 +- .../Components/HeadstandComponent.cs | 2 +- .../Components/KillSignComponent.cs | 5 +- .../Administration/Systems/AdminVerbSystem.cs | 2 +- .../EntitySystems/SpeakOnUIClosedSystem.cs | 1 + .../Ame/EntitySystems/AmeControllerSystem.cs | 8 +- .../Anomaly/AnomalySystem.Generator.cs | 2 +- .../Anomaly/AnomalySystem.Scanner.cs | 7 +- .../Arcade/BlockGame/BlockGame.Ui.cs | 68 ++++--- Content.Server/Arcade/BlockGame/BlockGame.cs | 6 +- .../BlockGame/BlockGameArcadeComponent.cs | 4 +- .../Arcade/BlockGame/BlockGameArcadeSystem.cs | 43 ++--- .../SpaceVillainArcadeSystem.cs | 9 +- .../SpaceVillainGame/SpaceVillainGame.Ui.cs | 3 +- .../Atmos/EntitySystems/GasAnalyzerSystem.cs | 12 +- .../Atmos/EntitySystems/GasTankSystem.cs | 2 +- .../Monitor/Components/AirAlarmComponent.cs | 2 - .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 27 ++- .../EntitySystems/GasPressurePumpSystem.cs | 10 +- .../EntitySystems/GasVolumePumpSystem.cs | 10 +- .../Trinary/EntitySystems/GasFilterSystem.cs | 14 +- .../Trinary/EntitySystems/GasMixerSystem.cs | 12 +- .../Unary/EntitySystems/GasCanisterSystem.cs | 18 +- .../EntitySystems/GasThermoMachineSystem.cs | 8 +- .../Atmos/Portable/SpaceHeaterSystem.cs | 2 +- Content.Server/Audio/Jukebox/JukeboxSystem.cs | 8 +- .../Bed/Cryostorage/CryostorageSystem.cs | 18 +- .../Cargo/Systems/CargoSystem.Bounty.cs | 10 +- .../Cargo/Systems/CargoSystem.Orders.cs | 28 +-- .../Cargo/Systems/CargoSystem.Shuttle.cs | 18 +- .../CartridgeLoader/CartridgeLoaderSystem.cs | 8 +- .../EntitySystems/ChemMasterSystem.cs | 36 +--- .../EntitySystems/ReagentDispenserSystem.cs | 2 +- .../Cloning/CloningConsoleSystem.cs | 6 +- .../Systems/ChameleonClothingSystem.cs | 2 +- .../CommunicationsConsoleSystem.cs | 49 +++--- .../Configurable/ConfigurationSystem.cs | 9 +- Content.Server/Crayon/CrayonSystem.cs | 15 +- .../CrewManifest/CrewManifestSystem.cs | 10 +- .../Systems/CriminalRecordsConsoleSystem.cs | 16 +- .../Systems/SignalTimerSystem.cs | 13 +- .../Systems/NetworkConfiguratorSystem.cs | 69 ++++---- .../Disposal/Mailing/MailingUnitSystem.cs | 6 +- .../Disposal/Tube/DisposalTubeSystem.cs | 15 +- .../Unit/EntitySystems/DisposalUnitSystem.cs | 13 +- .../Systems/DoorElectronicsSystem.cs | 2 +- .../Extinguisher/FireExtinguisherComponent.cs | 2 +- .../ActivatableUIRequiresVisionSystem.cs | 22 +-- Content.Server/Fax/FaxSystem.cs | 21 +-- .../Systems/ForensicScannerSystem.cs | 21 +-- .../Gateway/Systems/GatewaySystem.cs | 8 +- .../Gravity/GravityGeneratorSystem.cs | 19 +- .../HumanoidAppearanceSystem.Modifier.cs | 14 +- .../Instruments/InstrumentComponent.cs | 5 +- .../Instruments/InstrumentSystem.cs | 29 ++- .../Interaction/InteractionSystem.cs | 27 +-- .../Kitchen/EntitySystems/MicrowaveSystem.cs | 8 +- .../EntitySystems/ReagentGrinderSystem.cs | 6 +- .../Labels/Label/HandLabelerSystem.cs | 4 +- Content.Server/Lathe/LatheSystem.cs | 7 +- .../ActivatableUIRequiresLockSystem.cs | 1 + .../MagicMirror/MagicMirrorSystem.cs | 28 ++- .../MassMedia/Systems/NewsSystem.cs | 20 +-- Content.Server/Mech/Systems/MechSystem.cs | 5 +- .../CrewMonitoringConsoleSystem.cs | 4 +- Content.Server/Medical/CryoPodSystem.cs | 7 +- .../Medical/HealthAnalyzerSystem.cs | 10 +- Content.Server/Nuke/NukeSystem.cs | 12 +- Content.Server/NukeOps/WarDeclaratorSystem.cs | 9 +- Content.Server/PAI/PAISystem.cs | 8 +- Content.Server/PDA/PdaSystem.cs | 19 +- Content.Server/PDA/Ringer/RingerSystem.cs | 17 +- Content.Server/Paper/PaperComponent.cs | 2 +- Content.Server/Paper/PaperSystem.cs | 22 +-- .../ParticleAcceleratorSystem.ControlBox.cs | 27 +-- .../ParticleAcceleratorSystem.Parts.cs | 2 +- .../ParticleAcceleratorLimiterWireAction.cs | 3 +- .../ParticleAcceleratorStrengthWireAction.cs | 3 +- .../ParticleAcceleratorToggleWireAction.cs | 8 +- Content.Server/Pinpointer/NavMapSystem.cs | 5 +- Content.Server/Pinpointer/StationMapSystem.cs | 14 +- .../ActivatableUIRequiresPowerComponent.cs | 8 - .../ActivatableUIRequiresPowerSystem.cs | 5 +- .../Power/EntitySystems/ApcSystem.cs | 16 +- .../PowerMonitoringConsoleSystem.cs | 17 +- .../Generator/PortableGeneratorSystem.cs | 17 +- Content.Server/PowerCell/PowerCellSystem.cs | 1 + .../Radio/EntitySystems/RadioDeviceSystem.cs | 12 +- .../Research/Systems/ResearchSystem.Client.cs | 4 +- .../Systems/ResearchSystem.Console.cs | 11 +- .../Systems/DiskConsoleSystem.cs | 2 +- .../SalvageSystem.ExpeditionConsole.cs | 4 +- .../Salvage/SalvageSystem.Magnet.cs | 13 +- .../SensorMonitoringConsoleComponent.cs | 2 +- .../SensorMonitoringConsoleSystem.UI.cs | 22 +-- .../Systems/EmergencyShuttleSystem.Console.cs | 34 ++-- .../Shuttles/Systems/RadarConsoleSystem.cs | 4 +- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 9 +- .../Shuttles/Systems/ShuttleSystem.IFF.cs | 6 +- .../Silicons/Borgs/BorgSystem.Ui.cs | 25 +-- .../Silicons/Laws/SiliconLawSystem.cs | 4 +- .../PowerSolarControlConsoleSystem.cs | 6 +- .../GeneralStationRecordConsoleSystem.cs | 6 +- .../Storage/EntitySystems/StorageSystem.cs | 140 --------------- .../Store/Systems/StoreSystem.Ui.cs | 21 ++- Content.Server/Store/Systems/StoreSystem.cs | 5 +- Content.Server/Strip/StrippableSystem.cs | 10 +- .../SurveillanceCameraMonitorSystem.cs | 12 +- .../Systems/SurveillanceCameraRouterSystem.cs | 14 +- .../Systems/SurveillanceCameraSystem.cs | 16 +- .../ThiefUndeterminedBackpackSystem.cs | 2 +- .../UserInterface/IntrinsicUIComponent.cs | 10 +- .../UserInterface/IntrinsicUISystem.cs | 31 +--- .../VendingMachines/VendingMachineSystem.cs | 4 +- Content.Server/VoiceMask/VoiceMaskSystem.cs | 23 +-- Content.Server/Wires/WiresSystem.cs | 19 +- .../Systems/ArtifactAnalyzerSystem.cs | 5 +- .../Components/SharedHeadstandComponent.cs | 5 +- .../Components/SharedKillSignComponent.cs | 5 +- .../EntitySystems/SolutionTransferSystem.cs | 10 +- .../Containers/ItemSlot/ItemSlotsSystem.cs | 6 +- Content.Shared/Content.Shared.csproj | 3 + .../SharedFireExtinguisherComponent.cs | 2 + .../Interaction/SharedInteractionSystem.cs | 22 ++- Content.Shared/Paper/SharedPaperComponent.cs | 2 + .../ActivatableUIRequiresPowerComponent.cs | 8 + .../EntitySystems/SharedStorageSystem.cs | 166 +++++++++++++++--- Content.Shared/Storage/StorageComponent.cs | 13 -- .../UserInterface/ActivatableUIComponent.cs | 14 +- .../UserInterface/ActivatableUIEvents.cs | 6 +- ...ActivatableUIRequiresPowerCellComponent.cs | 7 +- .../ActivatableUISystem.Power.cs | 22 ++- .../UserInterface/ActivatableUISystem.cs | 49 +++--- .../Catalog/Fills/Paper/manuals.yml | 4 +- .../Entities/Clothing/Back/backpacks.yml | 6 +- .../Entities/Clothing/Back/specific.yml | 8 +- .../Clothing/Belt/base_clothingbelt.yml | 4 +- .../Entities/Clothing/Ears/specific.yml | 2 +- .../Entities/Clothing/Eyes/specific.yml | 2 +- .../Entities/Clothing/Hands/gloves.yml | 2 +- .../Entities/Clothing/Hands/specific.yml | 4 +- .../Entities/Clothing/Head/hats.yml | 6 +- .../Entities/Clothing/Head/specific.yml | 2 +- .../Entities/Clothing/Masks/specific.yml | 2 +- .../Entities/Clothing/Neck/specific.yml | 2 +- .../OuterClothing/base_clothingouter.yml | 4 +- .../Clothing/OuterClothing/specific.yml | 2 +- .../Entities/Clothing/Shoes/magboots.yml | 2 +- .../Entities/Clothing/Shoes/specific.yml | 2 +- .../Entities/Clothing/Uniforms/specific.yml | 4 +- .../Mobs/Cyborgs/base_borg_chassis.yml | 12 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 48 ++--- .../Entities/Mobs/NPCs/behonker.yml | 4 +- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 12 +- .../Entities/Mobs/NPCs/revenant.yml | 4 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 4 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 4 +- .../Entities/Mobs/Player/admin_ghost.yml | 26 +-- .../Entities/Mobs/Player/guardian.yml | 4 +- .../Prototypes/Entities/Mobs/Species/base.yml | 8 +- .../Entities/Mobs/Species/slime.yml | 16 +- .../Objects/Consumable/Drinks/drinks.yml | 4 +- .../Objects/Consumable/Drinks/drinks_cans.yml | 4 +- .../Objects/Consumable/Drinks/drinks_cups.yml | 4 +- .../Consumable/Drinks/drinks_special.yml | 4 +- .../Consumable/Drinks/trash_drinks.yml | 8 +- .../Consumable/Food/Containers/bowl.yml | 4 +- .../Objects/Devices/Electronics/door.yml | 4 +- .../Syndicate_Gadgets/war_declarator.yml | 2 +- .../Objects/Devices/forensic_scanner.yml | 4 +- .../Entities/Objects/Devices/pda.yml | 20 +-- .../Objects/Devices/station_beacon.yml | 4 +- .../Entities/Objects/Devices/station_map.yml | 2 +- .../Fun/Instruments/base_instruments.yml | 8 +- .../Entities/Objects/Fun/candy_bucket.yml | 4 +- .../Entities/Objects/Fun/crayons.yml | 4 +- .../Prototypes/Entities/Objects/Fun/pai.yml | 8 +- .../Entities/Objects/Misc/books.yml | 14 +- .../Objects/Misc/identification_cards.yml | 4 +- .../Entities/Objects/Misc/paper.yml | 16 +- .../Objects/Misc/subdermal_implants.yml | 6 +- .../Objects/Specific/Chapel/bibles.yml | 4 +- .../Entities/Objects/Specific/Chapel/urn.yml | 6 +- .../Objects/Specific/Kitchen/foodcarts.yml | 4 +- .../Entities/Objects/Specific/Mech/mechs.yml | 4 +- .../Medical/handheld_crew_monitor.yml | 2 +- .../Specific/Medical/healthanalyzer.yml | 2 +- .../Objects/Specific/Research/anomaly.yml | 2 +- .../Objects/Specific/Service/barber.yml | 4 +- .../Xenoarchaeology/item_artifacts.yml | 16 +- .../Xenoarchaeology/structure_artifacts.yml | 16 +- .../Entities/Objects/Specific/atmos.yml | 4 +- .../Objects/Specific/chemical-containers.yml | 2 +- .../Objects/Specific/chemistry-bottles.yml | 4 +- .../Objects/Specific/chemistry-vials.yml | 4 +- .../Entities/Objects/Specific/chemistry.yml | 12 +- .../Entities/Objects/Specific/syndicate.yml | 4 +- .../Objects/Tools/access_configurator.yml | 2 +- .../Entities/Objects/Tools/bucket.yml | 4 +- .../Entities/Objects/Tools/cowtools.yml | 4 +- .../Entities/Objects/Tools/gas_tanks.yml | 4 +- .../Entities/Objects/Tools/hand_labeler.yml | 2 +- .../Objects/Tools/handheld_mass_scanner.yml | 4 +- .../Entities/Objects/Tools/jetpacks.yml | 2 +- .../Entities/Objects/Tools/spray_painter.yml | 4 +- .../Entities/Objects/Tools/toolbox.yml | 2 +- .../Entities/Objects/Tools/tools.yml | 16 +- .../Objects/Weapons/Guns/Basic/watergun.yml | 4 +- .../Prototypes/Entities/Objects/base_item.yml | 4 +- .../Dispensers/base_structuredispensers.yml | 4 +- .../Doors/Airlocks/base_structureairlocks.yml | 4 +- .../Structures/Doors/Airlocks/highsec.yml | 4 +- .../Structures/Doors/Firelocks/firelock.yml | 2 +- .../Structures/Doors/Shutter/shutters.yml | 4 +- .../Doors/Windoors/base_structurewindoors.yml | 6 +- .../Structures/Furniture/bookshelf.yml | 4 +- .../Entities/Structures/Furniture/dresser.yml | 4 +- .../Entities/Structures/Furniture/toilet.yml | 4 +- .../Structures/Machines/Computers/arcades.yml | 8 +- .../Machines/Computers/computers.yml | 98 +++++------ .../Machines/Computers/techdiskterminal.yml | 8 +- .../Structures/Machines/Medical/cryo_pod.yml | 4 +- .../Structures/Machines/anomaly_equipment.yml | 8 +- .../Entities/Structures/Machines/bombs.yml | 2 +- .../Structures/Machines/chem_master.yml | 4 +- .../Structures/Machines/fax_machine.yml | 4 +- .../Structures/Machines/flatpacker.yml | 4 +- .../Entities/Structures/Machines/gateway.yml | 4 +- .../Structures/Machines/gravity_generator.yml | 4 +- .../Entities/Structures/Machines/jukebox.yml | 4 +- .../Entities/Structures/Machines/lathe.yml | 8 +- .../Structures/Machines/microwave.yml | 4 +- .../Entities/Structures/Machines/nuke.yml | 4 +- .../Structures/Machines/reagent_grinder.yml | 6 +- .../Entities/Structures/Machines/research.yml | 4 +- .../Entities/Structures/Machines/salvage.yml | 4 +- .../Machines/surveillance_camera_routers.yml | 4 +- .../Structures/Machines/vending_machines.yml | 8 +- .../Machines/wireless_surveillance_camera.yml | 2 +- .../Structures/Piping/Atmospherics/binary.yml | 6 +- .../Piping/Atmospherics/portable.yml | 8 +- .../Piping/Atmospherics/trinary.yml | 4 +- .../Structures/Piping/Atmospherics/unary.yml | 4 +- .../Structures/Piping/Disposal/pipes.yml | 8 +- .../Structures/Piping/Disposal/units.yml | 16 +- .../Power/Generation/PA/control_box.yml | 8 +- .../Structures/Power/Generation/ame.yml | 4 +- .../Power/Generation/portable_generator.yml | 2 +- .../Entities/Structures/Power/apc.yml | 4 +- .../Structures/Specific/Janitor/janicart.yml | 4 +- .../Storage/Canisters/gas_canisters.yml | 2 +- .../Structures/Storage/filing_cabinets.yml | 8 +- .../Entities/Structures/Storage/ore_box.yml | 4 +- .../Structures/Wallmounts/air_alarm.yml | 8 +- .../Structures/Wallmounts/fire_alarm.yml | 4 +- .../Structures/Wallmounts/intercom.yml | 4 +- .../Entities/Structures/Wallmounts/mirror.yml | 4 +- .../Wallmounts/monitors_televisions.yml | 8 +- .../Structures/Wallmounts/noticeboard.yml | 4 +- .../Structures/Wallmounts/station_map.yml | 2 +- .../Wallmounts/surveillance_camera.yml | 4 +- .../Entities/Structures/Wallmounts/timer.yml | 4 +- .../Entities/Structures/cryopod.yml | 4 +- .../XenoArch/Effects/utility_effects.yml | 4 +- 279 files changed, 1308 insertions(+), 1582 deletions(-) create mode 100644 Content.Client/Power/ActivatableUIRequiresPowerSystem.cs delete mode 100644 Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs create mode 100644 Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs rename {Content.Server => Content.Shared}/UserInterface/ActivatableUIComponent.cs (87%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUIRequiresPowerCellComponent.cs (65%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUISystem.Power.cs (82%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUISystem.cs (81%) diff --git a/Content.Client/Administration/Components/HeadstandComponent.cs b/Content.Client/Administration/Components/HeadstandComponent.cs index d95e74576b..a4e3bfc5aa 100644 --- a/Content.Client/Administration/Components/HeadstandComponent.cs +++ b/Content.Client/Administration/Components/HeadstandComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Client.Administration.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class HeadstandComponent : SharedHeadstandComponent { diff --git a/Content.Client/Administration/Components/KillSignComponent.cs b/Content.Client/Administration/Components/KillSignComponent.cs index 1cf47b93ff..91c44ef3f2 100644 --- a/Content.Client/Administration/Components/KillSignComponent.cs +++ b/Content.Client/Administration/Components/KillSignComponent.cs @@ -3,6 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Client.Administration.Components; -[NetworkedComponent, RegisterComponent] -public sealed partial class KillSignComponent : SharedKillSignComponent -{ } +[RegisterComponent] +public sealed partial class KillSignComponent : SharedKillSignComponent; diff --git a/Content.Client/Audio/Jukebox/JukeboxSystem.cs b/Content.Client/Audio/Jukebox/JukeboxSystem.cs index 53bde82a78..dd4a5bbb9b 100644 --- a/Content.Client/Audio/Jukebox/JukeboxSystem.cs +++ b/Content.Client/Audio/Jukebox/JukeboxSystem.cs @@ -11,6 +11,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; public override void Initialize() { @@ -35,13 +36,10 @@ public sealed class JukeboxSystem : SharedJukeboxSystem var query = AllEntityQuery(); - while (query.MoveNext(out _, out var ui)) + while (query.MoveNext(out var uid, out _, out var ui)) { - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { + if (!_uiSystem.TryGetOpenUi((uid, ui), JukeboxUiKey.Key, out var bui)) continue; - } bui.PopulateMusic(); } @@ -49,15 +47,9 @@ public sealed class JukeboxSystem : SharedJukeboxSystem private void OnJukeboxAfterState(Entity ent, ref AfterAutoHandleStateEvent args) { - if (!TryComp(ent, out UserInterfaceComponent? ui)) + if (!_uiSystem.TryGetOpenUi(ent.Owner, JukeboxUiKey.Key, out var bui)) return; - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { - return; - } - bui.Reload(); } diff --git a/Content.Client/Extinguisher/FireExtinguisherComponent.cs b/Content.Client/Extinguisher/FireExtinguisherComponent.cs index 126c172924..324b05a93d 100644 --- a/Content.Client/Extinguisher/FireExtinguisherComponent.cs +++ b/Content.Client/Extinguisher/FireExtinguisherComponent.cs @@ -3,7 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Client.Extinguisher; -[NetworkedComponent, RegisterComponent] -public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent -{ -} +[RegisterComponent] +public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent; diff --git a/Content.Client/PDA/PdaBoundUserInterface.cs b/Content.Client/PDA/PdaBoundUserInterface.cs index ef9d6e8b9b..07352b512b 100644 --- a/Content.Client/PDA/PdaBoundUserInterface.cs +++ b/Content.Client/PDA/PdaBoundUserInterface.cs @@ -21,7 +21,6 @@ namespace Content.Client.PDA protected override void Open() { base.Open(); - SendMessage(new PdaRequestUpdateInterfaceMessage()); _menu = new PdaMenu(); _menu.OpenCenteredLeft(); _menu.OnClose += Close; @@ -32,17 +31,17 @@ namespace Content.Client.PDA _menu.EjectIdButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId)); }; _menu.EjectPenButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId)); }; _menu.EjectPaiButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId)); }; _menu.ActivateMusicButton.OnPressed += _ => diff --git a/Content.Client/Paper/PaperComponent.cs b/Content.Client/Paper/PaperComponent.cs index d197cd3721..1dc827bf7e 100644 --- a/Content.Client/Paper/PaperComponent.cs +++ b/Content.Client/Paper/PaperComponent.cs @@ -1,9 +1,6 @@ using Content.Shared.Paper; -using Robust.Shared.GameStates; namespace Content.Client.Paper; -[NetworkedComponent, RegisterComponent] -public sealed partial class PaperComponent : SharedPaperComponent -{ -} +[RegisterComponent] +public sealed partial class PaperComponent : SharedPaperComponent; diff --git a/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs new file mode 100644 index 0000000000..60ed8d87b9 --- /dev/null +++ b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Power.Components; +using Content.Shared.UserInterface; +using Content.Shared.Wires; + +namespace Content.Client.Power; + +public sealed class ActivatableUIRequiresPowerSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnActivate); + } + + private void OnActivate(EntityUid uid, ActivatableUIRequiresPowerComponent component, ActivatableUIOpenAttemptEvent args) + { + // Client can't predict the power properly at the moment so rely upon the server to do it. + args.Cancel(); + } +} diff --git a/Content.Client/Storage/StorageBoundUserInterface.cs b/Content.Client/Storage/StorageBoundUserInterface.cs index f7fdbb8367..899df30f7f 100644 --- a/Content.Client/Storage/StorageBoundUserInterface.cs +++ b/Content.Client/Storage/StorageBoundUserInterface.cs @@ -17,6 +17,14 @@ public sealed class StorageBoundUserInterface : BoundUserInterface _storage = _entManager.System(); } + protected override void Open() + { + base.Open(); + + if (_entManager.TryGetComponent(Owner, out var comp)) + _storage.OpenStorageWindow((Owner, comp)); + } + protected override void Dispose(bool disposing) { base.Dispose(disposing); @@ -25,16 +33,5 @@ public sealed class StorageBoundUserInterface : BoundUserInterface _storage.CloseStorageWindow(Owner); } - - protected override void ReceiveMessage(BoundUserInterfaceMessage message) - { - base.ReceiveMessage(message); - - if (message is StorageModifyWindowMessage) - { - if (_entManager.TryGetComponent(Owner, out var comp)) - _storage.OpenStorageWindow((Owner, comp)); - } - } } diff --git a/Content.Client/Storage/Systems/StorageSystem.cs b/Content.Client/Storage/Systems/StorageSystem.cs index 2728bfa9e8..8bf0dcd981 100644 --- a/Content.Client/Storage/Systems/StorageSystem.cs +++ b/Content.Client/Storage/Systems/StorageSystem.cs @@ -111,7 +111,7 @@ public sealed class StorageSystem : SharedStorageSystem if (!Resolve(entity, ref entity.Comp, false)) return; - if (entity.Comp.OpenInterfaces.GetValueOrDefault(StorageComponent.StorageUiKey.Key) is not { } bui) + if (entity.Comp.ClientOpenInterfaces.GetValueOrDefault(StorageComponent.StorageUiKey.Key) is not { } bui) return; bui.Close(); diff --git a/Content.Client/Strip/StrippableSystem.cs b/Content.Client/Strip/StrippableSystem.cs index c5083d2204..23f38e9d51 100644 --- a/Content.Client/Strip/StrippableSystem.cs +++ b/Content.Client/Strip/StrippableSystem.cs @@ -35,7 +35,7 @@ public sealed class StrippableSystem : SharedStrippableSystem if (!TryComp(uid, out UserInterfaceComponent? uiComp)) return; - foreach (var ui in uiComp.OpenInterfaces.Values) + foreach (var ui in uiComp.ClientOpenInterfaces.Values) { if (ui is StrippableBoundUserInterface stripUi) stripUi.DirtyMenu(); diff --git a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs index b865b54dd0..346469d29d 100644 --- a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs +++ b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs @@ -262,7 +262,7 @@ public sealed class StorageUIController : UIController, IOnSystemChanged> ConvertAccessHashSetsToList(List>> accessHashsets) { - List> accessList = new List>(); + var accessList = new List>(); - if (accessHashsets != null && accessHashsets.Any()) + if (accessHashsets.Count <= 0) + return accessList; + + foreach (var hashSet in accessHashsets) { - foreach (HashSet> hashSet in accessHashsets) - { - foreach (ProtoId hash in hashSet.ToArray()) - { - accessList.Add(hash); - } - } + accessList.AddRange(hashSet); } return accessList; diff --git a/Content.Server/Access/Systems/AgentIDCardSystem.cs b/Content.Server/Access/Systems/AgentIDCardSystem.cs index bd4d3b3f23..2c4425ec10 100644 --- a/Content.Server/Access/Systems/AgentIDCardSystem.cs +++ b/Content.Server/Access/Systems/AgentIDCardSystem.cs @@ -61,14 +61,14 @@ namespace Content.Server.Access.Systems private void AfterUIOpen(EntityUid uid, AgentIDCardComponent component, AfterActivatableUIOpenEvent args) { - if (!_uiSystem.TryGetUi(uid, AgentIDCardUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(uid, AgentIDCardUiKey.Key)) return; if (!TryComp(uid, out var idCard)) return; var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", component.Icons); - _uiSystem.SetUiState(ui, state, args.Session); + _uiSystem.SetUiState(uid, AgentIDCardUiKey.Key, state); } private void OnJobChanged(EntityUid uid, AgentIDCardComponent comp, AgentIDCardJobChangedMessage args) diff --git a/Content.Server/Access/Systems/IdCardConsoleSystem.cs b/Content.Server/Access/Systems/IdCardConsoleSystem.cs index db8b9d036e..e680b0c6f4 100644 --- a/Content.Server/Access/Systems/IdCardConsoleSystem.cs +++ b/Content.Server/Access/Systems/IdCardConsoleSystem.cs @@ -41,7 +41,7 @@ public sealed class IdCardConsoleSystem : SharedIdCardConsoleSystem private void OnWriteToTargetIdMessage(EntityUid uid, IdCardConsoleComponent component, WriteToTargetIdMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; TryWriteToTargetId(uid, args.FullName, args.JobTitle, args.AccessList, args.JobPrototype, player, component); @@ -104,7 +104,7 @@ public sealed class IdCardConsoleSystem : SharedIdCardConsoleSystem Name(targetId)); } - _userInterface.TrySetUiState(uid, IdCardConsoleUiKey.Key, newState); + _userInterface.SetUiState(uid, IdCardConsoleUiKey.Key, newState); } /// diff --git a/Content.Server/Administration/Components/HeadstandComponent.cs b/Content.Server/Administration/Components/HeadstandComponent.cs index 8472b5ad36..2ab097fad4 100644 --- a/Content.Server/Administration/Components/HeadstandComponent.cs +++ b/Content.Server/Administration/Components/HeadstandComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Server.Administration.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class HeadstandComponent : SharedHeadstandComponent { diff --git a/Content.Server/Administration/Components/KillSignComponent.cs b/Content.Server/Administration/Components/KillSignComponent.cs index e29ce202dd..11479c32fc 100644 --- a/Content.Server/Administration/Components/KillSignComponent.cs +++ b/Content.Server/Administration/Components/KillSignComponent.cs @@ -3,6 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Server.Administration.Components; -[NetworkedComponent, RegisterComponent] -public sealed partial class KillSignComponent : SharedKillSignComponent -{ } +[RegisterComponent] +public sealed partial class KillSignComponent : SharedKillSignComponent; diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index f5b237b449..5bb75b4c99 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -463,7 +463,7 @@ namespace Content.Server.Administration.Systems Text = Loc.GetString("configure-verb-get-data-text"), Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")), Category = VerbCategory.Debug, - Act = () => _uiSystem.TryOpen(args.Target, ConfigurationUiKey.Key, actor.PlayerSession) + Act = () => _uiSystem.OpenUi(args.Target, ConfigurationUiKey.Key, actor.PlayerSession) }; args.Verbs.Add(verb); } diff --git a/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs b/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs index 048f59b8d3..232b4b7eda 100644 --- a/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs +++ b/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs @@ -4,6 +4,7 @@ using Content.Server.UserInterface; using Content.Shared.Advertise; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent; namespace Content.Server.Advertise; diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs index 5bf78bde85..1b323d6643 100644 --- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs +++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs @@ -129,11 +129,11 @@ public sealed class AmeControllerSystem : EntitySystem if (!Resolve(uid, ref controller)) return; - if (!_userInterfaceSystem.TryGetUi(uid, AmeControllerUiKey.Key, out var bui)) + if (!_userInterfaceSystem.HasUi(uid, AmeControllerUiKey.Key)) return; var state = GetUiState(uid, controller); - _userInterfaceSystem.SetUiState(bui, state); + _userInterfaceSystem.SetUiState(uid, AmeControllerUiKey.Key, state); controller.NextUIUpdate = _gameTiming.CurTime + controller.UpdateUIPeriod; } @@ -324,7 +324,7 @@ public sealed class AmeControllerSystem : EntitySystem private void OnUiButtonPressed(EntityUid uid, AmeControllerComponent comp, UiButtonPressedMessage msg) { - var user = msg.Session.AttachedEntity; + var user = msg.Actor; if (!Exists(user)) return; @@ -334,7 +334,7 @@ public sealed class AmeControllerSystem : EntitySystem _ => true, }; - if (!PlayerCanUseController(uid, user!.Value, needsPower, comp)) + if (!PlayerCanUseController(uid, user, needsPower, comp)) return; _audioSystem.PlayPvs(comp.ClickSound, uid, AudioParams.Default.WithVolume(-2f)); diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs index 7aa1a8935f..056a985cbe 100644 --- a/Content.Server/Anomaly/AnomalySystem.Generator.cs +++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs @@ -61,7 +61,7 @@ public sealed partial class AnomalySystem var materialAmount = _material.GetMaterialAmount(uid, component.RequiredMaterial); var state = new AnomalyGeneratorUserInterfaceState(component.CooldownEndTime, materialAmount, component.MaterialPerAnomaly); - _ui.TrySetUiState(uid, AnomalyGeneratorUiKey.Key, state); + _ui.SetUiState(uid, AnomalyGeneratorUiKey.Key, state); } public void TryGeneratorCreateAnomaly(EntityUid uid, AnomalyGeneratorComponent? component = null) diff --git a/Content.Server/Anomaly/AnomalySystem.Scanner.cs b/Content.Server/Anomaly/AnomalySystem.Scanner.cs index bce508903d..39c0d08b55 100644 --- a/Content.Server/Anomaly/AnomalySystem.Scanner.cs +++ b/Content.Server/Anomaly/AnomalySystem.Scanner.cs @@ -31,7 +31,8 @@ public sealed partial class AnomalySystem { if (component.ScannedAnomaly != args.Anomaly) continue; - _ui.TryCloseAll(uid, AnomalyScannerUiKey.Key); + + _ui.CloseUi(uid, AnomalyScannerUiKey.Key); } } @@ -108,7 +109,7 @@ public sealed partial class AnomalySystem Popup.PopupEntity(Loc.GetString("anomaly-scanner-component-scan-complete"), uid); UpdateScannerWithNewAnomaly(uid, args.Args.Target.Value, component); - if (TryComp(args.Args.User, out var actor)) _ui.TryOpen(uid, AnomalyScannerUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, AnomalyScannerUiKey.Key, args.User); args.Handled = true; } @@ -123,7 +124,7 @@ public sealed partial class AnomalySystem nextPulse = anomalyComponent.NextPulseTime; var state = new AnomalyScannerUserInterfaceState(GetScannerMessage(component), nextPulse); - _ui.TrySetUiState(uid, AnomalyScannerUiKey.Key, state); + _ui.SetUiState(uid, AnomalyScannerUiKey.Key, state); } public void UpdateScannerWithNewAnomaly(EntityUid scanner, EntityUid anomaly, AnomalyScannerComponent? scannerComp = null, AnomalyComponent? anomalyComp = null) diff --git a/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs b/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs index ef69600783..cd22f1f6d3 100644 --- a/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs +++ b/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs @@ -157,39 +157,37 @@ public sealed partial class BlockGame /// The message to broadcase to all players/spectators. private void SendMessage(BoundUserInterfaceMessage message) { - if (_uiSystem.TryGetUi(_owner, BlockGameUiKey.Key, out var bui)) - _uiSystem.SendUiMessage(bui, message); + _uiSystem.ServerSendUiMessage(_entityManager.GetEntity(message.Entity), BlockGameUiKey.Key, message); } /// /// Handles sending a message to a specific player/spectator. /// /// The message to send to a specific player/spectator. - /// The target recipient. - private void SendMessage(BoundUserInterfaceMessage message, ICommonSession session) + /// The target recipient. + private void SendMessage(BoundUserInterfaceMessage message, EntityUid actor) { - if (_uiSystem.TryGetUi(_owner, BlockGameUiKey.Key, out var bui)) - _uiSystem.TrySendUiMessage(bui, message, session); + _uiSystem.ServerSendUiMessage(_entityManager.GetEntity(message.Entity), BlockGameUiKey.Key, message, actor); } /// /// Handles sending the current state of the game to a player that has just opened the UI. /// - /// The target recipient. - public void UpdateNewPlayerUI(ICommonSession session) + /// The target recipient. + public void UpdateNewPlayerUI(EntityUid actor) { if (_gameOver) { - SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement), session); + SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement), actor); return; } if (Paused) - SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Pause, Started), session); + SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Pause, Started), actor); else - SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Game, Started), session); + SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Game, Started), actor); - FullUpdate(session); + FullUpdate(actor); } /// @@ -209,14 +207,14 @@ public sealed partial class BlockGame /// Handles broadcasting the full player-visible game state to a specific player/spectator. /// /// The target recipient. - private void FullUpdate(ICommonSession session) + private void FullUpdate(EntityUid actor) { - UpdateFieldUI(session); - SendNextPieceUpdate(session); - SendHoldPieceUpdate(session); - SendLevelUpdate(session); - SendPointsUpdate(session); - SendHighscoreUpdate(session); + UpdateFieldUI(actor); + SendNextPieceUpdate(actor); + SendHoldPieceUpdate(actor); + SendLevelUpdate(actor); + SendPointsUpdate(actor); + SendHighscoreUpdate(actor); } /// @@ -234,14 +232,13 @@ public sealed partial class BlockGame /// /// Handles broadcasting the current location of all of the blocks in the playfield + the active piece to a specific player/spectator. /// - /// The target recipient. - public void UpdateFieldUI(ICommonSession session) + public void UpdateFieldUI(EntityUid actor) { if (!Started) return; var computedField = ComputeField(); - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(computedField.ToArray(), BlockGameMessages.BlockGameVisualType.GameField), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(computedField.ToArray(), BlockGameMessages.BlockGameVisualType.GameField), actor); } /// @@ -282,10 +279,9 @@ public sealed partial class BlockGame /// /// Broadcasts the state of the next queued piece to a specific viewer. /// - /// The target recipient. - private void SendNextPieceUpdate(ICommonSession session) + private void SendNextPieceUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(NextPiece.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.NextBlock), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(NextPiece.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.NextBlock), actor); } /// @@ -302,13 +298,12 @@ public sealed partial class BlockGame /// /// Broadcasts the state of the currently held piece to a specific viewer. /// - /// The target recipient. - private void SendHoldPieceUpdate(ICommonSession session) + private void SendHoldPieceUpdate(EntityUid actor) { if (HeldPiece.HasValue) - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(HeldPiece.Value.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.HoldBlock), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(HeldPiece.Value.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.HoldBlock), actor); else - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(Array.Empty(), BlockGameMessages.BlockGameVisualType.HoldBlock), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(Array.Empty(), BlockGameMessages.BlockGameVisualType.HoldBlock), actor); } /// @@ -322,10 +317,9 @@ public sealed partial class BlockGame /// /// Broadcasts the current game level to a specific viewer. /// - /// The target recipient. - private void SendLevelUpdate(ICommonSession session) + private void SendLevelUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameLevelUpdateMessage(Level), session); + SendMessage(new BlockGameMessages.BlockGameLevelUpdateMessage(Level), actor); } /// @@ -339,10 +333,9 @@ public sealed partial class BlockGame /// /// Broadcasts the current game score to a specific viewer. /// - /// The target recipient. - private void SendPointsUpdate(ICommonSession session) + private void SendPointsUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameScoreUpdateMessage(Points), session); + SendMessage(new BlockGameMessages.BlockGameScoreUpdateMessage(Points), actor); } /// @@ -356,9 +349,8 @@ public sealed partial class BlockGame /// /// Broadcasts the current game high score positions to a specific viewer. /// - /// The target recipient. - private void SendHighscoreUpdate(ICommonSession session) + private void SendHighscoreUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameHighScoreUpdateMessage(_arcadeSystem.GetLocalHighscores(), _arcadeSystem.GetGlobalHighscores()), session); + SendMessage(new BlockGameMessages.BlockGameHighScoreUpdateMessage(_arcadeSystem.GetLocalHighscores(), _arcadeSystem.GetGlobalHighscores()), actor); } } diff --git a/Content.Server/Arcade/BlockGame/BlockGame.cs b/Content.Server/Arcade/BlockGame/BlockGame.cs index 3af1828d56..82063b6443 100644 --- a/Content.Server/Arcade/BlockGame/BlockGame.cs +++ b/Content.Server/Arcade/BlockGame/BlockGame.cs @@ -9,8 +9,8 @@ public sealed partial class BlockGame { [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IRobustRandom _random = default!; - private readonly ArcadeSystem _arcadeSystem = default!; - private readonly UserInterfaceSystem _uiSystem = default!; + private readonly ArcadeSystem _arcadeSystem; + private readonly UserInterfaceSystem _uiSystem; /// /// What entity is currently hosting this game of NT-BG. @@ -78,7 +78,7 @@ public sealed partial class BlockGame _gameOver = true; if (_entityManager.TryGetComponent(_owner, out var cabinet) - && _entityManager.TryGetComponent(cabinet.Player?.AttachedEntity, out var meta)) + && _entityManager.TryGetComponent(cabinet.Player, out var meta)) { _highScorePlacement = _arcadeSystem.RegisterHighScore(meta.EntityName, Points); SendHighscoreUpdate(); diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs index 5613d91544..75952b0a33 100644 --- a/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs +++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs @@ -13,10 +13,10 @@ public sealed partial class BlockGameArcadeComponent : Component /// /// The player currently playing the active session of NT-BG. /// - public ICommonSession? Player = null; + public EntityUid? Player = null; /// /// The players currently viewing (but not playing) the active session of NT-BG. /// - public readonly List Spectators = new(); + public readonly List Spectators = new(); } diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs index ad65c5cca6..561cad8d7e 100644 --- a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs +++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs @@ -37,14 +37,12 @@ public sealed class BlockGameArcadeSystem : EntitySystem } } - private void UpdatePlayerStatus(EntityUid uid, ICommonSession session, PlayerBoundUserInterface? bui = null, BlockGameArcadeComponent? blockGame = null) + private void UpdatePlayerStatus(EntityUid uid, EntityUid actor, BlockGameArcadeComponent? blockGame = null) { if (!Resolve(uid, ref blockGame)) return; - if (bui == null && !_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out bui)) - return; - _uiSystem.TrySendUiMessage(bui, new BlockGameMessages.BlockGameUserStatusMessage(blockGame.Player == session), session); + _uiSystem.ServerSendUiMessage(uid, BlockGameUiKey.Key, new BlockGameMessages.BlockGameUserStatusMessage(blockGame.Player == actor), actor); } private void OnComponentInit(EntityUid uid, BlockGameArcadeComponent component, ComponentInit args) @@ -54,33 +52,21 @@ public sealed class BlockGameArcadeSystem : EntitySystem private void OnAfterUIOpen(EntityUid uid, BlockGameArcadeComponent component, AfterActivatableUIOpenEvent args) { - if (!TryComp(args.User, out var actor)) - return; - if (!_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out var bui)) - return; - - var session = actor.PlayerSession; - if (!bui.SubscribedSessions.Contains(session)) - return; - if (component.Player == null) - component.Player = session; + component.Player = args.Actor; else - component.Spectators.Add(session); + component.Spectators.Add(args.Actor); - UpdatePlayerStatus(uid, session, bui, component); - component.Game?.UpdateNewPlayerUI(session); + UpdatePlayerStatus(uid, args.Actor, component); + component.Game?.UpdateNewPlayerUI(args.Actor); } private void OnAfterUiClose(EntityUid uid, BlockGameArcadeComponent component, BoundUIClosedEvent args) { - if (args.Session is not { } session) - return; - - if (component.Player != session) + if (component.Player != args.Actor) { - component.Spectators.Remove(session); - UpdatePlayerStatus(uid, session, blockGame: component); + component.Spectators.Remove(args.Actor); + UpdatePlayerStatus(uid, args.Actor, blockGame: component); return; } @@ -88,11 +74,11 @@ public sealed class BlockGameArcadeSystem : EntitySystem if (component.Spectators.Count > 0) { component.Player = component.Spectators[0]; - component.Spectators.Remove(component.Player); - UpdatePlayerStatus(uid, component.Player, blockGame: component); + component.Spectators.Remove(component.Player.Value); + UpdatePlayerStatus(uid, component.Player.Value, blockGame: component); } - UpdatePlayerStatus(uid, temp, blockGame: component); + UpdatePlayerStatus(uid, temp.Value, blockGame: component); } private void OnBlockPowerChanged(EntityUid uid, BlockGameArcadeComponent component, ref PowerChangedEvent args) @@ -100,8 +86,7 @@ public sealed class BlockGameArcadeSystem : EntitySystem if (args.Powered) return; - if (_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out var bui)) - _uiSystem.CloseAll(bui); + _uiSystem.CloseUi(uid, BlockGameUiKey.Key); component.Player = null; component.Spectators.Clear(); } @@ -112,7 +97,7 @@ public sealed class BlockGameArcadeSystem : EntitySystem return; if (!BlockGameUiKey.Key.Equals(msg.UiKey)) return; - if (msg.Session != component.Player) + if (msg.Actor != component.Player) return; if (msg.PlayerAction == BlockGamePlayerAction.NewGame) diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs index f60d88ebf7..f7758f11f1 100644 --- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs +++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs @@ -90,12 +90,10 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem _audioSystem.PlayPvs(component.NewGameSound, uid, AudioParams.Default.WithVolume(-4f)); component.Game = new SpaceVillainGame(uid, component, this); - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui)) - _uiSystem.SendUiMessage(bui, component.Game.GenerateMetaDataMessage()); + _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, component.Game.GenerateMetaDataMessage()); break; case PlayerAction.RequestData: - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out bui)) - _uiSystem.SendUiMessage(bui, component.Game.GenerateMetaDataMessage()); + _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, component.Game.GenerateMetaDataMessage()); break; } } @@ -110,7 +108,6 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem if (TryComp(uid, out var power) && power.Powered) return; - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui)) - _uiSystem.CloseAll(bui); + _uiSystem.CloseUi(uid, SpaceVillainArcadeUiKey.Key); } } diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs index 890e9888a7..ebcfb8e3f6 100644 --- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs +++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs @@ -9,8 +9,7 @@ public sealed partial class SpaceVillainGame /// private void UpdateUi(EntityUid uid, bool metadata = false) { - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui)) - _uiSystem.SendUiMessage(bui, metadata ? GenerateMetaDataMessage() : GenerateUpdateMessage()); + _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, metadata ? GenerateMetaDataMessage() : GenerateUpdateMessage()); } private void UpdateUi(EntityUid uid, string message1, string message2, bool metadata = false) diff --git a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs index 1f5ca80935..15e1dde4ec 100644 --- a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs @@ -118,8 +118,7 @@ namespace Content.Server.Atmos.EntitySystems if (!Resolve(uid, ref component)) return; - if (user != null && TryComp(user, out var actor)) - _userInterface.TryClose(uid, GasAnalyzerUiKey.Key, actor.PlayerSession); + _userInterface.CloseUi(uid, GasAnalyzerUiKey.Key, user); component.Enabled = false; Dirty(uid, component); @@ -132,8 +131,6 @@ namespace Content.Server.Atmos.EntitySystems /// private void OnDisabledMessage(EntityUid uid, GasAnalyzerComponent component, GasAnalyzerDisableMessage message) { - if (message.Session.AttachedEntity is not { Valid: true }) - return; DisableAnalyzer(uid, component); } @@ -142,10 +139,7 @@ namespace Content.Server.Atmos.EntitySystems if (!Resolve(uid, ref component, false)) return; - if (!TryComp(user, out var actor)) - return; - - _userInterface.TryOpen(uid, GasAnalyzerUiKey.Key, actor.PlayerSession); + _userInterface.OpenUi(uid, GasAnalyzerUiKey.Key, user); } /// @@ -242,7 +236,7 @@ namespace Content.Server.Atmos.EntitySystems if (gasMixList.Count == 0) return false; - _userInterface.TrySendUiMessage(uid, GasAnalyzerUiKey.Key, + _userInterface.ServerSendUiMessage(uid, GasAnalyzerUiKey.Key, new GasAnalyzerUserMessage(gasMixList.ToArray(), component.Target != null ? Name(component.Target.Value) : string.Empty, GetNetEntity(component.Target) ?? NetEntity.Invalid, diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index dd84756e45..07594820fc 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -75,7 +75,7 @@ namespace Content.Server.Atmos.EntitySystems public void UpdateUserInterface(Entity ent, bool initialUpdate = false) { var (owner, component) = ent; - _ui.TrySetUiState(owner, SharedGasTankUiKey.Key, + _ui.SetUiState(owner, SharedGasTankUiKey.Key, new GasTankBoundUserInterfaceState { TankPressure = component.Air?.Pressure ?? 0, diff --git a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs index 7030d607a6..93f704fe21 100644 --- a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs +++ b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs @@ -24,8 +24,6 @@ public sealed partial class AirAlarmComponent : Component public readonly Dictionary ScrubberData = new(); public readonly Dictionary SensorData = new(); - public HashSet ActivePlayers = new(); - public bool CanSync = true; /// diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs index 2922d0796a..881f54512a 100644 --- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs @@ -223,8 +223,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnClose(EntityUid uid, AirAlarmComponent component, BoundUIClosedEvent args) { - component.ActivePlayers.Remove(args.Session.UserId); - if (component.ActivePlayers.Count == 0) + if (!_ui.IsUiOpen(uid, SharedAirAlarmInterfaceKey.Key)) RemoveActiveInterface(uid); } @@ -247,9 +246,6 @@ public sealed class AirAlarmSystem : EntitySystem private void OnActivate(EntityUid uid, AirAlarmComponent component, ActivateInWorldEvent args) { - if (!TryComp(args.User, out var actor)) - return; - if (TryComp(uid, out var panel) && panel.Open) { args.Handled = false; @@ -259,10 +255,7 @@ public sealed class AirAlarmSystem : EntitySystem if (!this.IsPowered(uid, EntityManager)) return; - var ui = _ui.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key); - if (ui != null) - _ui.OpenUi(ui, actor.PlayerSession); - component.ActivePlayers.Add(actor.PlayerSession.UserId); + _ui.OpenUi(uid, SharedAirAlarmInterfaceKey.Key, args.User); AddActiveInterface(uid); SyncAllDevices(uid); UpdateUI(uid, component); @@ -270,7 +263,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnResyncAll(EntityUid uid, AirAlarmComponent component, AirAlarmResyncAllDevicesMessage args) { - if (!AccessCheck(uid, args.Session.AttachedEntity, component)) + if (!AccessCheck(uid, args.Actor, component)) { return; } @@ -285,7 +278,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateAlarmMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmModeMessage args) { - if (AccessCheck(uid, args.Session.AttachedEntity, component)) + if (AccessCheck(uid, args.Actor, component)) { var addr = string.Empty; if (TryComp(uid, out var netConn)) @@ -309,7 +302,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateThreshold(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmThresholdMessage args) { - if (AccessCheck(uid, args.Session.AttachedEntity, component)) + if (AccessCheck(uid, args.Actor, component)) SetThreshold(uid, args.Address, args.Type, args.Threshold, args.Gas); else UpdateUI(uid, component); @@ -317,7 +310,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateDeviceDataMessage args) { - if (AccessCheck(uid, args.Session.AttachedEntity, component) + if (AccessCheck(uid, args.Actor, component) && _deviceList.ExistsInDeviceList(uid, args.Address)) { SetDeviceData(uid, args.Address, args.Data); @@ -330,7 +323,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnCopyDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmCopyDeviceDataMessage args) { - if (!AccessCheck(uid, args.Session.AttachedEntity, component)) + if (!AccessCheck(uid, args.Actor, component)) { UpdateUI(uid, component); return; @@ -377,7 +370,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnAtmosAlarm(EntityUid uid, AirAlarmComponent component, AtmosAlarmEvent args) { - if (component.ActivePlayers.Count != 0) + if (_ui.IsUiOpen(uid, SharedAirAlarmInterfaceKey.Key)) { SyncAllDevices(uid); } @@ -571,7 +564,7 @@ public sealed class AirAlarmSystem : EntitySystem /// private void ForceCloseAllInterfaces(EntityUid uid) { - _ui.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key); + _ui.CloseUi(uid, SharedAirAlarmInterfaceKey.Key); } private void OnAtmosUpdate(EntityUid uid, AirAlarmComponent alarm, ref AtmosDeviceUpdateEvent args) @@ -639,7 +632,7 @@ public sealed class AirAlarmSystem : EntitySystem highestAlarm = AtmosAlarmType.Normal; } - _ui.TrySetUiState( + _ui.SetUiState( uid, SharedAirAlarmInterfaceKey.Key, new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, alarm.CurrentTab, highestAlarm.Value, alarm.AutoMode)); diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs index af25d04df9..83b7b67ba4 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs @@ -98,7 +98,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems UpdateAppearance(uid, pump); DirtyUI(uid, pump); - _userInterfaceSystem.TryCloseAll(uid, GasPressurePumpUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasPressurePumpUiKey.Key); } private void OnPumpActivate(EntityUid uid, GasPressurePumpComponent pump, ActivateInWorldEvent args) @@ -108,7 +108,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (Transform(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasPressurePumpUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasPressurePumpUiKey.Key, actor.PlayerSession); DirtyUI(uid, pump); } else @@ -123,7 +123,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, pump); UpdateAppearance(uid, pump); } @@ -132,7 +132,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.TargetPressure = Math.Clamp(args.Pressure, 0f, Atmospherics.MaxOutputPressure); _adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); + $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); DirtyUI(uid, pump); } @@ -142,7 +142,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (!Resolve(uid, ref pump)) return; - _userInterfaceSystem.TrySetUiState(uid, GasPressurePumpUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasPressurePumpUiKey.Key, new GasPressurePumpBoundUserInterfaceState(EntityManager.GetComponent(uid).EntityName, pump.TargetPressure, pump.Enabled)); } diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs index e4767c4061..cbcd1f4fa3 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs @@ -128,7 +128,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems UpdateAppearance(uid, pump); DirtyUI(uid, pump); - _userInterfaceSystem.TryCloseAll(uid, GasVolumePumpUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasVolumePumpUiKey.Key); } private void OnPumpActivate(EntityUid uid, GasVolumePumpComponent pump, ActivateInWorldEvent args) @@ -138,7 +138,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (Transform(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasVolumePumpUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasVolumePumpUiKey.Key, actor.PlayerSession); DirtyUI(uid, pump); } else @@ -153,7 +153,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, pump); UpdateAppearance(uid, pump); } @@ -162,7 +162,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.TransferRate = Math.Clamp(args.TransferRate, 0f, pump.MaxTransferRate); _adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}"); + $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}"); DirtyUI(uid, pump); } @@ -171,7 +171,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (!Resolve(uid, ref pump)) return; - _userInterfaceSystem.TrySetUiState(uid, GasVolumePumpUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasVolumePumpUiKey.Key, new GasVolumePumpBoundUserInterfaceState(Name(uid), pump.TransferRate, pump.Enabled)); } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs index c0c2b930f6..007d304e98 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs @@ -94,7 +94,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems _ambientSoundSystem.SetAmbience(uid, false); DirtyUI(uid, filter); - _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasFilterUiKey.Key); } private void OnFilterActivate(EntityUid uid, GasFilterComponent filter, ActivateInWorldEvent args) @@ -104,7 +104,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (EntityManager.GetComponent(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasFilterUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasFilterUiKey.Key, actor.PlayerSession); DirtyUI(uid, filter); } else @@ -120,7 +120,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (!Resolve(uid, ref filter)) return; - _userInterfaceSystem.TrySetUiState(uid, GasFilterUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasFilterUiKey.Key, new GasFilterBoundUserInterfaceState(MetaData(uid).EntityName, filter.TransferRate, filter.Enabled, filter.FilteredGas)); } @@ -136,7 +136,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, filter); UpdateAppearance(uid, filter); } @@ -145,7 +145,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.TransferRate = Math.Clamp(args.Rate, 0f, filter.MaxTransferRate); _adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}"); + $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}"); DirtyUI(uid, filter); } @@ -158,7 +158,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.FilteredGas = parsedGas; _adminLogger.Add(LogType.AtmosFilterChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the filter on {ToPrettyString(uid):device} to {parsedGas.ToString()}"); + $"{ToPrettyString(args.Actor):player} set the filter on {ToPrettyString(uid):device} to {parsedGas.ToString()}"); DirtyUI(uid, filter); } else @@ -170,7 +170,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.FilteredGas = null; _adminLogger.Add(LogType.AtmosFilterChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the filter on {ToPrettyString(uid):device} to none"); + $"{ToPrettyString(args.Actor):player} set the filter on {ToPrettyString(uid):device} to none"); DirtyUI(uid, filter); } } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs index 4d7fc134c7..4ab8572843 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs @@ -134,7 +134,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems DirtyUI(uid, mixer); UpdateAppearance(uid, mixer); - _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasFilterUiKey.Key); } private void OnMixerActivate(EntityUid uid, GasMixerComponent mixer, ActivateInWorldEvent args) @@ -144,7 +144,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (Transform(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasMixerUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasMixerUiKey.Key, actor.PlayerSession); DirtyUI(uid, mixer); } else @@ -160,7 +160,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (!Resolve(uid, ref mixer)) return; - _userInterfaceSystem.TrySetUiState(uid, GasMixerUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasMixerUiKey.Key, new GasMixerBoundUserInterfaceState(EntityManager.GetComponent(uid).EntityName, mixer.TargetPressure, mixer.Enabled, mixer.InletOneConcentration)); } @@ -176,7 +176,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { mixer.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, mixer); UpdateAppearance(uid, mixer); } @@ -185,7 +185,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { mixer.TargetPressure = Math.Clamp(args.Pressure, 0f, mixer.MaxTargetPressure); _adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); + $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); DirtyUI(uid, mixer); } @@ -196,7 +196,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems mixer.InletOneConcentration = nodeOne; mixer.InletTwoConcentration = 1.0f - mixer.InletOneConcentration; _adminLogger.Add(LogType.AtmosRatioChanged, LogImpact.Medium, - $"{EntityManager.ToPrettyString(args.Session.AttachedEntity!.Value):player} set the ratio on {EntityManager.ToPrettyString(uid):device} to {mixer.InletOneConcentration}:{mixer.InletTwoConcentration}"); + $"{EntityManager.ToPrettyString(args.Actor):player} set the ratio on {EntityManager.ToPrettyString(uid):device} to {mixer.InletOneConcentration}:{mixer.InletTwoConcentration}"); DirtyUI(uid, mixer); } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index bdc9e76538..e279db09aa 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -96,7 +96,7 @@ public sealed class GasCanisterSystem : EntitySystem tankPressure = tankComponent.Air.Pressure; } - _ui.TrySetUiState(uid, GasCanisterUiKey.Key, + _ui.SetUiState(uid, GasCanisterUiKey.Key, new GasCanisterBoundUserInterfaceState(Name(uid), canister.Air.Pressure, portStatus, tankLabel, tankPressure, canister.ReleasePressure, canister.ReleaseValve, canister.MinReleasePressure, canister.MaxReleasePressure)); @@ -104,19 +104,19 @@ public sealed class GasCanisterSystem : EntitySystem private void OnHoldingTankEjectMessage(EntityUid uid, GasCanisterComponent canister, GasCanisterHoldingTankEjectMessage args) { - if (canister.GasTankSlot.Item == null || args.Session.AttachedEntity == null) + if (canister.GasTankSlot.Item == null) return; var item = canister.GasTankSlot.Item; - _slots.TryEjectToHands(uid, canister.GasTankSlot, args.Session.AttachedEntity); - _adminLogger.Add(LogType.CanisterTankEjected, LogImpact.Medium, $"Player {ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} ejected tank {ToPrettyString(item):tank} from {ToPrettyString(uid):canister}"); + _slots.TryEjectToHands(uid, canister.GasTankSlot, args.Actor); + _adminLogger.Add(LogType.CanisterTankEjected, LogImpact.Medium, $"Player {ToPrettyString(args.Actor):player} ejected tank {ToPrettyString(item):tank} from {ToPrettyString(uid):canister}"); } private void OnCanisterChangeReleasePressure(EntityUid uid, GasCanisterComponent canister, GasCanisterChangeReleasePressureMessage args) { var pressure = Math.Clamp(args.Pressure, canister.MinReleasePressure, canister.MaxReleasePressure); - _adminLogger.Add(LogType.CanisterPressure, LogImpact.Medium, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the release pressure on {ToPrettyString(uid):canister} to {args.Pressure}"); + _adminLogger.Add(LogType.CanisterPressure, LogImpact.Medium, $"{ToPrettyString(args.Actor):player} set the release pressure on {ToPrettyString(uid):canister} to {args.Pressure}"); canister.ReleasePressure = pressure; DirtyUI(uid, canister); @@ -129,14 +129,14 @@ public sealed class GasCanisterSystem : EntitySystem impact = canister.GasTankSlot.HasItem ? LogImpact.Medium : LogImpact.High; var containedGasDict = new Dictionary(); - var containedGasArray = Gas.GetValues(typeof(Gas)); + var containedGasArray = Enum.GetValues(typeof(Gas)); for (int i = 0; i < containedGasArray.Length; i++) { containedGasDict.Add((Gas)i, canister.Air[i]); } - _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]"); + _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Actor):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]"); canister.ReleaseValve = args.Valve; DirtyUI(uid, canister); @@ -212,7 +212,7 @@ public sealed class GasCanisterSystem : EntitySystem if (args.Handled) return; - _ui.TryOpen(uid, GasCanisterUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, GasCanisterUiKey.Key, actor.PlayerSession); args.Handled = true; } @@ -224,7 +224,7 @@ public sealed class GasCanisterSystem : EntitySystem if (CheckLocked(uid, component, args.User)) return; - _ui.TryOpen(uid, GasCanisterUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, GasCanisterUiKey.Key, actor.PlayerSession); args.Handled = true; } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 9b61044f03..827ba0bda5 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -144,7 +144,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { var powerState = _power.TogglePower(uid); - _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); + _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Actor)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); DirtyUI(uid, thermoMachine); } @@ -155,7 +155,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems else thermoMachine.TargetTemperature = MathF.Max(args.Temperature, thermoMachine.MinTemperature); thermoMachine.TargetTemperature = MathF.Max(thermoMachine.TargetTemperature, Atmospherics.TCMB); - _adminLogger.Add(LogType.AtmosTemperatureChanged, $"{ToPrettyString(args.Session.AttachedEntity)} set temperature on {ToPrettyString(uid)} to {thermoMachine.TargetTemperature}"); + _adminLogger.Add(LogType.AtmosTemperatureChanged, $"{ToPrettyString(args.Actor)} set temperature on {ToPrettyString(uid)} to {thermoMachine.TargetTemperature}"); DirtyUI(uid, thermoMachine); } @@ -168,8 +168,8 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems if (!Resolve(uid, ref powerReceiver)) return; - _userInterfaceSystem.TrySetUiState(uid, ThermomachineUiKey.Key, - new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, IsHeater(thermoMachine)), null, ui); + _userInterfaceSystem.SetUiState(uid, ThermomachineUiKey.Key, + new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, IsHeater(thermoMachine))); } private void OnExamined(EntityUid uid, GasThermoMachineComponent thermoMachine, ExaminedEvent args) diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs index fff15f696c..cbf63f5404 100644 --- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs +++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs @@ -163,7 +163,7 @@ public sealed class SpaceHeaterSystem : EntitySystem { return; } - _userInterfaceSystem.TrySetUiState(uid, SpaceHeaterUiKey.Key, + _userInterfaceSystem.SetUiState(uid, SpaceHeaterUiKey.Key, new SpaceHeaterBoundUserInterfaceState(spaceHeater.MinTemperature, spaceHeater.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, spaceHeater.Mode, spaceHeater.PowerLevel)); } diff --git a/Content.Server/Audio/Jukebox/JukeboxSystem.cs b/Content.Server/Audio/Jukebox/JukeboxSystem.cs index bfb9b2099a..cc9235e3d7 100644 --- a/Content.Server/Audio/Jukebox/JukeboxSystem.cs +++ b/Content.Server/Audio/Jukebox/JukeboxSystem.cs @@ -5,6 +5,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Audio.Components; using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; using Robust.Shared.Prototypes; using JukeboxComponent = Content.Shared.Audio.Jukebox.JukeboxComponent; @@ -66,8 +67,11 @@ public sealed class JukeboxSystem : SharedJukeboxSystem private void OnJukeboxSetTime(EntityUid uid, JukeboxComponent component, JukeboxSetTimeMessage args) { - var offset = (args.Session.Channel.Ping * 1.5f) / 1000f; - Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset); + if (TryComp(args.Actor, out ActorComponent? actorComp)) + { + var offset = actorComp.PlayerSession.Channel.Ping * 1.5f / 1000f; + Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset); + } } private void OnPowerChanged(Entity entity, ref PowerChangedEvent args) diff --git a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs index 2e7f8c4235..1369fa20f1 100644 --- a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs +++ b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs @@ -79,9 +79,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem private void OnRemoveItemBuiMessage(Entity ent, ref CryostorageRemoveItemBuiMessage args) { var (_, comp) = ent; - if (args.Session.AttachedEntity is not { } attachedEntity) - return; - + var attachedEntity = args.Actor; var cryoContained = GetEntity(args.StoredEntity); if (!comp.StoredPlayers.Contains(cryoContained) || !IsInPausedMap(cryoContained)) @@ -114,6 +112,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem AdminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(attachedEntity):player} removed item {ToPrettyString(entity)} from cryostorage-contained player " + $"{ToPrettyString(cryoContained):player}, stored in cryostorage {ToPrettyString(ent)}"); + _container.TryRemoveFromContainer(entity.Value); _transform.SetCoordinates(entity.Value, Transform(attachedEntity).Coordinates); _hands.PickupOrDrop(attachedEntity, entity.Value); @@ -122,8 +121,8 @@ public sealed class CryostorageSystem : SharedCryostorageSystem private void UpdateCryostorageUIState(Entity ent) { - var state = new CryostorageBuiState(GetAllContainedData(ent).ToList()); - _ui.TrySetUiState(ent, CryostorageUIKey.Key, state); + var state = new CryostorageBuiState(GetAllContainedData(ent)); + _ui.SetUiState(ent.Owner, CryostorageUIKey.Key, state); } private void OnPlayerSpawned(Entity ent, ref PlayerSpawnCompleteEvent args) @@ -293,12 +292,17 @@ public sealed class CryostorageSystem : SharedCryostorageSystem _chatManager.ChatMessageToOne(ChatChannel.Server, msg, msg, uid, false, actor.PlayerSession.Channel); } - private IEnumerable GetAllContainedData(Entity ent) + private List GetAllContainedData(Entity ent) { + var data = new List(); + data.EnsureCapacity(ent.Comp.StoredPlayers.Count); + foreach (var contained in ent.Comp.StoredPlayers) { - yield return GetContainedData(contained); + data.Add(GetContainedData(contained)); } + + return data; } private CryostorageContainedPlayerData GetContainedData(EntityUid uid) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index 22e5c67e17..e132e4f12a 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -52,7 +52,7 @@ public sealed partial class CargoSystem return; var untilNextSkip = bountyDb.NextSkipTime - _timing.CurTime; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip)); + _uiSystem.SetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip)); } private void OnPrintLabelMessage(EntityUid uid, CargoBountyConsoleComponent component, BountyPrintLabelMessage args) @@ -83,7 +83,7 @@ public sealed partial class CargoSystem if (!TryGetBountyFromId(station, args.BountyId, out var bounty)) return; - if (args.Session.AttachedEntity is not { Valid: true } mob) + if (args.Actor is not { Valid: true } mob) return; if (TryComp(uid, out var accessReaderComponent) && @@ -99,7 +99,7 @@ public sealed partial class CargoSystem FillBountyDatabase(station); db.NextSkipTime = _timing.CurTime + db.SkipDelay; var untilNextSkip = db.NextSkipTime - _timing.CurTime; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); + _uiSystem.SetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); _audio.PlayPvs(component.SkipSound, uid); } @@ -462,10 +462,12 @@ public sealed partial class CargoSystem { if (_station.GetOwningStation(uid) is not { } station || !TryComp(station, out var db)) + { continue; + } var untilNextSkip = db.NextSkipTime - _timing.CurTime; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip), ui: ui); + _uiSystem.SetUiState((uid, ui), CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); } } diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 13a1d3d565..63556d2fbd 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -102,12 +102,12 @@ namespace Content.Server.Cargo.Systems private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleApproveOrderMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; if (!_accessReaderSystem.IsAllowed(player, uid)) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-order-not-allowed")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-order-not-allowed")); PlayDenySound(uid, component); return; } @@ -119,7 +119,7 @@ namespace Content.Server.Cargo.Systems !TryComp(station, out StationDataComponent? stationData) || !TryGetOrderDatabase(station, out var orderDatabase)) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-station-not-found")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-station-not-found")); PlayDenySound(uid, component); return; } @@ -134,7 +134,7 @@ namespace Content.Server.Cargo.Systems // Invalid order if (!_protoMan.HasIndex(order.ProductId)) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-invalid-product")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-invalid-product")); PlayDenySound(uid, component); return; } @@ -145,7 +145,7 @@ namespace Content.Server.Cargo.Systems // Too many orders, avoid them getting spammed in the UI. if (amount >= capacity) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-too-many")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-too-many")); PlayDenySound(uid, component); return; } @@ -156,7 +156,7 @@ namespace Content.Server.Cargo.Systems if (cappedAmount != order.OrderQuantity) { order.OrderQuantity = cappedAmount; - ConsolePopup(args.Session, Loc.GetString("cargo-console-snip-snip")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-snip-snip")); PlayDenySound(uid, component); } @@ -165,7 +165,7 @@ namespace Content.Server.Cargo.Systems // Not enough balance if (cost > bank.Balance) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost))); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost))); PlayDenySound(uid, component); return; } @@ -180,7 +180,7 @@ namespace Content.Server.Cargo.Systems if (ev.FulfillmentEntity == null) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-unfulfilled")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-unfulfilled")); PlayDenySound(uid, component); return; } @@ -200,7 +200,7 @@ namespace Content.Server.Cargo.Systems ("approverJob", approverJob), ("cost", cost)); _radio.SendRadioMessage(uid, message, component.AnnouncementChannel, uid, escapeMarkup: false); - ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(ev.FulfillmentEntity.Value).EntityName))); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(ev.FulfillmentEntity.Value).EntityName))); // Log order approval _adminLogger.Add(LogType.Action, LogImpact.Low, @@ -271,7 +271,7 @@ namespace Content.Server.Cargo.Systems private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; if (args.Amount <= 0) @@ -319,9 +319,9 @@ namespace Content.Server.Cargo.Systems !TryComp(station, out var orderDatabase) || !TryComp(station, out var bankAccount)) return; - if (_uiSystem.TryGetUi(consoleUid, CargoConsoleUiKey.Orders, out var bui)) + if (_uiSystem.HasUi(consoleUid, CargoConsoleUiKey.Orders)) { - _uiSystem.SetUiState(bui, new CargoConsoleInterfaceState( + _uiSystem.SetUiState(consoleUid, CargoConsoleUiKey.Orders, new CargoConsoleInterfaceState( MetaData(station.Value).EntityName, GetOutstandingOrderCount(orderDatabase), orderDatabase.Capacity, @@ -331,9 +331,9 @@ namespace Content.Server.Cargo.Systems } } - private void ConsolePopup(ICommonSession session, string text) + private void ConsolePopup(EntityUid actor, string text) { - _popup.PopupCursor(text, session); + _popup.PopupCursor(text, actor); } private void PlayDenySound(EntityUid uid, CargoOrderConsoleComponent component) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index aa2614cdb8..e9f6d00822 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -54,21 +54,20 @@ public sealed partial class CargoSystem private void UpdatePalletConsoleInterface(EntityUid uid) { - var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale); if (Transform(uid).GridUid is not EntityUid gridUid) { - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale, new CargoPalletConsoleInterfaceState(0, 0, false)); return; } GetPalletGoods(gridUid, out var toSell, out var amount); - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale, new CargoPalletConsoleInterfaceState((int) amount, toSell.Count, true)); } private void OnPalletUIOpen(EntityUid uid, CargoPalletConsoleComponent component, BoundUIOpenedEvent args) { - var player = args.Session.AttachedEntity; + var player = args.Actor; if (player == null) return; @@ -86,7 +85,7 @@ public sealed partial class CargoSystem private void OnPalletAppraise(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletAppraiseMessage args) { - var player = args.Session.AttachedEntity; + var player = args.Actor; if (player == null) return; @@ -108,8 +107,8 @@ public sealed partial class CargoSystem var orders = GetProjectedOrders(station ?? EntityUid.Invalid, orderDatabase, shuttle); var shuttleName = orderDatabase?.Shuttle != null ? MetaData(orderDatabase.Shuttle.Value).EntityName : string.Empty; - if (_uiSystem.TryGetUi(uid, CargoConsoleUiKey.Shuttle, out var bui)) - _uiSystem.SetUiState(bui, new CargoShuttleConsoleBoundUserInterfaceState( + if (_uiSystem.HasUi(uid, CargoConsoleUiKey.Shuttle)) + _uiSystem.SetUiState(uid, CargoConsoleUiKey.Shuttle, new CargoShuttleConsoleBoundUserInterfaceState( station != null ? MetaData(station.Value).EntityName : Loc.GetString("cargo-shuttle-console-station-unknown"), string.IsNullOrEmpty(shuttleName) ? Loc.GetString("cargo-shuttle-console-shuttle-not-found") : shuttleName, orders @@ -314,17 +313,16 @@ public sealed partial class CargoSystem private void OnPalletSale(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletSellMessage args) { - var player = args.Session.AttachedEntity; + var player = args.Actor; if (player == null) return; - var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale); var xform = Transform(uid); if (xform.GridUid is not EntityUid gridUid) { - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale, new CargoPalletConsoleInterfaceState(0, 0, false)); return; } diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs index 4a76aef911..7896a7822e 100644 --- a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs +++ b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs @@ -103,12 +103,12 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem if (!Resolve(loaderUid, ref loader)) return; - if (!_userInterfaceSystem.TryGetUi(loaderUid, loader.UiKey, out var ui)) + if (!_userInterfaceSystem.HasUi(loaderUid, loader.UiKey)) return; var programs = GetAvailablePrograms(loaderUid, loader); var state = new CartridgeLoaderUiState(programs, GetNetEntity(loader.ActiveProgram)); - _userInterfaceSystem.SetUiState(ui, state, session); + _userInterfaceSystem.SetUiState(loaderUid, loader.UiKey, state); } /// @@ -127,8 +127,8 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem if (!Resolve(loaderUid, ref loader)) return; - if (_userInterfaceSystem.TryGetUi(loaderUid, loader.UiKey, out var ui)) - _userInterfaceSystem.SetUiState(ui, state, session); + if (_userInterfaceSystem.HasUi(loaderUid, loader.UiKey)) + _userInterfaceSystem.SetUiState(loaderUid, loader.UiKey, state); } /// diff --git a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs index ab91044574..289db75981 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs @@ -80,7 +80,7 @@ namespace Content.Server.Chemistry.EntitySystems chemMaster.Mode, BuildInputContainerInfo(inputContainer), BuildOutputContainerInfo(outputContainer), bufferReagents, bufferCurrentVolume, chemMaster.PillType, chemMaster.PillDosageLimit, updateLabel); - _userInterfaceSystem.TrySetUiState(owner, ChemMasterUiKey.Key, state); + _userInterfaceSystem.SetUiState(owner, ChemMasterUiKey.Key, state); } private void OnSetModeMessage(Entity chemMaster, ref ChemMasterSetModeMessage message) @@ -179,7 +179,7 @@ namespace Content.Server.Chemistry.EntitySystems private void OnCreatePillsMessage(Entity chemMaster, ref ChemMasterCreatePillsMessage message) { - var user = message.Session.AttachedEntity; + var user = message.Actor; var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName); if (maybeContainer is not { Valid: true } container || !TryComp(container, out StorageComponent? storage)) @@ -218,18 +218,9 @@ namespace Content.Server.Chemistry.EntitySystems pill.PillType = chemMaster.Comp.PillType; Dirty(item, pill); - if (user.HasValue) - { - // Log pill creation by a user - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(user.Value):user} printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}"); - } - else - { - // Log pill creation by magic? This should never happen... right? - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"Unknown printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}"); - } + // Log pill creation by a user + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(user):user} printed {ToPrettyString(item):pill} {SharedSolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}"); } UpdateUiState(chemMaster); @@ -238,7 +229,7 @@ namespace Content.Server.Chemistry.EntitySystems private void OnOutputToBottleMessage(Entity chemMaster, ref ChemMasterOutputToBottleMessage message) { - var user = message.Session.AttachedEntity; + var user = message.Actor; var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName); if (maybeContainer is not { Valid: true } container || !_solutionContainerSystem.TryGetSolution(container, SharedChemMaster.BottleSolutionName, out var soln, out var solution)) @@ -260,18 +251,9 @@ namespace Content.Server.Chemistry.EntitySystems _labelSystem.Label(container, message.Label); _solutionContainerSystem.TryAddSolution(soln.Value, withdrawal); - if (user.HasValue) - { - // Log bottle creation by a user - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(user.Value):user} bottled {ToPrettyString(container):bottle} {SolutionContainerSystem.ToPrettyString(solution)}"); - } - else - { - // Log bottle creation by magic? This should never happen... right? - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"Unknown bottled {ToPrettyString(container):bottle} {SolutionContainerSystem.ToPrettyString(solution)}"); - } + // Log bottle creation by a user + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(user):user} bottled {ToPrettyString(container):bottle} {SharedSolutionContainerSystem.ToPrettyString(solution)}"); UpdateUiState(chemMaster); ClickSound(chemMaster); diff --git a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs index d6433da56a..3bcdd4b964 100644 --- a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs @@ -62,7 +62,7 @@ namespace Content.Server.Chemistry.EntitySystems var inventory = GetInventory(reagentDispenser); var state = new ReagentDispenserBoundUserInterfaceState(outputContainerInfo, GetNetEntity(outputContainer), inventory, reagentDispenser.Comp.DispenseAmount); - _userInterfaceSystem.TrySetUiState(reagentDispenser, ReagentDispenserUiKey.Key, state); + _userInterfaceSystem.SetUiState(reagentDispenser.Owner, ReagentDispenserUiKey.Key, state); } private ContainerInfo? BuildOutputContainerInfo(EntityUid? container) diff --git a/Content.Server/Cloning/CloningConsoleSystem.cs b/Content.Server/Cloning/CloningConsoleSystem.cs index 4176806639..950a6599a8 100644 --- a/Content.Server/Cloning/CloningConsoleSystem.cs +++ b/Content.Server/Cloning/CloningConsoleSystem.cs @@ -135,17 +135,17 @@ namespace Content.Server.Cloning public void UpdateUserInterface(EntityUid consoleUid, CloningConsoleComponent consoleComponent) { - if (!_uiSystem.TryGetUi(consoleUid, CloningConsoleUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(consoleUid, CloningConsoleUiKey.Key)) return; if (!_powerReceiverSystem.IsPowered(consoleUid)) { - _uiSystem.CloseAll(ui); + _uiSystem.CloseUis(consoleUid); return; } var newState = GetUserInterfaceState(consoleComponent); - _uiSystem.SetUiState(ui, newState); + _uiSystem.SetUiState(consoleUid, CloningConsoleUiKey.Key, newState); } public void TryClone(EntityUid uid, EntityUid cloningPodUid, EntityUid scannerUid, CloningPodComponent? cloningPod = null, MedicalScannerComponent? scannerComp = null, CloningConsoleComponent? consoleComponent = null) diff --git a/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs b/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs index 23b772d99c..feb3428884 100644 --- a/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs +++ b/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs @@ -64,7 +64,7 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem return; var state = new ChameleonBoundUserInterfaceState(component.Slot, component.Default); - _uiSystem.TrySetUiState(uid, ChameleonUiKey.Key, state); + _uiSystem.SetUiState(uid, ChameleonUiKey.Key, state); } /// diff --git a/Content.Server/Communications/CommunicationsConsoleSystem.cs b/Content.Server/Communications/CommunicationsConsoleSystem.cs index 6475e1a6d7..61a18fe3d5 100644 --- a/Content.Server/Communications/CommunicationsConsoleSystem.cs +++ b/Content.Server/Communications/CommunicationsConsoleSystem.cs @@ -82,8 +82,8 @@ namespace Content.Server.Communications comp.UIUpdateAccumulator -= UIUpdateInterval; - if (_uiSystem.TryGetUi(uid, CommunicationsConsoleUiKey.Key, out var ui) && ui.SubscribedSessions.Count > 0) - UpdateCommsConsoleInterface(uid, comp, ui); + if (_uiSystem.IsUiOpen(uid, CommunicationsConsoleUiKey.Key)) + UpdateCommsConsoleInterface(uid, comp); } base.Update(frameTime); @@ -136,11 +136,8 @@ namespace Content.Server.Communications /// /// Updates the UI for a particular comms console. /// - public void UpdateCommsConsoleInterface(EntityUid uid, CommunicationsConsoleComponent comp, PlayerBoundUserInterface? ui = null) + public void UpdateCommsConsoleInterface(EntityUid uid, CommunicationsConsoleComponent comp) { - if (ui == null && !_uiSystem.TryGetUi(uid, CommunicationsConsoleUiKey.Key, out ui)) - return; - var stationUid = _stationSystem.GetOwningStation(uid); List? levels = null; string currentLevel = default!; @@ -168,7 +165,7 @@ namespace Content.Server.Communications } } - _uiSystem.SetUiState(ui, new CommunicationsConsoleInterfaceState( + _uiSystem.SetUiState(uid, CommunicationsConsoleUiKey.Key, new CommunicationsConsoleInterfaceState( CanAnnounce(comp), CanCallOrRecall(comp), levels, @@ -219,12 +216,12 @@ namespace Content.Server.Communications private void OnSelectAlertLevelMessage(EntityUid uid, CommunicationsConsoleComponent comp, CommunicationsConsoleSelectAlertLevelMessage message) { - if (message.Session.AttachedEntity is not { Valid: true } mob) + if (message.Actor is not { Valid: true } mob) return; if (!CanUse(mob, uid)) { - _popupSystem.PopupCursor(Loc.GetString("comms-console-permission-denied"), message.Session, PopupType.Medium); + _popupSystem.PopupCursor(Loc.GetString("comms-console-permission-denied"), message.Actor, PopupType.Medium); return; } @@ -241,7 +238,7 @@ namespace Content.Server.Communications var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength); var msg = SharedChatSystem.SanitizeAnnouncement(message.Message, maxLength); var author = Loc.GetString("comms-console-announcement-unknown-sender"); - if (message.Session.AttachedEntity is { Valid: true } mob) + if (message.Actor is { Valid: true } mob) { if (!CanAnnounce(comp)) { @@ -250,7 +247,7 @@ namespace Content.Server.Communications if (!CanUse(mob, uid)) { - _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor); return; } @@ -263,7 +260,7 @@ namespace Content.Server.Communications comp.AnnouncementCooldownRemaining = comp.Delay; UpdateCommsConsoleInterface(uid, comp); - var ev = new CommunicationConsoleAnnouncementEvent(uid, comp, msg, message.Session.AttachedEntity); + var ev = new CommunicationConsoleAnnouncementEvent(uid, comp, msg, message.Actor); RaiseLocalEvent(ref ev); // allow admemes with vv @@ -275,15 +272,14 @@ namespace Content.Server.Communications { _chatSystem.DispatchGlobalAnnouncement(msg, title, announcementSound: comp.Sound, colorOverride: comp.Color); - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following global announcement: {msg}"); - + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following global announcement: {msg}"); return; } + _chatSystem.DispatchStationAnnouncement(uid, msg, title, colorOverride: comp.Color); - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following station announcement: {msg}"); + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following station announcement: {msg}"); + } private void OnBroadcastMessage(EntityUid uid, CommunicationsConsoleComponent component, CommunicationsConsoleBroadcastMessage message) @@ -298,8 +294,7 @@ namespace Content.Server.Communications _deviceNetworkSystem.QueuePacket(uid, null, payload, net.TransmitFrequency); - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceNetwork, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following broadcast: {message.Message:msg}"); + _adminLogger.Add(LogType.DeviceNetwork, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following broadcast: {message.Message:msg}"); } private void OnCallShuttleMessage(EntityUid uid, CommunicationsConsoleComponent comp, CommunicationsConsoleCallEmergencyShuttleMessage message) @@ -307,12 +302,11 @@ namespace Content.Server.Communications if (!CanCallOrRecall(comp)) return; - if (message.Session.AttachedEntity is not { Valid: true } mob) - return; + var mob = message.Actor; if (!CanUse(mob, uid)) { - _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor); return; } @@ -320,7 +314,7 @@ namespace Content.Server.Communications RaiseLocalEvent(ref ev); if (ev.Cancelled) { - _popupSystem.PopupEntity(ev.Reason ?? Loc.GetString("comms-console-shuttle-unavailable"), uid, message.Session); + _popupSystem.PopupEntity(ev.Reason ?? Loc.GetString("comms-console-shuttle-unavailable"), uid, message.Actor); return; } @@ -333,17 +327,14 @@ namespace Content.Server.Communications if (!CanCallOrRecall(comp)) return; - if (message.Session.AttachedEntity is not { Valid: true } mob) - return; - - if (!CanUse(mob, uid)) + if (!CanUse(message.Actor, uid)) { - _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor); return; } _roundEndSystem.CancelRoundEndCountdown(uid); - _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(mob):player} has recalled the shuttle."); + _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(message.Actor):player} has recalled the shuttle."); } } diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs index eb31149eca..2683bf4e09 100644 --- a/Content.Server/Configurable/ConfigurationSystem.cs +++ b/Content.Server/Configurable/ConfigurationSystem.cs @@ -30,10 +30,7 @@ public sealed class ConfigurationSystem : EntitySystem if (!TryComp(args.Used, out ToolComponent? tool) || !tool.Qualities.Contains(component.QualityNeeded)) return; - if (!TryComp(args.User, out ActorComponent? actor)) - return; - - args.Handled = _uiSystem.TryOpen(uid, ConfigurationUiKey.Key, actor.PlayerSession); + args.Handled = _uiSystem.TryOpenUi(uid, ConfigurationUiKey.Key, args.User); } private void OnStartup(EntityUid uid, ConfigurationComponent component, ComponentStartup args) @@ -43,8 +40,8 @@ public sealed class ConfigurationSystem : EntitySystem private void UpdateUi(EntityUid uid, ConfigurationComponent component) { - if (_uiSystem.TryGetUi(uid, ConfigurationUiKey.Key, out var ui)) - _uiSystem.SetUiState(ui, new ConfigurationBoundUserInterfaceState(component.Config)); + if (_uiSystem.HasUi(uid, ConfigurationUiKey.Key)) + _uiSystem.SetUiState(uid, ConfigurationUiKey.Key, new ConfigurationBoundUserInterfaceState(component.Config)); } private void OnUpdate(EntityUid uid, ConfigurationComponent component, ConfigurationUpdatedMessage args) diff --git a/Content.Server/Crayon/CrayonSystem.cs b/Content.Server/Crayon/CrayonSystem.cs index 32bb96e9e2..07a13d8a34 100644 --- a/Content.Server/Crayon/CrayonSystem.cs +++ b/Content.Server/Crayon/CrayonSystem.cs @@ -90,19 +90,14 @@ public sealed class CrayonSystem : SharedCrayonSystem if (args.Handled) return; - if (!TryComp(args.User, out var actor) || - !_uiSystem.TryGetUi(uid, SharedCrayonComponent.CrayonUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(uid, SharedCrayonComponent.CrayonUiKey.Key)) { return; } - _uiSystem.ToggleUi(ui, actor.PlayerSession); - if (ui.SubscribedSessions.Contains(actor.PlayerSession)) - { - // Tell the user interface the selected stuff - _uiSystem.SetUiState(ui, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color)); - } + _uiSystem.TryToggleUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User); + _uiSystem.SetUiState(uid, SharedCrayonComponent.CrayonUiKey.Key, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color)); args.Handled = true; } @@ -140,8 +135,8 @@ public sealed class CrayonSystem : SharedCrayonSystem private void OnCrayonDropped(EntityUid uid, CrayonComponent component, DroppedEvent args) { - if (TryComp(args.User, out var actor)) - _uiSystem.TryClose(uid, SharedCrayonComponent.CrayonUiKey.Key, actor.PlayerSession); + // TODO: Use the existing event. + _uiSystem.CloseUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User); } private void UseUpCrayon(EntityUid uid, EntityUid user) diff --git a/Content.Server/CrewManifest/CrewManifestSystem.cs b/Content.Server/CrewManifest/CrewManifestSystem.cs index 8b4cbac5c1..e742456015 100644 --- a/Content.Server/CrewManifest/CrewManifestSystem.cs +++ b/Content.Server/CrewManifest/CrewManifestSystem.cs @@ -100,12 +100,12 @@ public sealed class CrewManifestSystem : EntitySystem return; var owningStation = _stationSystem.GetOwningStation(uid); - if (owningStation == null || ev.Session is not { } session) + if (owningStation == null || !TryComp(ev.Actor, out ActorComponent? actorComp)) { return; } - CloseEui(owningStation.Value, session, uid); + CloseEui(owningStation.Value, actorComp.PlayerSession, uid); } /// @@ -136,12 +136,12 @@ public sealed class CrewManifestSystem : EntitySystem { Log.Error( "{User} tried to open crew manifest from wrong UI: {Key}. Correct owned is {ExpectedKey}", - msg.Session, msg.UiKey, component.OwnerKey); + msg.Actor, msg.UiKey, component.OwnerKey); return; } var owningStation = _stationSystem.GetOwningStation(uid); - if (owningStation == null || msg.Session is not { } session) + if (owningStation == null || !TryComp(msg.Actor, out ActorComponent? actorComp)) { return; } @@ -151,7 +151,7 @@ public sealed class CrewManifestSystem : EntitySystem return; } - OpenEui(owningStation.Value, session, uid); + OpenEui(owningStation.Value, actorComp.PlayerSession, uid); } /// diff --git a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs index fe53ea268c..4389c68c04 100644 --- a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs +++ b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs @@ -77,7 +77,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS msg.Status == SecurityStatus.Suspected != (msg.Reason != null)) return; - if (!CheckSelected(ent, msg.Session, out var mob, out var key)) + if (!CheckSelected(ent, msg.Actor, out var mob, out var key)) return; if (!_stationRecords.TryGetRecord(key.Value, out var record) || record.Status == msg.Status) @@ -150,7 +150,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS private void OnAddHistory(Entity ent, ref CriminalRecordAddHistory msg) { - if (!CheckSelected(ent, msg.Session, out _, out var key)) + if (!CheckSelected(ent, msg.Actor, out _, out var key)) return; var line = msg.Line.Trim(); @@ -167,7 +167,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS private void OnDeleteHistory(Entity ent, ref CriminalRecordDeleteHistory msg) { - if (!CheckSelected(ent, msg.Session, out _, out var key)) + if (!CheckSelected(ent, msg.Actor, out _, out var key)) return; if (!_criminalRecords.TryDeleteHistory(key.Value, msg.Index)) @@ -185,7 +185,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS if (!TryComp(owningStation, out var stationRecords)) { - _ui.TrySetUiState(uid, CriminalRecordsConsoleKey.Key, new CriminalRecordsConsoleState()); + _ui.SetUiState(uid, CriminalRecordsConsoleKey.Key, new CriminalRecordsConsoleState()); return; } @@ -201,24 +201,22 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS state.SelectedKey = id; } - _ui.TrySetUiState(uid, CriminalRecordsConsoleKey.Key, state); + _ui.SetUiState(uid, CriminalRecordsConsoleKey.Key, state); } /// /// Boilerplate that most actions use, if they require that a record be selected. /// Obviously shouldn't be used for selecting records. /// - private bool CheckSelected(Entity ent, ICommonSession session, + private bool CheckSelected(Entity ent, EntityUid user, [NotNullWhen(true)] out EntityUid? mob, [NotNullWhen(true)] out StationRecordKey? key) { key = null; mob = null; - if (session.AttachedEntity is not { } user) - return false; if (!_access.IsAllowed(user, ent)) { - _popup.PopupEntity(Loc.GetString("criminal-records-permission-denied"), ent, session); + _popup.PopupEntity(Loc.GetString("criminal-records-permission-denied"), ent, user); return false; } diff --git a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs index 0e214ee865..14e0c75d96 100644 --- a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs +++ b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs @@ -48,9 +48,9 @@ public sealed class SignalTimerSystem : EntitySystem { var time = TryComp(uid, out var active) ? active.TriggerTime : TimeSpan.Zero; - if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui)) + if (_ui.HasUi(uid, SignalTimerUiKey.Key)) { - _ui.SetUiState(bui, new SignalTimerBoundUserInterfaceState(component.Label, + _ui.SetUiState(uid, SignalTimerUiKey.Key, new SignalTimerBoundUserInterfaceState(component.Label, TimeSpan.FromSeconds(component.Delay).Minutes.ToString("D2"), TimeSpan.FromSeconds(component.Delay).Seconds.ToString("D2"), component.CanEditLabel, @@ -70,9 +70,9 @@ public sealed class SignalTimerSystem : EntitySystem _audio.PlayPvs(signalTimer.DoneSound, uid); _signalSystem.InvokePort(uid, signalTimer.TriggerPort); - if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui)) + if (_ui.HasUi(uid, SignalTimerUiKey.Key)) { - _ui.SetUiState(bui, new SignalTimerBoundUserInterfaceState(signalTimer.Label, + _ui.SetUiState(uid, SignalTimerUiKey.Key, new SignalTimerBoundUserInterfaceState(signalTimer.Label, TimeSpan.FromSeconds(signalTimer.Delay).Minutes.ToString("D2"), TimeSpan.FromSeconds(signalTimer.Delay).Seconds.ToString("D2"), signalTimer.CanEditLabel, @@ -117,10 +117,7 @@ public sealed class SignalTimerSystem : EntitySystem /// The entity that is interacted with. private bool IsMessageValid(EntityUid uid, BoundUserInterfaceMessage message) { - if (message.Session.AttachedEntity is not { Valid: true } mob) - return false; - - if (!_accessReader.IsAllowed(mob, uid)) + if (!_accessReader.IsAllowed(message.Actor, uid)) return false; return true; diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 02c6538158..b68f8a594b 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -89,7 +89,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem continue; //The network configurator is a handheld device. There can only ever be an ui session open for the player holding the device. - _uiSystem.TryCloseAll(uid, NetworkConfiguratorUiKey.Configure); + _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); } } @@ -215,7 +215,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem private void OnComponentRemoved(EntityUid uid, DeviceListComponent component, ComponentRemove args) { - _uiSystem.TryCloseAll(uid, NetworkConfiguratorUiKey.Configure); + _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); } /// @@ -433,7 +433,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem return; - _uiSystem.TryOpen(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession); + _uiSystem.OpenUi(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession); configurator.DeviceLinkTarget = targetUid; @@ -464,7 +464,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem var sinkAddress = Resolve(sinkUid, ref sinkNetworkComponent, false) ? sinkNetworkComponent.Address : ""; var state = new DeviceLinkUserInterfaceState(sources, sinks, links, sourceAddress, sinkAddress, defaults); - _uiSystem.TrySetUiState(configuratorUid, NetworkConfiguratorUiKey.Link, state); + _uiSystem.SetUiState(configuratorUid, NetworkConfiguratorUiKey.Link, state); } /// @@ -478,7 +478,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (Delay(configurator)) return; - if (!targetUid.HasValue || !TryComp(userUid, out ActorComponent? actor) || !AccessCheck(targetUid.Value, userUid, configurator)) + if (!targetUid.HasValue || !AccessCheck(targetUid.Value, userUid, configurator)) return; if (!TryComp(targetUid, out DeviceListComponent? list)) @@ -488,14 +488,13 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem configurator.ActiveDeviceList = targetUid; Dirty(configuratorUid, configurator); - if (!_uiSystem.TryGetUi(configuratorUid, NetworkConfiguratorUiKey.Configure, out var bui)) - return; - - if (_uiSystem.OpenUi(bui, actor.PlayerSession)) - _uiSystem.SetUiState(bui, new DeviceListUserInterfaceState( + if (_uiSystem.TryOpenUi(configuratorUid, NetworkConfiguratorUiKey.Configure, userUid)) + { + _uiSystem.SetUiState(configuratorUid, NetworkConfiguratorUiKey.Configure, new DeviceListUserInterfaceState( _deviceListSystem.GetDeviceList(configurator.ActiveDeviceList.Value) .Select(v => (v.Key, MetaData(v.Value).EntityName)).ToHashSet() )); + } } /// @@ -523,8 +522,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem component.Devices.Remove(invalidDevice); } - if (_uiSystem.TryGetUi(uid, NetworkConfiguratorUiKey.List, out var bui)) - _uiSystem.SetUiState(bui, new NetworkConfiguratorUserInterfaceState(devices)); + _uiSystem.SetUiState(uid, NetworkConfiguratorUiKey.List, new NetworkConfiguratorUserInterfaceState(devices)); } /// @@ -565,10 +563,10 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem /// private void OnRemoveDevice(EntityUid uid, NetworkConfiguratorComponent component, NetworkConfiguratorRemoveDeviceMessage args) { - if (component.Devices.TryGetValue(args.Address, out var removedDevice) && args.Session.AttachedEntity != null) + if (component.Devices.TryGetValue(args.Address, out var removedDevice)) { _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} removed buffered device {ToPrettyString(removedDevice):subject} from {ToPrettyString(uid):tool}"); + $"{ToPrettyString(args.Actor):actor} removed buffered device {ToPrettyString(removedDevice):subject} from {ToPrettyString(uid):tool}"); } component.Devices.Remove(args.Address); @@ -583,10 +581,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem /// private void OnClearDevice(EntityUid uid, NetworkConfiguratorComponent component, NetworkConfiguratorClearDevicesMessage args) { - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared buffered devices from {ToPrettyString(uid):tool}"); - + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} cleared buffered devices from {ToPrettyString(uid):tool}"); ClearDevices(uid, component); UpdateListUiState(uid, component); @@ -609,9 +605,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (!configurator.ActiveDeviceLink.HasValue || !configurator.DeviceLinkTarget.HasValue) return; - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared links between {ToPrettyString(configurator.ActiveDeviceLink.Value):subject} and {ToPrettyString(configurator.DeviceLinkTarget.Value):subject2} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} cleared links between {ToPrettyString(configurator.ActiveDeviceLink.Value):subject} and {ToPrettyString(configurator.DeviceLinkTarget.Value):subject2} with {ToPrettyString(uid):tool}"); if (HasComp(configurator.ActiveDeviceLink) && HasComp(configurator.DeviceLinkTarget)) { @@ -649,7 +644,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink)) { _deviceLinkSystem.ToggleLink( - args.Session.AttachedEntity, + args.Actor, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, args.Source, args.Sink, @@ -660,7 +655,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink)) { _deviceLinkSystem.ToggleLink( - args.Session.AttachedEntity, + args.Actor, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, args.Source, args.Sink, @@ -687,7 +682,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink)) { _deviceLinkSystem.SaveLinks( - args.Session.AttachedEntity, + args.Actor, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, args.Links, @@ -705,7 +700,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink)) { _deviceLinkSystem.SaveLinks( - args.Session.AttachedEntity, + args.Actor, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, args.Links, @@ -735,29 +730,25 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem switch (args.ButtonKey) { case NetworkConfiguratorButtonKey.Set: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} set device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} set device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet(component.Devices.Values)); break; case NetworkConfiguratorButtonKey.Add: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} added device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet(component.Devices.Values), true); break; case NetworkConfiguratorButtonKey.Clear: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared device links from {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} cleared device links from {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet()); break; case NetworkConfiguratorButtonKey.Copy: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} copied devices from {ToPrettyString(component.ActiveDeviceList.Value):subject} to {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} copied devices from {ToPrettyString(component.ActiveDeviceList.Value):subject} to {ToPrettyString(uid):tool}"); ClearDevices(uid, component); @@ -783,8 +774,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem _ => "error" }; - _popupSystem.PopupCursor(Loc.GetString(resultText), args.Session, PopupType.Medium); - _uiSystem.TrySetUiState( + _popupSystem.PopupCursor(Loc.GetString(resultText), args.Actor, PopupType.Medium); + _uiSystem.SetUiState( uid, NetworkConfiguratorUiKey.Configure, new DeviceListUserInterfaceState( diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs index 001abad3dc..8e9c9e4ba7 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs +++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs @@ -159,8 +159,7 @@ public sealed class MailingUnitSystem : EntitySystem args.Handled = true; UpdateTargetList(uid, component); - if (_userInterfaceSystem.TryGetUi(uid, MailingUnitUiKey.Key, out var bui)) - _userInterfaceSystem.OpenUi(bui, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, MailingUnitUiKey.Key, actor.PlayerSession); } /// @@ -178,8 +177,7 @@ public sealed class MailingUnitSystem : EntitySystem return; var state = new MailingUnitBoundUserInterfaceState(component.DisposalUnitInterfaceState, component.Target, component.TargetList, component.Tag); - if (_userInterfaceSystem.TryGetUi(uid, MailingUnitUiKey.Key, out var bui)) - _userInterfaceSystem.SetUiState(bui, state); + _userInterfaceSystem.SetUiState(uid, MailingUnitUiKey.Key, state); } private void OnTargetSelected(EntityUid uid, MailingUnitComponent component, TargetSelectedMessage args) diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs index 6c0bced53e..f0f6e9142c 100644 --- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs @@ -101,8 +101,9 @@ namespace Content.Server.Disposal.Tube /// A user interface message from the client. private void OnUiAction(EntityUid uid, DisposalRouterComponent router, SharedDisposalRouterComponent.UiActionMessage msg) { - if (!EntityManager.EntityExists(msg.Session.AttachedEntity)) + if (!EntityManager.EntityExists(msg.Actor)) return; + if (TryComp(uid, out var physBody) && physBody.BodyType != BodyType.Static) return; @@ -279,9 +280,9 @@ namespace Content.Server.Disposal.Tube private void OnOpenTaggerUI(EntityUid uid, DisposalTaggerComponent tagger, BoundUIOpenedEvent args) { - if (_uiSystem.TryGetUi(uid, DisposalTaggerUiKey.Key, out var bui)) + if (_uiSystem.HasUi(uid, DisposalTaggerUiKey.Key)) { - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, DisposalTaggerUiKey.Key, new DisposalTaggerUserInterfaceState(tagger.Tag)); } } @@ -292,13 +293,9 @@ namespace Content.Server.Disposal.Tube /// Returns a private void UpdateRouterUserInterface(EntityUid uid, DisposalRouterComponent router) { - var bui = _uiSystem.GetUiOrNull(uid, DisposalRouterUiKey.Key); - if (bui == null) - return; - if (router.Tags.Count <= 0) { - _uiSystem.SetUiState(bui, new DisposalRouterUserInterfaceState("")); + _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState("")); return; } @@ -312,7 +309,7 @@ namespace Content.Server.Disposal.Tube taglist.Remove(taglist.Length - 2, 2); - _uiSystem.SetUiState(bui, new DisposalRouterUserInterfaceState(taglist.ToString())); + _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState(taglist.ToString())); } private void OnAnchorChange(EntityUid uid, DisposalTubeComponent component, ref AnchorStateChangedEvent args) diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index ba84546258..21e152c103 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -219,7 +219,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem #region UI Handlers private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent component, SharedDisposalUnitComponent.UiButtonPressedMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) { return; } @@ -235,7 +235,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); break; case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Session.AttachedEntity); + _power.TogglePower(uid, user: args.Actor); break; default: throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); @@ -268,7 +268,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem } args.Handled = true; - _ui.TryOpen(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); } private void OnAfterInteractUsing(EntityUid uid, SharedDisposalUnitComponent component, AfterInteractUsingEvent args) @@ -597,7 +597,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem var compState = GetState(uid, component); var stateString = Loc.GetString($"disposal-unit-state-{compState}"); var state = new SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState(Name(uid), stateString, EstimatedFullPressure(uid, component), powered, component.Engaged); - _ui.TrySetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state); + _ui.SetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state); var stateUpdatedEvent = new DisposalUnitUIStateUpdatedEvent(state); RaiseLocalEvent(uid, stateUpdatedEvent); @@ -802,10 +802,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem QueueAutomaticEngage(uid, component); - if (TryComp(inserted, out ActorComponent? actor)) - { - _ui.TryClose(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); - } + _ui.CloseUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, inserted); // Maybe do pullable instead? Eh still fine. Joints.RecursiveClearJoints(inserted); diff --git a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs index 56e8bd50b3..af9ccadd91 100644 --- a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs +++ b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs @@ -39,7 +39,7 @@ public sealed class DoorElectronicsSystem : EntitySystem } var state = new DoorElectronicsConfigurationState(accesses); - _uiSystem.TrySetUiState(uid, DoorElectronicsConfigurationUiKey.Key, state); + _uiSystem.SetUiState(uid, DoorElectronicsConfigurationUiKey.Key, state); } private void OnChangeConfiguration( diff --git a/Content.Server/Extinguisher/FireExtinguisherComponent.cs b/Content.Server/Extinguisher/FireExtinguisherComponent.cs index fe10b4a574..991fc76c62 100644 --- a/Content.Server/Extinguisher/FireExtinguisherComponent.cs +++ b/Content.Server/Extinguisher/FireExtinguisherComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Server.Extinguisher; -[NetworkedComponent, RegisterComponent] +[RegisterComponent] [Access(typeof(FireExtinguisherSystem))] public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent { diff --git a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs index b51efc2f5e..7b937cf0d8 100644 --- a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs +++ b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Eye.Blinding.Components; using Content.Shared.Eye.Blinding.Systems; using Robust.Shared.Player; using Robust.Server.GameObjects; +using Robust.Shared.Collections; namespace Content.Server.Eye.Blinding; @@ -37,24 +38,19 @@ public sealed class ActivatableUIRequiresVisionSystem : EntitySystem if (!args.Blind) return; - if (!TryComp(uid, out var actor)) - return; + var toClose = new ValueList<(EntityUid Entity, Enum Key)>(); - var uiList = _userInterfaceSystem.GetAllUIsForSession(actor.PlayerSession); - if (uiList == null) - return; - - Queue closeList = new(); // foreach collection modified moment - - foreach (var ui in uiList) + foreach (var bui in _userInterfaceSystem.GetActorUis(uid)) { - if (HasComp(ui.Owner)) - closeList.Enqueue(ui); + if (HasComp(bui.Entity)) + { + toClose.Add(bui); + } } - foreach (var ui in closeList) + foreach (var bui in toClose) { - _userInterfaceSystem.CloseUi(ui, actor.PlayerSession); + _userInterfaceSystem.CloseUi(bui.Entity, bui.Key, uid); } } } diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index 3ff139466f..f492595444 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -51,7 +51,7 @@ public sealed class FaxSystem : EntitySystem /// [ValidatePrototypeId] private const string DefaultPaperPrototypeId = "Paper"; - + [ValidatePrototypeId] private const string OfficePaperPrototypeId = "PaperOffice"; @@ -318,7 +318,7 @@ public sealed class FaxSystem : EntitySystem private void OnSendButtonPressed(EntityUid uid, FaxMachineComponent component, FaxSendMessage args) { - Send(uid, component, args.Session.AttachedEntity); + Send(uid, component, args.Actor); } private void OnRefreshButtonPressed(EntityUid uid, FaxMachineComponent component, FaxRefreshMessage args) @@ -358,7 +358,7 @@ public sealed class FaxSystem : EntitySystem component.SendTimeoutRemaining <= 0 && component.InsertingTimeRemaining <= 0; var state = new FaxUiState(component.FaxName, component.KnownFaxes, canSend, canCopy, isPaperInserted, component.DestinationFaxAddress); - _userInterface.TrySetUiState(uid, FaxUiKey.Key, state); + _userInterface.SetUiState(uid, FaxUiKey.Key, state); } /// @@ -410,19 +410,15 @@ public sealed class FaxSystem : EntitySystem prototype = DefaultPaperPrototypeId; var name = Loc.GetString("fax-machine-printed-paper-name"); - + var printout = new FaxPrintout(args.Content, name, prototype); component.PrintingQueue.Enqueue(printout); component.SendTimeoutRemaining += component.SendTimeout; UpdateUserInterface(uid, component); - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); - else - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"Someone added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); } /// @@ -457,9 +453,8 @@ public sealed class FaxSystem : EntitySystem UpdateUserInterface(uid, component); - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}"); + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}"); } /// diff --git a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs index 729b7304fa..5e2a562577 100644 --- a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs @@ -52,8 +52,7 @@ namespace Content.Server.Forensics component.PrintCooldown, component.PrintReadyAt); - if (!_uiSystem.TrySetUiState(uid, ForensicScannerUiKey.Key, state)) - Log.Warning($"{ToPrettyString(uid)} was unable to set UI state."); + _uiSystem.SetUiState(uid, ForensicScannerUiKey.Key, state); } private void OnDoAfter(EntityUid uid, ForensicScannerComponent component, DoAfterEvent args) @@ -163,23 +162,14 @@ namespace Content.Server.Forensics private void OpenUserInterface(EntityUid user, Entity scanner) { - if (!TryComp(user, out var actor)) - return; - UpdateUserInterface(scanner, scanner.Comp); - _uiSystem.TryOpen(scanner, ForensicScannerUiKey.Key, actor.PlayerSession); + _uiSystem.OpenUi(scanner.Owner, ForensicScannerUiKey.Key, user); } private void OnPrint(EntityUid uid, ForensicScannerComponent component, ForensicScannerPrintMessage args) { - if (!args.Session.AttachedEntity.HasValue) - { - Log.Warning($"{ToPrettyString(uid)} got OnPrint without Session.AttachedEntity"); - return; - } - - var user = args.Session.AttachedEntity.Value; + var user = args.Actor; if (_gameTiming.CurTime < component.PrintReadyAt) { @@ -191,7 +181,7 @@ namespace Content.Server.Forensics // Spawn a piece of paper. var printed = EntityManager.SpawnEntity(component.MachineOutput, Transform(uid).Coordinates); - _handsSystem.PickupOrDrop(args.Session.AttachedEntity, printed, checkActionBlocker: false); + _handsSystem.PickupOrDrop(args.Actor, printed, checkActionBlocker: false); if (!HasComp(printed)) { @@ -240,9 +230,6 @@ namespace Content.Server.Forensics private void OnClear(EntityUid uid, ForensicScannerComponent component, ForensicScannerClearMessage args) { - if (!args.Session.AttachedEntity.HasValue) - return; - component.Fingerprints = new(); component.Fibers = new(); component.DNAs = new(); diff --git a/Content.Server/Gateway/Systems/GatewaySystem.cs b/Content.Server/Gateway/Systems/GatewaySystem.cs index 7ebc751dd2..6ed28d71a7 100644 --- a/Content.Server/Gateway/Systems/GatewaySystem.cs +++ b/Content.Server/Gateway/Systems/GatewaySystem.cs @@ -129,7 +129,7 @@ public sealed class GatewaySystem : EntitySystem unlockTime ); - _ui.TrySetUiState(uid, GatewayUiKey.Key, state); + _ui.SetUiState(uid, GatewayUiKey.Key, state); } private void UpdateAppearance(EntityUid uid) @@ -139,12 +139,14 @@ public sealed class GatewaySystem : EntitySystem private void OnOpenPortal(EntityUid uid, GatewayComponent comp, GatewayOpenPortalMessage args) { - if (args.Session.AttachedEntity == null || GetNetEntity(uid) == args.Destination || + if (GetNetEntity(uid) == args.Destination || !comp.Enabled || !comp.Interactable) + { return; + } // if the gateway has an access reader check it before allowing opening - var user = args.Session.AttachedEntity.Value; + var user = args.Actor; if (CheckAccess(user, uid, comp)) return; diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index b0c4bb56ff..8e4da75fac 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -131,13 +131,13 @@ namespace Content.Server.Gravity } private void SetSwitchedOn(EntityUid uid, GravityGeneratorComponent component, bool on, - ApcPowerReceiverComponent? powerReceiver = null, ICommonSession? session = null) + ApcPowerReceiverComponent? powerReceiver = null, EntityUid? user = null) { if (!Resolve(uid, ref powerReceiver)) return; - if (session is { AttachedEntity: { } }) - _adminLogger.Add(LogType.Action, on ? LogImpact.Medium : LogImpact.High, $"{session:player} set ${ToPrettyString(uid):target} to {(on ? "on" : "off")}"); + if (user != null) + _adminLogger.Add(LogType.Action, on ? LogImpact.Medium : LogImpact.High, $"{ToPrettyString(user)} set ${ToPrettyString(uid):target} to {(on ? "on" : "off")}"); component.SwitchedOn = on; UpdatePowerState(component, powerReceiver); @@ -154,7 +154,7 @@ namespace Content.Server.Gravity private void UpdateUI(Entity ent, float chargeRate) { var (_, component, powerReceiver) = ent; - if (!_uiSystem.IsUiOpen(ent, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key)) + if (!_uiSystem.IsUiOpen(ent.Owner, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key)) return; var chargeTarget = chargeRate < 0 ? 0 : component.MaxCharge; @@ -189,8 +189,8 @@ namespace Content.Server.Gravity chargeEta ); - _uiSystem.TrySetUiState( - ent, + _uiSystem.SetUiState( + ent.Owner, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, state); @@ -209,9 +209,6 @@ namespace Content.Server.Gravity private void OnInteractHand(EntityUid uid, GravityGeneratorComponent component, InteractHandEvent args) { - if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor)) - return; - ApcPowerReceiverComponent? powerReceiver = default!; if (!Resolve(uid, ref powerReceiver)) return; @@ -220,7 +217,7 @@ namespace Content.Server.Gravity if (!component.Intact || powerReceiver.PowerReceived < component.IdlePowerUse) return; - _uiSystem.TryOpen(uid, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, actor.PlayerSession); + _uiSystem.OpenUi(uid, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, args.User); component.NeedUIUpdate = true; } @@ -287,7 +284,7 @@ namespace Content.Server.Gravity GravityGeneratorComponent component, SharedGravityGeneratorComponent.SwitchGeneratorMessage args) { - SetSwitchedOn(uid, component, args.On, session:args.Session); + SetSwitchedOn(uid, component, args.On, user: args.Actor); } } } diff --git a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs index 336116e78b..7744d16151 100644 --- a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs +++ b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs @@ -32,8 +32,8 @@ public sealed partial class HumanoidAppearanceSystem Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Customization/reptilian_parts.rsi"), "tail_smooth"), Act = () => { - _uiSystem.TryOpen(uid, HumanoidMarkingModifierKey.Key, actor.PlayerSession); - _uiSystem.TrySetUiState( + _uiSystem.OpenUi(uid, HumanoidMarkingModifierKey.Key, actor.PlayerSession); + _uiSystem.SetUiState( uid, HumanoidMarkingModifierKey.Key, new HumanoidMarkingModifierState(component.MarkingSet, component.Species, @@ -48,8 +48,7 @@ public sealed partial class HumanoidAppearanceSystem private void OnBaseLayersSet(EntityUid uid, HumanoidAppearanceComponent component, HumanoidMarkingModifierBaseLayersSetMessage message) { - if (message.Session is not { } player - || !_adminManager.HasAdminFlag(player, AdminFlags.Fun)) + if (!_adminManager.HasAdminFlag(message.Actor, AdminFlags.Fun)) { return; } @@ -67,7 +66,7 @@ public sealed partial class HumanoidAppearanceSystem if (message.ResendState) { - _uiSystem.TrySetUiState( + _uiSystem.SetUiState( uid, HumanoidMarkingModifierKey.Key, new HumanoidMarkingModifierState(component.MarkingSet, component.Species, @@ -81,8 +80,7 @@ public sealed partial class HumanoidAppearanceSystem private void OnMarkingsSet(EntityUid uid, HumanoidAppearanceComponent component, HumanoidMarkingModifierMarkingSetMessage message) { - if (message.Session is not { } player - || !_adminManager.HasAdminFlag(player, AdminFlags.Fun)) + if (!_adminManager.HasAdminFlag(message.Actor, AdminFlags.Fun)) { return; } @@ -92,7 +90,7 @@ public sealed partial class HumanoidAppearanceSystem if (message.ResendState) { - _uiSystem.TrySetUiState( + _uiSystem.SetUiState( uid, HumanoidMarkingModifierKey.Key, new HumanoidMarkingModifierState(component.MarkingSet, component.Species, diff --git a/Content.Server/Instruments/InstrumentComponent.cs b/Content.Server/Instruments/InstrumentComponent.cs index 1b7913386d..db9dbb375b 100644 --- a/Content.Server/Instruments/InstrumentComponent.cs +++ b/Content.Server/Instruments/InstrumentComponent.cs @@ -1,6 +1,7 @@ using Content.Server.UserInterface; using Content.Shared.Instruments; using Robust.Shared.Player; +using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent; namespace Content.Server.Instruments; @@ -16,9 +17,9 @@ public sealed partial class InstrumentComponent : SharedInstrumentComponent [ViewVariables] public uint LastSequencerTick = 0; // TODO Instruments: Make this ECS - public ICommonSession? InstrumentPlayer => + public EntityUid? InstrumentPlayer => _entMan.GetComponentOrNull(Owner)?.CurrentSingleUser - ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession; + ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession.AttachedEntity; } [RegisterComponent] diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs index 8dd9644e3c..f5a6713886 100644 --- a/Content.Server/Instruments/InstrumentSystem.cs +++ b/Content.Server/Instruments/InstrumentSystem.cs @@ -111,7 +111,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; instrument.Playing = true; @@ -125,7 +125,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; Clean(uid, instrument); @@ -142,7 +142,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; if (master != null) @@ -174,7 +174,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; if (msg.Channel == RobustMidiEvent.PercussionChannel && !instrument.AllowPercussion) @@ -194,8 +194,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem private void OnBoundUIClosed(EntityUid uid, InstrumentComponent component, BoundUIClosedEvent args) { if (HasComp(uid) - && _bui.TryGetUi(uid, args.UiKey, out var bui) - && bui.SubscribedSessions.Count == 0) + && !_bui.IsUiOpen(uid, args.UiKey)) { RemComp(uid); } @@ -232,7 +231,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem var instrumentQuery = EntityManager.GetEntityQuery(); if (!TryComp(uid, out InstrumentComponent? originInstrument) - || originInstrument.InstrumentPlayer?.AttachedEntity is not {} originPlayer) + || originInstrument.InstrumentPlayer is not {} originPlayer) return Array.Empty<(NetEntity, string)>(); // It's probably faster to get all possible active instruments than all entities in range @@ -247,7 +246,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem continue; // We want to use the instrument player's name. - if (instrument.InstrumentPlayer?.AttachedEntity is not {} playerUid) + if (instrument.InstrumentPlayer is not {} playerUid) continue; // Maybe a bit expensive but oh well GetBands is queued and has a timer anyway. @@ -298,7 +297,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem return; if (!instrument.Playing - || args.SenderSession != instrument.InstrumentPlayer + || args.SenderSession.AttachedEntity != instrument.InstrumentPlayer || instrument.InstrumentPlayer == null || args.SenderSession.AttachedEntity is not { } attached) { @@ -374,8 +373,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem var entity = GetEntity(request.Entity); var nearby = GetBands(entity); - _bui.TrySendUiMessage(entity, request.UiKey, new InstrumentBandResponseBuiMessage(nearby), - request.Session); + _bui.ServerSendUiMessage(entity, request.UiKey, new InstrumentBandResponseBuiMessage(nearby), request.Actor); } _bandRequestQueue.Clear(); @@ -413,7 +411,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem (instrument.BatchesDropped >= MaxMidiBatchesDropped || instrument.LaggedBatches >= MaxMidiLaggedBatches)) { - if (instrument.InstrumentPlayer?.AttachedEntity is {Valid: true} mob) + if (instrument.InstrumentPlayer is {Valid: true} mob) { _stuns.TryParalyze(mob, TimeSpan.FromSeconds(1), true); @@ -423,7 +421,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem // Just in case Clean(uid); - _bui.TryCloseAll(uid, InstrumentUiKey.Key); + _bui.CloseUi(uid, InstrumentUiKey.Key); } instrument.Timer += frameTime; @@ -437,13 +435,12 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem } } - public void ToggleInstrumentUi(EntityUid uid, ICommonSession session, InstrumentComponent? component = null) + public void ToggleInstrumentUi(EntityUid uid, EntityUid actor, InstrumentComponent? component = null) { if (!Resolve(uid, ref component)) return; - if (_bui.TryGetUi(uid, InstrumentUiKey.Key, out var bui)) - _bui.ToggleUi(bui, session); + _bui.TryToggleUi(uid, InstrumentUiKey.Key, actor); } public override bool ResolveInstrument(EntityUid uid, ref SharedInstrumentComponent? component) diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 203781bcda..4eac7e9ef1 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -16,13 +16,6 @@ namespace Content.Server.Interaction [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(HandleUserInterfaceRangeCheck); - } - public override bool CanAccessViaStorage(EntityUid user, EntityUid target) { if (Deleted(target)) @@ -37,26 +30,8 @@ namespace Content.Server.Interaction if (storage.Container?.ID != container.ID) return false; - if (!TryComp(user, out ActorComponent? actor)) - 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.SessionHasOpenUi(container.Owner, StorageComponent.StorageUiKey.Key, actor.PlayerSession); - } - - private void HandleUserInterfaceRangeCheck(ref BoundUserInterfaceCheckRangeEvent ev) - { - if (ev.Player.AttachedEntity is not { } user || ev.Result == BoundUserInterfaceRangeResult.Fail) - return; - - if (InRangeUnobstructed(user, ev.Target, ev.UserInterface.InteractionRange)) - { - ev.Result = BoundUserInterfaceRangeResult.Pass; - } - else - { - ev.Result = BoundUserInterfaceRangeResult.Fail; - } + return _uiSystem.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user); } } } diff --git a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs index 212383c463..fa5c5dad2a 100644 --- a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs @@ -79,7 +79,7 @@ namespace Content.Server.Kitchen.EntitySystems SubscribeLocalEvent(OnSignalReceived); - SubscribeLocalEvent((u, c, m) => Wzhzhzh(u, c, m.Session.AttachedEntity)); + SubscribeLocalEvent((u, c, m) => Wzhzhzh(u, c, m.Actor)); SubscribeLocalEvent(OnEjectMessage); SubscribeLocalEvent(OnEjectIndex); SubscribeLocalEvent(OnSelectTime); @@ -355,11 +355,7 @@ namespace Content.Server.Kitchen.EntitySystems public void UpdateUserInterfaceState(EntityUid uid, MicrowaveComponent component) { - var ui = _userInterface.GetUiOrNull(uid, MicrowaveUiKey.Key); - if (ui == null) - return; - - _userInterface.SetUiState(ui, new MicrowaveUpdateUserInterfaceState( + _userInterface.SetUiState(uid, MicrowaveUiKey.Key, new MicrowaveUpdateUserInterfaceState( GetNetEntityArray(component.Storage.ContainedEntities.ToArray()), HasComp(uid), component.CurrentCookTimeButtonIndex, diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs index e8ee453986..81001f0932 100644 --- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs @@ -127,7 +127,7 @@ namespace Content.Server.Kitchen.EntitySystems _solutionContainersSystem.TryAddSolution(containerSoln.Value, solution); } - _userInterfaceSystem.TrySendUiMessage(uid, ReagentGrinderUiKey.Key, + _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key, new ReagentGrinderWorkCompleteMessage()); UpdateUiState(uid); @@ -228,7 +228,7 @@ namespace Content.Server.Kitchen.EntitySystems GetNetEntityArray(inputContainer.ContainedEntities.ToArray()), containerSolution?.Contents.ToArray() ); - _userInterfaceSystem.TrySetUiState(uid, ReagentGrinderUiKey.Key, state); + _userInterfaceSystem.SetUiState(uid, ReagentGrinderUiKey.Key, state); } private void OnStartMessage(Entity entity, ref ReagentGrinderStartMessage message) @@ -305,7 +305,7 @@ namespace Content.Server.Kitchen.EntitySystems reagentGrinder.AudioStream = _audioSystem.PlayPvs(sound, uid, AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier)).Value.Entity; //slightly higher pitched - _userInterfaceSystem.TrySendUiMessage(uid, ReagentGrinderUiKey.Key, + _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key, new ReagentGrinderWorkStartedMessage(program)); } diff --git a/Content.Server/Labels/Label/HandLabelerSystem.cs b/Content.Server/Labels/Label/HandLabelerSystem.cs index dc7b9de0f8..84c41b0db5 100644 --- a/Content.Server/Labels/Label/HandLabelerSystem.cs +++ b/Content.Server/Labels/Label/HandLabelerSystem.cs @@ -90,7 +90,7 @@ namespace Content.Server.Labels private void OnHandLabelerLabelChanged(EntityUid uid, HandLabelerComponent handLabeler, HandLabelerLabelChangedMessage args) { - if (args.Session.AttachedEntity is not {Valid: true} player) + if (args.Actor is not {Valid: true} player) return; var label = args.Label.Trim(); @@ -109,7 +109,7 @@ namespace Content.Server.Labels if (!Resolve(uid, ref handLabeler)) return; - _userInterfaceSystem.TrySetUiState(uid, HandLabelerUiKey.Key, + _userInterfaceSystem.SetUiState(uid, HandLabelerUiKey.Key, new HandLabelerBoundUserInterfaceState(handLabeler.AssignedLabel)); } } diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs index 06d1b463ec..f56737a5a5 100644 --- a/Content.Server/Lathe/LatheSystem.cs +++ b/Content.Server/Lathe/LatheSystem.cs @@ -226,11 +226,10 @@ namespace Content.Server.Lathe if (!Resolve(uid, ref component)) return; - var ui = _uiSys.GetUi(uid, LatheUiKey.Key); var producing = component.CurrentRecipe ?? component.Queue.FirstOrDefault(); var state = new LatheUpdateState(GetAvailableRecipes(uid, component), component.Queue, producing); - _uiSys.SetUiState(ui, state); + _uiSys.SetUiState(uid, LatheUiKey.Key, state); } private void OnGetRecipes(EntityUid uid, TechnologyDatabaseComponent component, LatheGetRecipesEvent args) @@ -337,10 +336,10 @@ namespace Content.Server.Lathe else break; } - if (count > 0 && args.Session.AttachedEntity != null) + if (count > 0) { _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}"); + $"{ToPrettyString(args.Actor):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}"); } } TryStartProducing(uid, component); diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs index dfe398ebaf..04f8e2eb54 100644 --- a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs +++ b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs @@ -3,6 +3,7 @@ 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 diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index 9ffd9a07a9..188ff40b02 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -32,7 +32,7 @@ public sealed class MagicMirrorSystem : EntitySystem Subs.BuiEvents(MagicMirrorUiKey.Key, subs => { - subs.Event(OnUIClosed); + subs.Event(OnUiClosed); subs.Event(OnMagicMirrorSelect); subs.Event(OnTryMagicMirrorChangeColor); subs.Event(OnTryMagicMirrorAddSlot); @@ -62,10 +62,7 @@ public sealed class MagicMirrorSystem : EntitySystem if (!args.CanReach || args.Target == null) return; - if (!TryComp(args.User, out var actor)) - return; - - if (!_uiSystem.TryOpen(mirror.Owner, MagicMirrorUiKey.Key, actor.PlayerSession)) + if (!_uiSystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User)) return; UpdateInterface(mirror.Owner, args.Target.Value, mirror.Comp); @@ -79,7 +76,7 @@ public sealed class MagicMirrorSystem : EntitySystem private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, MagicMirrorSelectMessage message) { - if (component.Target is not { } target || message.Session.AttachedEntity is not { } user) + if (component.Target is not { } target) return; _doAfterSystem.Cancel(component.DoAfter); @@ -92,7 +89,7 @@ public sealed class MagicMirrorSystem : EntitySystem Marking = message.Marking, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.SelectSlotTime, doAfter, uid, target: target, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.SelectSlotTime, doAfter, uid, target: target, used: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, BreakOnDamage = true, @@ -134,7 +131,7 @@ public sealed class MagicMirrorSystem : EntitySystem private void OnTryMagicMirrorChangeColor(EntityUid uid, MagicMirrorComponent component, MagicMirrorChangeColorMessage message) { - if (component.Target is not { } target || message.Session.AttachedEntity is not { } user) + if (component.Target is not { } target) return; _doAfterSystem.Cancel(component.DoAfter); @@ -147,7 +144,7 @@ public sealed class MagicMirrorSystem : EntitySystem Colors = message.Colors, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ChangeSlotTime, doAfter, uid, target: target, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.ChangeSlotTime, doAfter, uid, target: target, used: uid) { BreakOnDamage = true, BreakOnMove = true, @@ -187,7 +184,7 @@ public sealed class MagicMirrorSystem : EntitySystem private void OnTryMagicMirrorRemoveSlot(EntityUid uid, MagicMirrorComponent component, MagicMirrorRemoveSlotMessage message) { - if (component.Target is not { } target || message.Session.AttachedEntity is not { } user) + if (component.Target is not { } target) return; _doAfterSystem.Cancel(component.DoAfter); @@ -199,7 +196,7 @@ public sealed class MagicMirrorSystem : EntitySystem Slot = message.Slot, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.RemoveSlotTime, doAfter, uid, target: target, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.RemoveSlotTime, doAfter, uid, target: target, used: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, BreakOnDamage = true, @@ -243,9 +240,6 @@ public sealed class MagicMirrorSystem : EntitySystem if (component.Target == null) return; - if (message.Session.AttachedEntity == null) - return; - _doAfterSystem.Cancel(component.DoAfter); component.DoAfter = null; @@ -254,7 +248,7 @@ public sealed class MagicMirrorSystem : EntitySystem Category = message.Category, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Session.AttachedEntity.Value, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid) { BreakOnDamage = true, BreakOnMove = true, @@ -316,10 +310,10 @@ public sealed class MagicMirrorSystem : EntitySystem humanoid.MarkingSet.PointsLeft(MarkingCategories.FacialHair) + facialHair.Count); component.Target = targetUid; - _uiSystem.TrySetUiState(mirrorUid, MagicMirrorUiKey.Key, state); + _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); } - private void OnUIClosed(Entity ent, ref BoundUIClosedEvent args) + private void OnUiClosed(Entity ent, ref BoundUIClosedEvent args) { ent.Comp.Target = null; } diff --git a/Content.Server/MassMedia/Systems/NewsSystem.cs b/Content.Server/MassMedia/Systems/NewsSystem.cs index 2b18b57ff8..0fb5d42394 100644 --- a/Content.Server/MassMedia/Systems/NewsSystem.cs +++ b/Content.Server/MassMedia/Systems/NewsSystem.cs @@ -92,15 +92,12 @@ public sealed class NewsSystem : SharedNewsSystem if (msg.ArticleNum >= articles.Count) return; - if (msg.Session.AttachedEntity is not { } actor) - return; - var article = articles[msg.ArticleNum]; - if (CheckDeleteAccess(article, ent, actor)) + if (CheckDeleteAccess(article, ent, msg.Actor)) { _adminLogger.Add( LogType.Chat, LogImpact.Medium, - $"{ToPrettyString(actor):actor} deleted news article {article.Title} by {article.Author}: {article.Content}" + $"{ToPrettyString(msg.Actor):actor} deleted news article {article.Title} by {article.Author}: {article.Content}" ); articles.RemoveAt(msg.ArticleNum); @@ -138,14 +135,11 @@ public sealed class NewsSystem : SharedNewsSystem if (!TryGetArticles(ent, out var articles)) return; - if (msg.Session.AttachedEntity is not { } author) - return; - - if (!_accessReader.FindStationRecordKeys(author, out _)) + if (!_accessReader.FindStationRecordKeys(msg.Actor, out _)) return; string? authorName = null; - if (_idCardSystem.TryFindIdCard(author, out var idCard)) + if (_idCardSystem.TryFindIdCard(msg.Actor, out var idCard)) authorName = idCard.Comp.FullName; var title = msg.Title.Trim(); @@ -164,7 +158,7 @@ public sealed class NewsSystem : SharedNewsSystem _adminLogger.Add( LogType.Chat, LogImpact.Medium, - $"{ToPrettyString(author):actor} created news article {article.Title} by {article.Author}: {article.Content}" + $"{ToPrettyString(msg.Actor):actor} created news article {article.Title} by {article.Author}: {article.Content}" ); articles.Add(article); @@ -248,14 +242,14 @@ public sealed class NewsSystem : SharedNewsSystem private void UpdateWriterUi(Entity ent) { - if (!_ui.TryGetUi(ent, NewsWriterUiKey.Key, out var ui)) + if (!_ui.HasUi(ent, NewsWriterUiKey.Key)) return; if (!TryGetArticles(ent, out var articles)) return; var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish); - _ui.SetUiState(ui, state); + _ui.SetUiState(ent.Owner, NewsWriterUiKey.Key, state); } private void UpdateReaderUi(Entity ent, EntityUid loaderUid) diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index 9e546dc33f..53c6c62cdb 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -303,15 +303,14 @@ public sealed partial class MechSystem : SharedMechSystem { EquipmentStates = ev.States }; - var ui = _ui.GetUi(uid, MechUiKey.Key); - _ui.SetUiState(ui, state); + _ui.SetUiState(uid, MechUiKey.Key, state); } public override void BreakMech(EntityUid uid, MechComponent? component = null) { base.BreakMech(uid, component); - _ui.TryCloseAll(uid, MechUiKey.Key); + _ui.CloseUi(uid, MechUiKey.Key); _actionBlocker.UpdateCanMove(uid); } diff --git a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs index ff02b9cbdf..a53df6dbae 100644 --- a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs +++ b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs @@ -58,7 +58,7 @@ public sealed class CrewMonitoringConsoleSystem : EntitySystem if (!Resolve(uid, ref component)) return; - if (!_uiSystem.TryGetUi(uid, CrewMonitoringUIKey.Key, out var bui)) + if (!_uiSystem.IsUiOpen(uid, CrewMonitoringUIKey.Key)) return; // The grid must have a NavMapComponent to visualize the map in the UI @@ -69,6 +69,6 @@ public sealed class CrewMonitoringConsoleSystem : EntitySystem // Update all sensors info var allSensors = component.ConnectedSensors.Values.ToList(); - _uiSystem.SetUiState(bui, new CrewMonitoringState(allSensors)); + _uiSystem.SetUiState(uid, CrewMonitoringUIKey.Key, new CrewMonitoringState(allSensors)); } } diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index 02e8cebbe0..71921f44fd 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -193,7 +193,8 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem healthAnalyzer.ScannedEntity = entity.Comp.BodyContainer.ContainedEntity; } - _userInterfaceSystem.TrySendUiMessage( + // TODO: This should be a state my dude + _userInterfaceSystem.ServerSendUiMessage( entity.Owner, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage(GetNetEntity(entity.Comp.BodyContainer.ContainedEntity), @@ -246,7 +247,7 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem else { RemComp(entity); - _uiSystem.TryCloseAll(entity.Owner, HealthAnalyzerUiKey.Key); + _uiSystem.CloseUi(entity.Owner, HealthAnalyzerUiKey.Key); } UpdateAppearance(entity.Owner, entity.Comp); } @@ -297,7 +298,7 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem } // if body is ejected - no need to display health-analyzer - _uiSystem.TryCloseAll(cryoPod.Owner, HealthAnalyzerUiKey.Key); + _uiSystem.CloseUi(cryoPod.Owner, HealthAnalyzerUiKey.Key); } #endregion diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs index 4988608327..7282ea197c 100644 --- a/Content.Server/Medical/HealthAnalyzerSystem.cs +++ b/Content.Server/Medical/HealthAnalyzerSystem.cs @@ -128,10 +128,10 @@ public sealed class HealthAnalyzerSystem : EntitySystem private void OpenUserInterface(EntityUid user, EntityUid analyzer) { - if (!TryComp(user, out var actor) || !_uiSystem.TryGetUi(analyzer, HealthAnalyzerUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(analyzer, HealthAnalyzerUiKey.Key)) return; - _uiSystem.OpenUi(ui, actor.PlayerSession); + _uiSystem.OpenUi(analyzer, HealthAnalyzerUiKey.Key, user); } /// @@ -172,7 +172,7 @@ public sealed class HealthAnalyzerSystem : EntitySystem /// True makes the UI show ACTIVE, False makes the UI show INACTIVE public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode) { - if (!_uiSystem.TryGetUi(healthAnalyzer, HealthAnalyzerUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(healthAnalyzer, HealthAnalyzerUiKey.Key)) return; if (!HasComp(target)) @@ -194,9 +194,7 @@ public sealed class HealthAnalyzerSystem : EntitySystem bleeding = bloodstream.BleedAmount > 0; } - - - _uiSystem.SendUiMessage(ui, new HealthAnalyzerScannedUserMessage( + _uiSystem.ServerSendUiMessage(healthAnalyzer, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage( GetNetEntity(target), bodyTemperature, bloodAmount, diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index c996f05ec4..b72be0b46c 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -187,7 +187,7 @@ public sealed class NukeSystem : EntitySystem continue; var msg = Loc.GetString("nuke-component-cant-anchor-floor"); - _popups.PopupEntity(msg, uid, args.Session, PopupType.MediumCaution); + _popups.PopupEntity(msg, uid, args.Actor, PopupType.MediumCaution); return; } @@ -243,10 +243,7 @@ public sealed class NukeSystem : EntitySystem else { - if (args.Session.AttachedEntity is not { } user) - return; - - DisarmBombDoafter(uid, user, component); + DisarmBombDoafter(uid, args.Actor, component); } } @@ -366,8 +363,7 @@ public sealed class NukeSystem : EntitySystem if (!Resolve(uid, ref component)) return; - var ui = _ui.GetUiOrNull(uid, NukeUiKey.Key); - if (ui == null) + if (!_ui.HasUi(uid, NukeUiKey.Key)) return; var anchored = Transform(uid).Anchored; @@ -388,7 +384,7 @@ public sealed class NukeSystem : EntitySystem CooldownTime = (int) component.CooldownTime }; - _ui.SetUiState(ui, state); + _ui.SetUiState(uid, NukeUiKey.Key, state); } private void PlayNukeKeypadSound(EntityUid uid, int number, NukeComponent? component = null) diff --git a/Content.Server/NukeOps/WarDeclaratorSystem.cs b/Content.Server/NukeOps/WarDeclaratorSystem.cs index bcc0b9c0ea..a2d74e16b3 100644 --- a/Content.Server/NukeOps/WarDeclaratorSystem.cs +++ b/Content.Server/NukeOps/WarDeclaratorSystem.cs @@ -55,9 +55,6 @@ public sealed class WarDeclaratorSystem : EntitySystem private void OnActivated(Entity ent, ref WarDeclaratorActivateMessage args) { - if (args.Session.AttachedEntity is not {} playerEntity) - return; - var ev = new WarDeclaredEvent(ent.Comp.CurrentStatus, ent); RaiseLocalEvent(ref ev); @@ -75,7 +72,7 @@ public sealed class WarDeclaratorSystem : EntitySystem { var title = Loc.GetString(ent.Comp.SenderTitle); _chat.DispatchGlobalAnnouncement(ent.Comp.Message, title, true, ent.Comp.Sound, ent.Comp.Color); - _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(playerEntity):player} has declared war with this text: {ent.Comp.Message}"); + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(args.Actor):player} has declared war with this text: {ent.Comp.Message}"); } UpdateUI(ent, ev.Status); @@ -83,8 +80,8 @@ public sealed class WarDeclaratorSystem : EntitySystem private void UpdateUI(Entity ent, WarConditionStatus? status = null) { - _userInterfaceSystem.TrySetUiState( - ent, + _userInterfaceSystem.SetUiState( + ent.Owner, WarDeclaratorUiKey.Key, new WarDeclaratorBoundUserInterfaceState(status, ent.Comp.DisableAt, ent.Comp.ShuttleDisabledTime)); } diff --git a/Content.Server/PAI/PAISystem.cs b/Content.Server/PAI/PAISystem.cs index e9505b5e6f..091afb1557 100644 --- a/Content.Server/PAI/PAISystem.cs +++ b/Content.Server/PAI/PAISystem.cs @@ -102,13 +102,15 @@ public sealed class PAISystem : SharedPAISystem { // Close the instrument interface if it was open // before closing - if (HasComp(uid) && TryComp(uid, out var actor)) + if (HasComp(uid)) { - _instrumentSystem.ToggleInstrumentUi(uid, actor.PlayerSession); + _instrumentSystem.ToggleInstrumentUi(uid, uid); } // Stop instrument - if (TryComp(uid, out var instrument)) _instrumentSystem.Clean(uid, instrument); + if (TryComp(uid, out var instrument)) + _instrumentSystem.Clean(uid, instrument); + if (TryComp(uid, out var metadata)) { var proto = metadata.EntityPrototype; diff --git a/Content.Server/PDA/PdaSystem.cs b/Content.Server/PDA/PdaSystem.cs index a343607196..0b86fe29ed 100644 --- a/Content.Server/PDA/PdaSystem.cs +++ b/Content.Server/PDA/PdaSystem.cs @@ -41,6 +41,7 @@ namespace Content.Server.PDA SubscribeLocalEvent(OnLightToggle); // UI Events: + SubscribeLocalEvent(OnPdaOpen); SubscribeLocalEvent(OnUiMessage); SubscribeLocalEvent(OnUiMessage); SubscribeLocalEvent(OnUiMessage); @@ -145,7 +146,7 @@ namespace Content.Server.PDA if (!Resolve(uid, ref pda, false)) return; - if (!_ui.TryGetUi(uid, PdaUiKey.Key, out var ui)) + if (!_ui.HasUi(uid, PdaUiKey.Key)) return; var address = GetDeviceNetAddress(uid); @@ -182,7 +183,15 @@ namespace Content.Server.PDA hasInstrument, address); - _ui.SetUiState(ui, state); + _ui.SetUiState(uid, PdaUiKey.Key, state); + } + + private void OnPdaOpen(Entity ent, ref BoundUIOpenedEvent args) + { + if (!PdaUiKey.Key.Equals(args.UiKey)) + return; + + UpdatePdaUi(ent.Owner, ent.Comp); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaRequestUpdateInterfaceMessage msg) @@ -208,7 +217,7 @@ namespace Content.Server.PDA return; if (HasComp(uid)) - _ringer.ToggleRingerUI(uid, msg.Session); + _ringer.ToggleRingerUI(uid, msg.Actor); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowMusicMessage msg) @@ -217,7 +226,7 @@ namespace Content.Server.PDA return; if (TryComp(uid, out var instrument)) - _instrument.ToggleInstrumentUi(uid, msg.Session, instrument); + _instrument.ToggleInstrumentUi(uid, msg.Actor, instrument); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowUplinkMessage msg) @@ -227,7 +236,7 @@ namespace Content.Server.PDA // check if its locked again to prevent malicious clients opening locked uplinks if (TryComp(uid, out var store) && IsUnlocked(uid)) - _store.ToggleUi(msg.Session.AttachedEntity!.Value, uid, store); + _store.ToggleUi(msg.Actor, uid, store); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaLockUplinkMessage msg) diff --git a/Content.Server/PDA/Ringer/RingerSystem.cs b/Content.Server/PDA/Ringer/RingerSystem.cs index f95725873a..a10544d696 100644 --- a/Content.Server/PDA/Ringer/RingerSystem.cs +++ b/Content.Server/PDA/Ringer/RingerSystem.cs @@ -81,7 +81,10 @@ namespace Content.Server.PDA.Ringer private void OnSetRingtone(EntityUid uid, RingerComponent ringer, RingerSetRingtoneMessage args) { - ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, args.Session.UserId, out var exists); + if (!TryComp(args.Actor, out ActorComponent? actorComp)) + return; + + ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, actorComp.PlayerSession.UserId, out var exists); // Delay on the client is 0.333, 0.25 is still enough and gives some leeway in case of small time differences if (exists && lastSetAt > _gameTiming.CurTime - TimeSpan.FromMilliseconds(250)) @@ -111,7 +114,7 @@ namespace Content.Server.PDA.Ringer // can't keep store open after locking it if (!uplink.Unlocked) - _ui.TryCloseAll(uid, StoreUiKey.Key); + _ui.CloseUi(uid, StoreUiKey.Key); // no saving the code to prevent meta click set on sus guys pda -> wewlad args.Handled = true; @@ -130,7 +133,7 @@ namespace Content.Server.PDA.Ringer return; uplink.Unlocked = false; - _ui.TryCloseAll(uid, StoreUiKey.Key); + _ui.CloseUi(uid, StoreUiKey.Key); } public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, MapInitEvent args) @@ -181,14 +184,12 @@ namespace Content.Server.PDA.Ringer private void UpdateRingerUserInterface(EntityUid uid, RingerComponent ringer, bool isPlaying) { - if (_ui.TryGetUi(uid, RingerUiKey.Key, out var bui)) - _ui.SetUiState(bui, new RingerUpdateState(isPlaying, ringer.Ringtone)); + _ui.SetUiState(uid, RingerUiKey.Key, new RingerUpdateState(isPlaying, ringer.Ringtone)); } - public bool ToggleRingerUI(EntityUid uid, ICommonSession session) + public bool ToggleRingerUI(EntityUid uid, EntityUid actor) { - if (_ui.TryGetUi(uid, RingerUiKey.Key, out var bui)) - _ui.ToggleUi(bui, session); + _ui.TryToggleUi(uid, RingerUiKey.Key, actor); return true; } diff --git a/Content.Server/Paper/PaperComponent.cs b/Content.Server/Paper/PaperComponent.cs index 3cf011e34d..6c379eea2b 100644 --- a/Content.Server/Paper/PaperComponent.cs +++ b/Content.Server/Paper/PaperComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Server.Paper; -[NetworkedComponent, RegisterComponent] +[RegisterComponent] public sealed partial class PaperComponent : SharedPaperComponent { public PaperAction Mode; diff --git a/Content.Server/Paper/PaperSystem.cs b/Content.Server/Paper/PaperSystem.cs index c582b82e2c..d10d04cfb9 100644 --- a/Content.Server/Paper/PaperSystem.cs +++ b/Content.Server/Paper/PaperSystem.cs @@ -67,11 +67,7 @@ namespace Content.Server.Paper private void BeforeUIOpen(EntityUid uid, PaperComponent paperComp, BeforeActivatableUIOpenEvent args) { paperComp.Mode = PaperAction.Read; - - if (!TryComp(args.User, out var actor)) - return; - - UpdateUserInterface(uid, paperComp, actor.PlayerSession); + UpdateUserInterface(uid, paperComp); } private void OnExamined(EntityUid uid, PaperComponent paperComp, ExaminedEvent args) @@ -108,12 +104,10 @@ namespace Content.Server.Paper { var writeEvent = new PaperWriteEvent(uid, args.User); RaiseLocalEvent(args.Used, ref writeEvent); - if (!TryComp(args.User, out var actor)) - return; paperComp.Mode = PaperAction.Write; - _uiSystem.TryOpen(uid, PaperUiKey.Key, actor.PlayerSession); - UpdateUserInterface(uid, paperComp, actor.PlayerSession); + _uiSystem.OpenUi(uid, PaperUiKey.Key, args.User); + UpdateUserInterface(uid, paperComp); args.Handled = true; return; } @@ -157,9 +151,8 @@ namespace Content.Server.Paper if (TryComp(uid, out var meta)) _metaSystem.SetEntityDescription(uid, "", meta); - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Chat, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):player} has written on {ToPrettyString(uid):entity} the following text: {args.Text}"); + _adminLogger.Add(LogType.Chat, LogImpact.Low, + $"{ToPrettyString(args.Actor):player} has written on {ToPrettyString(uid):entity} the following text: {args.Text}"); _audio.PlayPvs(paperComp.Sound, uid); } @@ -213,13 +206,12 @@ namespace Content.Server.Paper _appearance.SetData(uid, PaperVisuals.Status, status, appearance); } - public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null, ICommonSession? session = null) + public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null) { if (!Resolve(uid, ref paperComp)) return; - if (_uiSystem.TryGetUi(uid, PaperUiKey.Key, out var bui)) - _uiSystem.SetUiState(bui, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode), session); + _uiSystem.SetUiState(uid, PaperUiKey.Key, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode)); } } diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs index 5d373652a9..f3cff9f2e7 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs @@ -67,7 +67,7 @@ public sealed partial class ParticleAcceleratorSystem FireEmitter(comp.StarboardEmitter!.Value, strength); } - public void SwitchOn(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null) + public void SwitchOn(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null) { if (!Resolve(uid, ref comp)) return; @@ -77,7 +77,7 @@ public sealed partial class ParticleAcceleratorSystem if (comp.Enabled || !comp.CanBeEnabled) return; - if (user?.AttachedEntity is { } player) + if (user is { } player) _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} has turned {ToPrettyString(uid)} on"); comp.Enabled = true; @@ -90,14 +90,14 @@ public sealed partial class ParticleAcceleratorSystem UpdateUI(uid, comp); } - public void SwitchOff(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null) + public void SwitchOff(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null) { if (!Resolve(uid, ref comp)) return; if (!comp.Enabled) return; - if (user?.AttachedEntity is { } player) + if (user is { } player) _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} has turned {ToPrettyString(uid)} off"); comp.Enabled = false; @@ -138,7 +138,7 @@ public sealed partial class ParticleAcceleratorSystem UpdateUI(uid, comp); } - public void SetStrength(EntityUid uid, ParticleAcceleratorPowerState strength, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null) + public void SetStrength(EntityUid uid, ParticleAcceleratorPowerState strength, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null) { if (!Resolve(uid, ref comp)) return; @@ -154,7 +154,7 @@ public sealed partial class ParticleAcceleratorSystem if (strength == comp.SelectedStrength) return; - if (user?.AttachedEntity is { } player) + if (user is { } player) { var impact = strength switch { @@ -235,7 +235,8 @@ public sealed partial class ParticleAcceleratorSystem { if (!Resolve(uid, ref comp)) return; - if (!_uiSystem.TryGetUi(uid, ParticleAcceleratorControlBoxUiKey.Key, out var bui)) + + if (!_uiSystem.HasUi(uid, ParticleAcceleratorControlBoxUiKey.Key)) return; var draw = 0f; @@ -247,7 +248,7 @@ public sealed partial class ParticleAcceleratorSystem receive = powerConsumer.ReceivedPower; } - _uiSystem.SetUiState(bui, new ParticleAcceleratorUIState( + _uiSystem.SetUiState(uid, ParticleAcceleratorControlBoxUiKey.Key, new ParticleAcceleratorUIState( comp.Assembled, comp.Enabled, comp.SelectedStrength, @@ -346,7 +347,7 @@ public sealed partial class ParticleAcceleratorSystem UpdateAppearance(uid, comp); if (!args.Powered) - _uiSystem.TryCloseAll(uid, ParticleAcceleratorControlBoxUiKey.Key); + _uiSystem.CloseUi(uid, ParticleAcceleratorControlBoxUiKey.Key); } private void OnUISetEnableMessage(EntityUid uid, ParticleAcceleratorControlBoxComponent comp, ParticleAcceleratorSetEnableMessage msg) @@ -361,10 +362,10 @@ public sealed partial class ParticleAcceleratorSystem if (msg.Enabled) { if (comp.Assembled) - SwitchOn(uid, msg.Session, comp); + SwitchOn(uid, msg.Actor, comp); } else - SwitchOff(uid, msg.Session, comp); + SwitchOff(uid, msg.Actor, comp); UpdateUI(uid, comp); } @@ -378,7 +379,7 @@ public sealed partial class ParticleAcceleratorSystem if (TryComp(uid, out var apcPower) && !apcPower.Powered) return; - SetStrength(uid, msg.State, msg.Session, comp); + SetStrength(uid, msg.State, msg.Actor, comp); UpdateUI(uid, comp); } @@ -392,7 +393,7 @@ public sealed partial class ParticleAcceleratorSystem if (TryComp(uid, out var apcPower) && !apcPower.Powered) return; - RescanParts(uid, msg.Session, comp); + RescanParts(uid, msg.Actor, comp); UpdateUI(uid, comp); } diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs index bdbc7b3f5b..99bb0d5cbd 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs @@ -18,7 +18,7 @@ public sealed partial class ParticleAcceleratorSystem SubscribeLocalEvent(BodyTypeChanged); } - public void RescanParts(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? controller = null) + public void RescanParts(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? controller = null) { if (!Resolve(uid, ref controller)) return; diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs index 0cbd47c233..0645944a2a 100644 --- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs +++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs @@ -48,8 +48,7 @@ public sealed partial class ParticleAcceleratorLimiterWireAction : ComponentWire // Yes, it's a feature that mending this wire WON'T WORK if the strength wire is also cut. // Since that blocks SetStrength(). var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; - paSystem.SetStrength(wire.Owner, controller.MaxStrength, userSession, controller); + paSystem.SetStrength(wire.Owner, controller.MaxStrength, user, controller); return true; } diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs index 65fa76ee41..1650960bd3 100644 --- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs +++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs @@ -33,7 +33,6 @@ public sealed partial class ParticleAcceleratorStrengthWireAction : ComponentWir public override void Pulse(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller) { var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; - paSystem.SetStrength(wire.Owner, (ParticleAcceleratorPowerState) ((int) controller.SelectedStrength + 1), userSession, controller); + paSystem.SetStrength(wire.Owner, (ParticleAcceleratorPowerState) ((int) controller.SelectedStrength + 1), user, controller); } } diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs index c43403edd4..40a15d2bc5 100644 --- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs +++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs @@ -23,10 +23,9 @@ public sealed partial class ParticleAcceleratorPowerWireAction : ComponentWireAc public override bool Cut(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller) { var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; controller.CanBeEnabled = false; - paSystem.SwitchOff(wire.Owner, userSession, controller); + paSystem.SwitchOff(wire.Owner, user, controller); return true; } @@ -39,11 +38,10 @@ public sealed partial class ParticleAcceleratorPowerWireAction : ComponentWireAc public override void Pulse(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller) { var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; if (controller.Enabled) - paSystem.SwitchOff(wire.Owner, userSession, controller); + paSystem.SwitchOff(wire.Owner, user, controller); else if (controller.Assembled) - paSystem.SwitchOn(wire.Owner, userSession, controller); + paSystem.SwitchOn(wire.Owner, user, controller); } } diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index 34c76a1320..0aa6ab1908 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -155,9 +155,6 @@ public sealed partial class NavMapSystem : SharedNavMapSystem private void OnConfigureMessage(Entity ent, ref NavMapBeaconConfigureBuiMessage args) { - if (args.Session.AttachedEntity is not { } user) - return; - if (!TryComp(ent, out var beacon)) return; @@ -167,7 +164,7 @@ public sealed partial class NavMapSystem : SharedNavMapSystem return; _adminLog.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(user):player} configured NavMapBeacon \'{ToPrettyString(ent):entity}\' with text \'{args.Text}\', color {args.Color.ToHexNoAlpha()}, and {(args.Enabled ? "enabled" : "disabled")} it."); + $"{ToPrettyString(args.Actor):player} configured NavMapBeacon \'{ToPrettyString(ent):entity}\' with text \'{args.Text}\', color {args.Color.ToHexNoAlpha()}, and {(args.Enabled ? "enabled" : "disabled")} it."); if (TryComp(ent, out var warpPoint)) { diff --git a/Content.Server/Pinpointer/StationMapSystem.cs b/Content.Server/Pinpointer/StationMapSystem.cs index c9db560fef..b0b3141fb0 100644 --- a/Content.Server/Pinpointer/StationMapSystem.cs +++ b/Content.Server/Pinpointer/StationMapSystem.cs @@ -24,29 +24,23 @@ public sealed class StationMapSystem : EntitySystem private void OnStationMapClosed(EntityUid uid, StationMapComponent component, BoundUIClosedEvent args) { - if (!Equals(args.UiKey, StationMapUiKey.Key) || args.Session.AttachedEntity == null) + if (!Equals(args.UiKey, StationMapUiKey.Key)) return; - RemCompDeferred(args.Session.AttachedEntity.Value); + RemCompDeferred(args.Actor); } private void OnUserParentChanged(EntityUid uid, StationMapUserComponent component, ref EntParentChangedMessage args) { - if (TryComp(uid, out var actor)) - { - _ui.TryClose(component.Map, StationMapUiKey.Key, actor.PlayerSession); - } + _ui.CloseUi(component.Map, StationMapUiKey.Key, uid); } private void OnStationMapOpened(EntityUid uid, StationMapComponent component, BoundUIOpenedEvent args) { - if (args.Session.AttachedEntity == null) - return; - if (!_cell.TryUseActivatableCharge(uid)) return; - var comp = EnsureComp(args.Session.AttachedEntity.Value); + var comp = EnsureComp(args.Actor); comp.Map = uid; } } diff --git a/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs b/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs deleted file mode 100644 index c387457adb..0000000000 --- a/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Server.Power.Components -{ - [RegisterComponent] - public sealed partial class ActivatableUIRequiresPowerComponent : Component - { - } -} - diff --git a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs index 561b0e71f0..72843a65b8 100644 --- a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs +++ b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs @@ -4,11 +4,12 @@ using Content.Shared.UserInterface; using JetBrains.Annotations; using Content.Shared.Wires; using Content.Server.UserInterface; +using Content.Shared.Power.Components; +using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; namespace Content.Server.Power.EntitySystems; -[UsedImplicitly] -internal sealed class ActivatableUIRequiresPowerSystem : EntitySystem +public sealed class ActivatableUIRequiresPowerSystem : EntitySystem { [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 95b5d74a94..388f65ad2e 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -66,11 +66,8 @@ public sealed class ApcSystem : EntitySystem //Update the HasAccess var for UI to read private void OnBoundUiOpen(EntityUid uid, ApcComponent component, BoundUIOpenedEvent args) { - if (args.Session.AttachedEntity == null) - return; - // TODO: this should be per-player not stored on the apc - component.HasAccess = _accessReader.IsAllowed(args.Session.AttachedEntity.Value, uid); + component.HasAccess = _accessReader.IsAllowed(args.Actor, uid); UpdateApcState(uid, component); } @@ -81,21 +78,18 @@ public sealed class ApcSystem : EntitySystem if (attemptEv.Cancelled) { _popup.PopupCursor(Loc.GetString("apc-component-on-toggle-cancel"), - args.Session, PopupType.Medium); + args.Actor, PopupType.Medium); return; } - if (args.Session.AttachedEntity == null) - return; - - if (_accessReader.IsAllowed(args.Session.AttachedEntity.Value, uid)) + if (_accessReader.IsAllowed(args.Actor, uid)) { ApcToggleBreaker(uid, component); } else { _popup.PopupCursor(Loc.GetString("apc-component-insufficient-access"), - args.Session, PopupType.Medium); + args.Actor, PopupType.Medium); } } @@ -158,7 +152,7 @@ public sealed class ApcSystem : EntitySystem (int) MathF.Ceiling(battery.CurrentSupply), apc.LastExternalState, battery.CurrentStorage / battery.Capacity); - _ui.TrySetUiState(uid, ApcUiKey.Key, state, ui: ui); + _ui.SetUiState((uid, ui), ApcUiKey.Key, state); } private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery) diff --git a/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs b/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs index 0e20f007d7..be1238fd2b 100644 --- a/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs @@ -286,20 +286,17 @@ internal sealed partial class PowerMonitoringConsoleSystem : SharedPowerMonitori var query = AllEntityQuery(); while (query.MoveNext(out var ent, out var console)) { - if (!_userInterfaceSystem.TryGetUi(ent, PowerMonitoringConsoleUiKey.Key, out var bui)) + if (!_userInterfaceSystem.IsUiOpen(ent, PowerMonitoringConsoleUiKey.Key)) continue; - foreach (var session in bui.SubscribedSessions) - UpdateUIState(ent, console, session); + UpdateUIState(ent, console); + } } } - public void UpdateUIState(EntityUid uid, PowerMonitoringConsoleComponent component, ICommonSession session) + private void UpdateUIState(EntityUid uid, PowerMonitoringConsoleComponent component) { - if (!_userInterfaceSystem.TryGetUi(uid, PowerMonitoringConsoleUiKey.Key, out var bui)) - return; - var consoleXform = Transform(uid); if (consoleXform?.GridUid == null) @@ -422,15 +419,15 @@ internal sealed partial class PowerMonitoringConsoleSystem : SharedPowerMonitori } // Set the UI state - _userInterfaceSystem.SetUiState(bui, + _userInterfaceSystem.SetUiState(uid, + PowerMonitoringConsoleUiKey.Key, new PowerMonitoringConsoleBoundInterfaceState (totalSources, totalBatteryUsage, totalLoads, allEntries.ToArray(), sourcesForFocus.ToArray(), - loadsForFocus.ToArray()), - session); + loadsForFocus.ToArray())); } private double GetPrimaryPowerValues(EntityUid uid, PowerMonitoringDeviceComponent device, out double powerSupplied, out double powerUsage, out double batteryUsage) diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs index a95a3fd423..f7d259b122 100644 --- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs +++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs @@ -48,30 +48,21 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem private void GeneratorSwitchOutputMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorSwitchOutputMessage args) { - if (args.Session.AttachedEntity == null) - return; - var fuelGenerator = Comp(uid); if (fuelGenerator.On) return; - _switchable.Cycle(uid, args.Session.AttachedEntity.Value); + _switchable.Cycle(uid, args.Actor); } private void GeneratorStopMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorStopMessage args) { - if (args.Session.AttachedEntity == null) - return; - - StopGenerator(uid, component, args.Session.AttachedEntity.Value); + StopGenerator(uid, component, args.Actor); } private void GeneratorStartMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorStartMessage args) { - if (args.Session.AttachedEntity == null) - return; - - StartGenerator(uid, component, args.Session.AttachedEntity.Value); + StartGenerator(uid, component, args.Actor); } private void StartGenerator(EntityUid uid, PortableGeneratorComponent component, EntityUid user) @@ -234,7 +225,7 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem if (powerSupplier.Net is { IsConnectedNetwork: true } net) networkStats = (net.NetworkNode.LastCombinedLoad, net.NetworkNode.LastCombinedSupply); - _uiSystem.TrySetUiState( + _uiSystem.SetUiState( uid, GeneratorComponentUiKey.Key, new PortableGeneratorComponentBuiState(fuelComp, fuel, clogged, networkStats)); diff --git a/Content.Server/PowerCell/PowerCellSystem.cs b/Content.Server/PowerCell/PowerCellSystem.cs index d4c1faa4c9..f45a01b2e1 100644 --- a/Content.Server/PowerCell/PowerCellSystem.cs +++ b/Content.Server/PowerCell/PowerCellSystem.cs @@ -11,6 +11,7 @@ using Content.Server.Power.EntitySystems; using Content.Server.UserInterface; using Content.Shared.Containers.ItemSlots; using Content.Shared.Popups; +using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; namespace Content.Server.PowerCell; diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index d115ec991a..56c5d8e548 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -221,25 +221,25 @@ public sealed class RadioDeviceSystem : EntitySystem private void OnToggleIntercomMic(EntityUid uid, IntercomComponent component, ToggleIntercomMicMessage args) { - if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { } user) + if (component.RequiresPower && !this.IsPowered(uid, EntityManager)) return; - SetMicrophoneEnabled(uid, user, args.Enabled, true); + SetMicrophoneEnabled(uid, args.Actor, args.Enabled, true); UpdateIntercomUi(uid, component); } private void OnToggleIntercomSpeaker(EntityUid uid, IntercomComponent component, ToggleIntercomSpeakerMessage args) { - if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { } user) + if (component.RequiresPower && !this.IsPowered(uid, EntityManager)) return; - SetSpeakerEnabled(uid, user, args.Enabled, true); + SetSpeakerEnabled(uid, args.Actor, args.Enabled, true); UpdateIntercomUi(uid, component); } private void OnSelectIntercomChannel(EntityUid uid, IntercomComponent component, SelectIntercomChannelMessage args) { - if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { }) + if (component.RequiresPower && !this.IsPowered(uid, EntityManager)) return; if (!_protoMan.TryIndex(args.Channel, out _) || !component.SupportedChannels.Contains(args.Channel)) @@ -262,6 +262,6 @@ public sealed class RadioDeviceSystem : EntitySystem var availableChannels = component.SupportedChannels; var selectedChannel = micComp?.BroadcastChannel ?? SharedChatSystem.CommonChannel; var state = new IntercomBoundUIState(micEnabled, speakerEnabled, availableChannels, selectedChannel); - _ui.TrySetUiState(uid, IntercomUiKey.Key, state); + _ui.SetUiState(uid, IntercomUiKey.Key, state); } } diff --git a/Content.Server/Research/Systems/ResearchSystem.Client.cs b/Content.Server/Research/Systems/ResearchSystem.Client.cs index 6bd5300d8f..f8fdba55b7 100644 --- a/Content.Server/Research/Systems/ResearchSystem.Client.cs +++ b/Content.Server/Research/Systems/ResearchSystem.Client.cs @@ -45,7 +45,7 @@ public sealed partial class ResearchSystem if (!this.IsPowered(uid, EntityManager)) return; - _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Session); + _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Actor); } #endregion @@ -88,7 +88,7 @@ public sealed partial class ResearchSystem var state = new ResearchClientBoundInterfaceState(names.Length, names, GetServerIds(), serverComponent?.Id ?? -1); - _uiSystem.TrySetUiState(uid, ResearchClientUiKey.Key, state); + _uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state); } /// diff --git a/Content.Server/Research/Systems/ResearchSystem.Console.cs b/Content.Server/Research/Systems/ResearchSystem.Console.cs index 9f95fd2517..5358ddefcd 100644 --- a/Content.Server/Research/Systems/ResearchSystem.Console.cs +++ b/Content.Server/Research/Systems/ResearchSystem.Console.cs @@ -20,8 +20,7 @@ public sealed partial class ResearchSystem private void OnConsoleUnlock(EntityUid uid, ResearchConsoleComponent component, ConsoleUnlockTechnologyMessage args) { - if (args.Session.AttachedEntity is not { } ent) - return; + var act = args.Actor; if (!this.IsPowered(uid, EntityManager)) return; @@ -29,13 +28,13 @@ public sealed partial class ResearchSystem if (!PrototypeManager.TryIndex(args.Id, out var technologyPrototype)) return; - if (TryComp(uid, out var access) && !_accessReader.IsAllowed(ent, uid, access)) + if (TryComp(uid, out var access) && !_accessReader.IsAllowed(act, uid, access)) { - _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), ent); + _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), act); return; } - if (!UnlockTechnology(uid, args.Id, ent)) + if (!UnlockTechnology(uid, args.Id, act)) return; var message = Loc.GetString("research-console-unlock-technology-radio-broadcast", @@ -68,7 +67,7 @@ public sealed partial class ResearchSystem state = new ResearchConsoleBoundInterfaceState(default); } - _uiSystem.TrySetUiState(uid, ResearchConsoleUiKey.Key, state); + _uiSystem.SetUiState(uid, ResearchConsoleUiKey.Key, state); } private void OnPointsChanged(EntityUid uid, ResearchConsoleComponent component, ref ResearchServerPointsChangedEvent args) diff --git a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs index 2064abd8eb..6700247522 100644 --- a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs +++ b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs @@ -91,7 +91,7 @@ public sealed class DiskConsoleSystem : EntitySystem totalPoints >= component.PricePerDisk; var state = new DiskConsoleBoundUserInterfaceState(totalPoints, component.PricePerDisk, canPrint); - _ui.TrySetUiState(uid, DiskConsoleUiKey.Key, state); + _ui.SetUiState(uid, DiskConsoleUiKey.Key, state); } private void OnShutdown(EntityUid uid, DiskConsolePrintingComponent component, ComponentShutdown args) diff --git a/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs b/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs index 61636bea7c..d031418476 100644 --- a/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs +++ b/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs @@ -56,7 +56,7 @@ public sealed partial class SalvageSystem if (station != component.Owner) continue; - _ui.TrySetUiState(uid, SalvageConsoleUiKey.Expedition, state, ui: uiComp); + _ui.SetUiState((uid, uiComp), SalvageConsoleUiKey.Expedition, state); } } @@ -74,6 +74,6 @@ public sealed partial class SalvageSystem state = new SalvageExpeditionConsoleState(TimeSpan.Zero, false, true, 0, new List()); } - _ui.TrySetUiState(component, SalvageConsoleUiKey.Expedition, state); + _ui.SetUiState(component.Owner, SalvageConsoleUiKey.Expedition, state); } } diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs index e4711a5876..4b7291298b 100644 --- a/Content.Server/Salvage/SalvageSystem.Magnet.cs +++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs @@ -35,11 +35,6 @@ public sealed partial class SalvageSystem private void OnMagnetClaim(EntityUid uid, SalvageMagnetComponent component, ref MagnetClaimOfferEvent args) { - var player = args.Session.AttachedEntity; - - if (player is null) - return; - var station = _station.GetOwningStation(uid); if (!TryComp(station, out SalvageMagnetDataComponent? dataComp) || @@ -177,12 +172,12 @@ public sealed partial class SalvageSystem // Fuck with the seed to mix wrecks and asteroids. seed = (int) (seed / 10f) * 10; - + if (i >= data.Comp.OfferCount / 2) { seed++; } - + data.Comp.Offered.Add(seed); } @@ -216,7 +211,7 @@ public sealed partial class SalvageSystem if (!TryComp(station, out SalvageMagnetDataComponent? dataComp)) return; - _ui.TrySetUiState(entity, SalvageMagnetUiKey.Key, + _ui.SetUiState(entity.Owner, SalvageMagnetUiKey.Key, new SalvageMagnetBoundUserInterfaceState(dataComp.Offered) { Cooldown = dataComp.OfferCooldown, @@ -238,7 +233,7 @@ public sealed partial class SalvageSystem if (station != data.Owner) continue; - _ui.TrySetUiState(magnetUid, SalvageMagnetUiKey.Key, + _ui.SetUiState(magnetUid, SalvageMagnetUiKey.Key, new SalvageMagnetBoundUserInterfaceState(data.Comp.Offered) { Cooldown = data.Comp.OfferCooldown, diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs index 63b4d9daef..b5a954f166 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs @@ -27,7 +27,7 @@ public sealed partial class SensorMonitoringConsoleComponent : Component public TimeSpan RetentionTime = TimeSpan.FromMinutes(1); // UI update tracking stuff. - public HashSet InitialUIStateSent = new(); + public HashSet InitialUIStateSent = new(); public TimeSpan LastUIUpdate; public ValueList RemovedSensors; diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs index 26c6b17831..dec3e6c36e 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs @@ -18,27 +18,26 @@ public sealed partial class SensorMonitoringConsoleSystem private void UpdateConsoleUI(EntityUid uid, SensorMonitoringConsoleComponent comp) { - if (!_userInterface.TryGetUi(uid, SensorMonitoringConsoleUiKey.Key, out var ui)) - return; - - if (ui.SubscribedSessions.Count == 0) + if (!_userInterface.IsUiOpen(uid, SensorMonitoringConsoleUiKey.Key)) + { return; + } ConsoleUIState? fullState = null; SensorMonitoringIncrementalUpdate? incrementalUpdate = null; - foreach (var session in ui.SubscribedSessions) + foreach (var actorUid in _userInterface.GetActors(uid, SensorMonitoringConsoleUiKey.Key)) { - if (comp.InitialUIStateSent.Contains(session)) + if (comp.InitialUIStateSent.Contains(actorUid)) { incrementalUpdate ??= CalculateIncrementalUpdate(); - _userInterface.TrySendUiMessage(ui, incrementalUpdate, session); + _userInterface.ServerSendUiMessage(uid, SensorMonitoringConsoleUiKey.Key, incrementalUpdate, actorUid); } else { fullState ??= CalculateFullState(); - _userInterface.SetUiState(ui, fullState, session); - comp.InitialUIStateSent.Add(session); + _userInterface.SetUiState(uid, SensorMonitoringConsoleUiKey.Key, fullState); + comp.InitialUIStateSent.Add(actorUid); } } @@ -131,9 +130,6 @@ public sealed partial class SensorMonitoringConsoleSystem if (!args.UiKey.Equals(SensorMonitoringConsoleUiKey.Key)) return; - if (args.Session is not { } player) - return; - - component.InitialUIStateSent.Remove(player); + component.InitialUIStateSent.Remove(args.Actor); } } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 803aa963f3..d45c04cdc2 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -245,19 +245,18 @@ public sealed partial class EmergencyShuttleSystem private void OnEmergencyRepealAll(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealAllMessage args) { - var player = args.Session.AttachedEntity; - if (player == null) return; + var player = args.Actor; - if (!_reader.FindAccessTags(player.Value).Contains(EmergencyRepealAllAccess)) + if (!_reader.FindAccessTags(player).Contains(EmergencyRepealAllAccess)) { - _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player.Value, PopupType.Medium); + _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player, PopupType.Medium); return; } if (component.AuthorizedEntities.Count == 0) return; - _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Session:user}"); + _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Actor:user}"); _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", component.AuthorizationsRequired))); component.AuthorizedEntities.Clear(); UpdateAllEmergencyConsoles(); @@ -265,13 +264,11 @@ public sealed partial class EmergencyShuttleSystem private void OnEmergencyRepeal(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealMessage args) { - var player = args.Session.AttachedEntity; - if (player == null) - return; + var player = args.Actor; - if (!_idSystem.TryFindIdCard(player.Value, out var idCard) || !_reader.IsAllowed(idCard, uid)) + if (!_idSystem.TryFindIdCard(player, out var idCard) || !_reader.IsAllowed(idCard, uid)) { - _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player.Value, PopupType.Medium); + _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player, PopupType.Medium); return; } @@ -279,7 +276,7 @@ public sealed partial class EmergencyShuttleSystem if (!component.AuthorizedEntities.Remove(MetaData(idCard).EntityName)) return; - _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Session:user}"); + _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Actor:user}"); var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", remaining))); CheckForLaunch(component); @@ -288,13 +285,11 @@ public sealed partial class EmergencyShuttleSystem private void OnEmergencyAuthorize(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleAuthorizeMessage args) { - var player = args.Session.AttachedEntity; - if (player == null) - return; + var player = args.Actor; - if (!_idSystem.TryFindIdCard(player.Value, out var idCard) || !_reader.IsAllowed(idCard, uid)) + if (!_idSystem.TryFindIdCard(player, out var idCard) || !_reader.IsAllowed(idCard, uid)) { - _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), args.Session, PopupType.Medium); + _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), args.Actor, PopupType.Medium); return; } @@ -302,7 +297,7 @@ public sealed partial class EmergencyShuttleSystem if (!component.AuthorizedEntities.Add(MetaData(idCard).EntityName)) return; - _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch AUTH by {args.Session:user}"); + _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch AUTH by {args.Actor:user}"); var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; if (remaining > 0) @@ -349,9 +344,10 @@ public sealed partial class EmergencyShuttleSystem auths.Add(auth); } - if (_uiSystem.TryGetUi(uid, EmergencyConsoleUiKey.Key, out var bui)) + if (_uiSystem.HasUi(uid, EmergencyConsoleUiKey.Key)) _uiSystem.SetUiState( - bui, + uid, + EmergencyConsoleUiKey.Key, new EmergencyConsoleBoundUserInterfaceState() { EarlyLaunchTime = EarlyLaunchAuthorized ? _timing.CurTime + TimeSpan.FromSeconds(_consoleAccumulator) : null, diff --git a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs index b7f08b4b34..1de20a8734 100644 --- a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs @@ -39,7 +39,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem angle = Angle.Zero; } - if (_uiSystem.TryGetUi(uid, RadarConsoleUiKey.Key, out var bui)) + if (_uiSystem.HasUi(uid, RadarConsoleUiKey.Key)) { NavInterfaceState state; var docks = _console.GetAllDocks(); @@ -53,7 +53,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem state = _console.GetNavState(uid, docks); } - _uiSystem.SetUiState(bui, new NavBoundUserInterfaceState(state)); + _uiSystem.SetUiState(uid, RadarConsoleUiKey.Key, new NavBoundUserInterfaceState(state)); } } } diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index a4f2c7b4db..89dc114caf 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -136,13 +136,12 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem /// private void OnConsoleUIClose(EntityUid uid, ShuttleConsoleComponent component, BoundUIClosedEvent args) { - if ((ShuttleConsoleUiKey) args.UiKey != ShuttleConsoleUiKey.Key || - args.Session.AttachedEntity is not { } user) + if ((ShuttleConsoleUiKey) args.UiKey != ShuttleConsoleUiKey.Key) { return; } - RemovePilot(user); + RemovePilot(args.Actor); } private void OnConsoleUIOpenAttempt(EntityUid uid, ShuttleConsoleComponent component, @@ -265,9 +264,9 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem new List()); } - if (_ui.TryGetUi(consoleUid, ShuttleConsoleUiKey.Key, out var bui)) + if (_ui.HasUi(consoleUid, ShuttleConsoleUiKey.Key)) { - _ui.SetUiState(bui, new ShuttleBoundUserInterfaceState(navState, mapState, dockState)); + _ui.SetUiState(consoleUid, ShuttleConsoleUiKey.Key, new ShuttleBoundUserInterfaceState(navState, mapState, dockState)); } } diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs index bf265da2e6..ce79466b58 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs @@ -57,7 +57,7 @@ public sealed partial class ShuttleSystem !TryComp(uid, out var xform) || !TryComp(xform.GridUid, out var iff)) { - _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() + _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() { AllowedFlags = component.AllowedFlags, Flags = IFFFlags.None, @@ -65,7 +65,7 @@ public sealed partial class ShuttleSystem } else { - _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() + _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() { AllowedFlags = component.AllowedFlags, Flags = iff.Flags, @@ -83,7 +83,7 @@ public sealed partial class ShuttleSystem if (xform.GridUid != gridUid) continue; - _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() + _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() { AllowedFlags = comp.AllowedFlags, Flags = component.Flags, diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs index 3dcdd78aff..d0e9f80e36 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs @@ -28,20 +28,19 @@ public sealed partial class BorgSystem private void OnEjectBrainBuiMessage(EntityUid uid, BorgChassisComponent component, BorgEjectBrainBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity || component.BrainEntity is not { } brain) + if (component.BrainEntity is not { } brain) return; _adminLog.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(attachedEntity):player} removed brain {ToPrettyString(brain)} from borg {ToPrettyString(uid)}"); + $"{ToPrettyString(args.Actor):player} removed brain {ToPrettyString(brain)} from borg {ToPrettyString(uid)}"); _container.Remove(brain, component.BrainContainer); - _hands.TryPickupAnyHand(attachedEntity, brain); + _hands.TryPickupAnyHand(args.Actor, brain); UpdateUI(uid, component); } private void OnEjectBatteryBuiMessage(EntityUid uid, BorgChassisComponent component, BorgEjectBatteryBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity || - !TryComp(uid, out var slotComp) || + if (!TryComp(uid, out var slotComp) || !Container.TryGetContainer(uid, slotComp.CellSlotId, out var container) || !container.ContainedEntities.Any()) { @@ -49,14 +48,11 @@ public sealed partial class BorgSystem } var ents = Container.EmptyContainer(container); - _hands.TryPickupAnyHand(attachedEntity, ents.First()); + _hands.TryPickupAnyHand(args.Actor, ents.First()); } private void OnSetNameBuiMessage(EntityUid uid, BorgChassisComponent component, BorgSetNameBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity) - return; - if (args.Name.Length > HumanoidCharacterProfile.MaxNameLength || args.Name.Length == 0 || string.IsNullOrWhiteSpace(args.Name) || @@ -75,24 +71,21 @@ public sealed partial class BorgSystem if (metaData.EntityName.Equals(name, StringComparison.InvariantCulture)) return; - _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(attachedEntity):player} set borg \"{ToPrettyString(uid)}\"'s name to: {name}"); + _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(args.Actor):player} set borg \"{ToPrettyString(uid)}\"'s name to: {name}"); _metaData.SetEntityName(uid, name, metaData); } private void OnRemoveModuleBuiMessage(EntityUid uid, BorgChassisComponent component, BorgRemoveModuleBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity) - return; - var module = GetEntity(args.Module); if (!component.ModuleContainer.Contains(module)) return; _adminLog.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(attachedEntity):player} removed module {ToPrettyString(module)} from borg {ToPrettyString(uid)}"); + $"{ToPrettyString(args.Actor):player} removed module {ToPrettyString(module)} from borg {ToPrettyString(uid)}"); _container.Remove(module, component.ModuleContainer); - _hands.TryPickupAnyHand(attachedEntity, module); + _hands.TryPickupAnyHand(args.Actor, module); UpdateUI(uid, component); } @@ -111,6 +104,6 @@ public sealed partial class BorgSystem } var state = new BorgBuiState(chargePercent, hasBattery); - _ui.TrySetUiState(uid, BorgUiKey.Key, state); + _ui.SetUiState(uid, BorgUiKey.Key, state); } } diff --git a/Content.Server/Silicons/Laws/SiliconLawSystem.cs b/Content.Server/Silicons/Laws/SiliconLawSystem.cs index 010682bc0d..cc1532899d 100644 --- a/Content.Server/Silicons/Laws/SiliconLawSystem.cs +++ b/Content.Server/Silicons/Laws/SiliconLawSystem.cs @@ -93,10 +93,10 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem private void OnBoundUIOpened(EntityUid uid, SiliconLawBoundComponent component, BoundUIOpenedEvent args) { _entityManager.TryGetComponent(uid, out var intrinsicRadio); - HashSet? radioChannels = intrinsicRadio?.Channels; + var radioChannels = intrinsicRadio?.Channels; var state = new SiliconLawBuiState(GetLaws(uid).Laws, radioChannels); - _userInterface.TrySetUiState(args.Entity, SiliconLawsUiKey.Key, state, args.Session); + _userInterface.SetUiState(args.Entity, SiliconLawsUiKey.Key, state); } private void OnPlayerSpawnComplete(EntityUid uid, SiliconLawBoundComponent component, PlayerSpawnCompleteEvent args) diff --git a/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs b/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs index 179cadcfbc..dd3f0c0054 100644 --- a/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs +++ b/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs @@ -35,13 +35,13 @@ namespace Content.Server.Solar.EntitySystems _updateTimer -= 1; var state = new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun); var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var _, out var uiComp)) + while (query.MoveNext(out var uid, out _, out var uiComp)) { - _uiSystem.TrySetUiState(uid, SolarControlConsoleUiKey.Key, state, ui: uiComp); + _uiSystem.SetUiState((uid, uiComp), SolarControlConsoleUiKey.Key, state); } } } - + private void OnUIMessage(EntityUid uid, SolarControlConsoleComponent component, SolarControlConsoleAdjustMessage msg) { if (double.IsFinite(msg.Rotation)) diff --git a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs index 721eff6f2c..a5202285d9 100644 --- a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs +++ b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs @@ -57,7 +57,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem if (!TryComp(owningStation, out var stationRecords)) { - _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); return; } @@ -66,7 +66,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem switch (listing.Count) { case 0: - _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); return; case 1: console.ActiveKey = listing.Keys.First(); @@ -80,6 +80,6 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem _stationRecords.TryGetRecord(key, out var record, stationRecords); GeneralStationRecordConsoleState newState = new(id, record, listing, console.Filter); - _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, newState); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, newState); } } diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.cs b/Content.Server/Storage/EntitySystems/StorageSystem.cs index 390310390e..4b5dd7290c 100644 --- a/Content.Server/Storage/EntitySystems/StorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/StorageSystem.cs @@ -7,10 +7,8 @@ using Content.Shared.Lock; using Content.Shared.Storage; using Content.Shared.Storage.Components; using Content.Shared.Storage.EntitySystems; -using Content.Shared.Timing; using Content.Shared.Verbs; using Robust.Server.GameObjects; -using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -20,133 +18,21 @@ namespace Content.Server.Storage.EntitySystems; public sealed partial class StorageSystem : SharedStorageSystem { - [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - - private const string OpenUiUseDelayID = "storage"; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent>(AddUiVerb); - Subs.BuiEvents(StorageComponent.StorageUiKey.Key, subs => - { - subs.Event(OnBoundUIClosed); - }); SubscribeLocalEvent(OnExploded); SubscribeLocalEvent(OnStorageFillMapInit); } - protected override void OnMapInit(Entity entity, ref MapInitEvent args) - { - base.OnMapInit(entity, ref args); - - if (TryComp(entity, out var useDelay)) - UseDelay.SetLength((entity, useDelay), entity.Comp.OpenUiCooldown, OpenUiUseDelayID); - } - - 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); - - // Get the session for the user - if (!TryComp(args.User, out var actor)) - return; - - // Does this player currently have the storage UI open? - var uiOpen = _uiSystem.SessionHasOpenUi(uid, StorageComponent.StorageUiKey.Key, actor.PlayerSession); - - ActivationVerb verb = new() - { - Act = () => - { - if (uiOpen) - { - _uiSystem.TryClose(uid, StorageComponent.StorageUiKey.Key, actor.PlayerSession); - } - else - { - OpenStorageUI(uid, args.User, component, silent); - } - } - }; - if (uiOpen) - { - verb.Text = Loc.GetString("comp-storage-verb-close-storage"); - verb.Icon = new SpriteSpecifier.Texture( - new("/Textures/Interface/VerbIcons/close.svg.192dpi.png")); - } - else - { - verb.Text = Loc.GetString("comp-storage-verb-open-storage"); - verb.Icon = new SpriteSpecifier.Texture( - new("/Textures/Interface/VerbIcons/open.svg.192dpi.png")); - } - args.Verbs.Add(verb); - } - - private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundUIClosedEvent args) - { - if (TryComp(args.Session.AttachedEntity, out var actor) && actor?.PlayerSession != null) - CloseNestedInterfaces(uid, actor.PlayerSession, storageComp); - - // If UI is closed for everyone - if (!_uiSystem.IsUiOpen(uid, args.UiKey)) - { - storageComp.IsUiOpen = false; - UpdateAppearance((uid, storageComp, null)); - - if (storageComp.StorageCloseSound is not null) - Audio.PlayEntity(storageComp.StorageCloseSound, Filter.Pvs(uid, entityManager: EntityManager), uid, true, storageComp.StorageCloseSound.Params); - } - } - private void OnExploded(Entity ent, ref BeforeExplodeEvent args) { args.Contents.AddRange(ent.Comp.Container.ContainedEntities); } - /// - /// Opens the storage UI for an entity - /// - /// The entity to open the UI for - public override void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false) - { - if (!Resolve(uid, ref storageComp, false) || !TryComp(entity, out ActorComponent? player)) - return; - - // prevent spamming bag open / honkerton honk sound - silent |= TryComp(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay), OpenUiUseDelayID); - if (!silent) - { - if (!storageComp.IsUiOpen) - _audio.PlayPvs(storageComp.StorageOpenSound, uid); - if (useDelay != null) - UseDelay.TryResetDelay((uid, useDelay), id: OpenUiUseDelayID); - } - - Log.Debug($"Storage (UID {uid}) \"used\" by player session (UID {player.PlayerSession.AttachedEntity})."); - - var bui = _uiSystem.GetUiOrNull(uid, StorageComponent.StorageUiKey.Key); - if (bui == null) - return; - _uiSystem.OpenUi(bui, player.PlayerSession); - _uiSystem.SendUiMessage(bui, new StorageModifyWindowMessage()); - } - /// public override void PlayPickupAnimation(EntityUid uid, EntityCoordinates initialCoordinates, EntityCoordinates finalCoordinates, Angle initialRotation, EntityUid? user = null) @@ -154,30 +40,4 @@ public sealed partial class StorageSystem : SharedStorageSystem var filter = Filter.Pvs(uid).RemoveWhereAttachedEntity(e => e == user); RaiseNetworkEvent(new PickupAnimationEvent(GetNetEntity(uid), GetNetCoordinates(initialCoordinates), GetNetCoordinates(finalCoordinates), initialRotation), filter); } - - /// - /// If the user has nested-UIs open (e.g., PDA UI open when pda is in a backpack), close them. - /// - /// - public void CloseNestedInterfaces(EntityUid uid, ICommonSession session, StorageComponent? storageComp = null) - { - if (!Resolve(uid, ref storageComp)) - return; - - // for each containing thing - // if it has a storage comp - // ensure unsubscribe from session - // if it has a ui component - // close ui - foreach (var entity in storageComp.Container.ContainedEntities) - { - if (!TryComp(entity, out UserInterfaceComponent? ui)) - continue; - - foreach (var bui in ui.Interfaces.Values) - { - _uiSystem.TryClose(entity, bui.UiKey, session, ui); - } - } - } } diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 25f64ba4b6..864fe1185a 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -73,7 +73,7 @@ public sealed partial class StoreSystem if (!Resolve(uid, ref component)) return; - _ui.TryCloseAll(uid, StoreUiKey.Key); + _ui.CloseUi(uid, StoreUiKey.Key); } /// @@ -83,12 +83,13 @@ public sealed partial class StoreSystem /// The store entity itself /// The store component being refreshed. /// - public void UpdateUserInterface(EntityUid? user, EntityUid store, StoreComponent? component = null, PlayerBoundUserInterface? ui = null) + public void UpdateUserInterface(EntityUid? user, EntityUid store, StoreComponent? component = null) { if (!Resolve(store, ref component)) return; - if (ui == null && !_ui.TryGetUi(store, StoreUiKey.Key, out ui)) + // TODO: Why is the state not being set unless this? + if (!_ui.IsUiOpen(store, StoreUiKey.Key)) return; //this is the person who will be passed into logic for all listing filtering. @@ -113,12 +114,12 @@ public sealed partial class StoreSystem // only tell operatives to lock their uplink if it can be locked var showFooter = HasComp(store); var state = new StoreUpdateState(component.LastAvailableListings, allCurrency, showFooter, component.RefundAllowed); - _ui.SetUiState(ui, state); + _ui.SetUiState(store, StoreUiKey.Key, state); } private void OnRequestUpdate(EntityUid uid, StoreComponent component, StoreRequestUpdateInterfaceMessage args) { - UpdateUserInterface(args.Session.AttachedEntity, GetEntity(args.Entity), component); + UpdateUserInterface(args.Actor, GetEntity(args.Entity), component); } private void BeforeActivatableUiOpen(EntityUid uid, StoreComponent component, BeforeActivatableUIOpenEvent args) @@ -139,8 +140,7 @@ public sealed partial class StoreSystem return; } - if (msg.Session.AttachedEntity is not { Valid: true } buyer) - return; + var buyer = msg.Actor; //verify that we can actually buy this listing and it wasn't added if (!ListingHasCategory(listing, component.Categories)) @@ -263,7 +263,7 @@ public sealed partial class StoreSystem $"{ToPrettyString(buyer):player} purchased listing \"{ListingLocalisationHelpers.GetLocalisedNameOrEntityName(listing, _prototypeManager)}\" from {ToPrettyString(uid)}"); listing.PurchaseAmount++; //track how many times something has been purchased - _audio.PlayEntity(component.BuySuccessSound, msg.Session, uid); //cha-ching! + _audio.PlayEntity(component.BuySuccessSound, msg.Actor, uid); //cha-ching! UpdateUserInterface(buyer, uid, component); } @@ -289,8 +289,7 @@ public sealed partial class StoreSystem if (proto.Cash == null || !proto.CanWithdraw) return; - if (msg.Session.AttachedEntity is not { Valid: true } buyer) - return; + var buyer = msg.Actor; FixedPoint2 amountRemaining = msg.Amount; var coordinates = Transform(buyer).Coordinates; @@ -313,7 +312,7 @@ public sealed partial class StoreSystem { // TODO: Remove guardian/holopara - if (args.Session.AttachedEntity is not { Valid: true } buyer) + if (args.Actor is not { Valid: true } buyer) return; if (!IsOnStartingMap(uid, component)) diff --git a/Content.Server/Store/Systems/StoreSystem.cs b/Content.Server/Store/Systems/StoreSystem.cs index 56426e0404..7998c42f53 100644 --- a/Content.Server/Store/Systems/StoreSystem.cs +++ b/Content.Server/Store/Systems/StoreSystem.cs @@ -199,10 +199,9 @@ public sealed partial class StoreSystem : EntitySystem if (component.Balance == new Dictionary() && preset.InitialBalance != null) //if we don't have a value stored, use the preset TryAddCurrency(preset.InitialBalance, uid, component); - var ui = _ui.GetUiOrNull(uid, StoreUiKey.Key); - if (ui != null) + if (_ui.HasUi(uid, StoreUiKey.Key)) { - _ui.SetUiState(ui, new StoreInitializeState(preset.StoreName)); + _ui.SetUiState(uid, StoreUiKey.Key, new StoreInitializeState(preset.StoreName)); } } } diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 9447dec417..1dba52a698 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -111,17 +111,15 @@ namespace Content.Server.Strip if (TryComp(user, out var mode) && mode.IsInCombatMode && !openInCombat) return; - if (TryComp(user, out var actor) && HasComp(user)) + if (HasComp(user)) { - if (_userInterfaceSystem.SessionHasOpenUi(strippable, StrippingUiKey.Key, actor.PlayerSession)) - return; - _userInterfaceSystem.TryOpen(strippable, StrippingUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(strippable.Owner, StrippingUiKey.Key, user); } } private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) { - if (args.Session.AttachedEntity is not { Valid: true } user || + if (args.Actor is not { Valid: true } user || !TryComp(user, out var userHands)) return; @@ -173,7 +171,7 @@ namespace Content.Server.Strip private void OnStripEnsnareMessage(EntityUid uid, EnsnareableComponent component, StrippingEnsnareButtonPressed args) { - if (args.Session.AttachedEntity is not { Valid: true } user) + if (args.Actor is not { Valid: true } user) return; foreach (var entity in component.Container.ContainedEntities) diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs index f258fbe89c..ca0f59cd14 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs @@ -90,7 +90,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem private void OnSubnetRequest(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraMonitorSubnetRequestMessage args) { - if (args.Session.AttachedEntity != null) + if (args.Actor != null) { SetActiveSubnet(uid, args.Subnet, component); } @@ -208,13 +208,9 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem private void OnBoundUiClose(EntityUid uid, SurveillanceCameraMonitorComponent component, BoundUIClosedEvent args) { - if (args.Session.AttachedEntity == null) - { - return; - } - - RemoveViewer(uid, args.Session.AttachedEntity.Value, component); + RemoveViewer(uid, args.Actor, component); } + #endregion private void SendHeartbeat(EntityUid uid, SurveillanceCameraMonitorComponent? monitor = null) @@ -487,6 +483,6 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem } var state = new SurveillanceCameraMonitorUiState(GetNetEntity(monitor.ActiveCamera), monitor.KnownSubnets.Keys.ToHashSet(), monitor.ActiveCameraAddress, monitor.ActiveSubnet, monitor.KnownCameras); - _userInterface.TrySetUiState(uid, SurveillanceCameraMonitorUiKey.Key, state); + _userInterface.SetUiState(uid, SurveillanceCameraMonitorUiKey.Key, state); } } diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs index ac41723026..d0c2cd78d3 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs @@ -134,14 +134,14 @@ public sealed class SurveillanceCameraRouterSystem : EntitySystem UpdateSetupInterface(uid, component); } - private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraRouterComponent? camera = null, ActorComponent? actor = null) + private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraRouterComponent? camera = null) { - if (!Resolve(uid, ref camera) || !Resolve(player, ref actor)) - return; - if (!_userInterface.TryGetUi(uid, SurveillanceCameraSetupUiKey.Router, out var bui)) + if (!Resolve(uid, ref camera)) + return; + + if (!_userInterface.TryOpenUi(uid, SurveillanceCameraSetupUiKey.Router, player)) return; - _userInterface.OpenUi(bui, actor.PlayerSession); UpdateSetupInterface(uid, camera); } @@ -154,13 +154,13 @@ public sealed class SurveillanceCameraRouterSystem : EntitySystem if (router.AvailableNetworks.Count == 0 || router.SubnetFrequencyId != null) { - _userInterface.TryCloseAll(uid, SurveillanceCameraSetupUiKey.Router); + _userInterface.CloseUi(uid, SurveillanceCameraSetupUiKey.Router); return; } var state = new SurveillanceCameraSetupBoundUiState(router.SubnetName, deviceNet.ReceiveFrequency ?? 0, router.AvailableNetworks, true, router.SubnetFrequencyId != null); - _userInterface.TrySetUiState(uid, SurveillanceCameraSetupUiKey.Router, state); + _userInterface.SetUiState(uid, SurveillanceCameraSetupUiKey.Router, state); } private void SendHeartbeat(EntityUid uid, string origin, string destination, diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index 410ba9f754..8dd253269d 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -196,14 +196,14 @@ public sealed class SurveillanceCameraSystem : EntitySystem UpdateSetupInterface(uid, component); } - private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraComponent? camera = null, ActorComponent? actor = null) + private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraComponent? camera = null) { - if (!Resolve(uid, ref camera) || !Resolve(player, ref actor)) - return; - if (!_userInterface.TryGetUi(uid, SurveillanceCameraSetupUiKey.Camera, out var bui)) + if (!Resolve(uid, ref camera)) + return; + + if (!_userInterface.TryOpenUi(uid, SurveillanceCameraSetupUiKey.Camera, player)) return; - _userInterface.OpenUi(bui, actor.PlayerSession); UpdateSetupInterface(uid, camera); } @@ -216,7 +216,7 @@ public sealed class SurveillanceCameraSystem : EntitySystem if (camera.NameSet && camera.NetworkSet) { - _userInterface.TryCloseAll(uid, SurveillanceCameraSetupUiKey.Camera); + _userInterface.CloseUi(uid, SurveillanceCameraSetupUiKey.Camera); return; } @@ -228,14 +228,14 @@ public sealed class SurveillanceCameraSystem : EntitySystem } else if (!camera.NetworkSet) { - _userInterface.TryCloseAll(uid, SurveillanceCameraSetupUiKey.Camera); + _userInterface.CloseUi(uid, SurveillanceCameraSetupUiKey.Camera); return; } } var state = new SurveillanceCameraSetupBoundUiState(camera.CameraId, deviceNet.ReceiveFrequency ?? 0, camera.AvailableNetworks, camera.NameSet, camera.NetworkSet); - _userInterface.TrySetUiState(uid, SurveillanceCameraSetupUiKey.Camera, state); + _userInterface.SetUiState(uid, SurveillanceCameraSetupUiKey.Camera, state); } // If the camera deactivates for any reason, it must have all viewers removed, diff --git a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs index 9918565328..133876bd75 100644 --- a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs +++ b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs @@ -79,6 +79,6 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem data.Add(i, info); } - _ui.TrySetUiState(uid, ThiefBackpackUIKey.Key, new ThiefBackpackBoundUserInterfaceState(data, MaxSelectedSets)); + _ui.SetUiState(uid, ThiefBackpackUIKey.Key, new ThiefBackpackBoundUserInterfaceState(data, MaxSelectedSets)); } } diff --git a/Content.Server/UserInterface/IntrinsicUIComponent.cs b/Content.Server/UserInterface/IntrinsicUIComponent.cs index 4d3c7ffba9..83936edc8c 100644 --- a/Content.Server/UserInterface/IntrinsicUIComponent.cs +++ b/Content.Server/UserInterface/IntrinsicUIComponent.cs @@ -9,18 +9,12 @@ public sealed partial class IntrinsicUIComponent : Component /// /// List of UIs and their actions that this entity has. /// - [DataField("uis", required: true)] public List UIs = new(); + [DataField("uis", required: true)] public Dictionary UIs = new(); } [DataDefinition] -public partial class IntrinsicUIEntry +public sealed partial class IntrinsicUIEntry { - /// - /// The BUI key that this intrinsic UI should open. - /// - [DataField("key", required: true)] - public Enum? Key { get; private set; } - [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] public string? ToggleAction; diff --git a/Content.Server/UserInterface/IntrinsicUISystem.cs b/Content.Server/UserInterface/IntrinsicUISystem.cs index fa725e524a..0f7261865d 100644 --- a/Content.Server/UserInterface/IntrinsicUISystem.cs +++ b/Content.Server/UserInterface/IntrinsicUISystem.cs @@ -18,50 +18,31 @@ public sealed class IntrinsicUISystem : EntitySystem private void OnActionToggle(EntityUid uid, IntrinsicUIComponent component, ToggleIntrinsicUIEvent args) { + if (args.Key == null) + return; + args.Handled = InteractUI(uid, args.Key, component); } private void InitActions(EntityUid uid, IntrinsicUIComponent component, MapInitEvent args) { - foreach (var entry in component.UIs) + foreach (var entry in component.UIs.Values) { _actionsSystem.AddAction(uid, ref entry.ToggleActionEntity, entry.ToggleAction); } } - public bool InteractUI(EntityUid uid, Enum? key, IntrinsicUIComponent? iui = null, ActorComponent? actor = null) + public bool InteractUI(EntityUid uid, Enum key, IntrinsicUIComponent? iui = null, ActorComponent? actor = null) { if (!Resolve(uid, ref iui, ref actor)) return false; - if (key is null) - { - Log.Error($"Entity {ToPrettyString(uid)} has an invalid intrinsic UI."); - } - - var ui = GetUIOrNull(uid, key, iui); - - if (ui is null) - { - Log.Error($"Couldn't get UI {key} on {ToPrettyString(uid)}"); - return false; - } - var attempt = new IntrinsicUIOpenAttemptEvent(uid, key); RaiseLocalEvent(uid, attempt); if (attempt.Cancelled) return false; - _uiSystem.ToggleUi(ui, actor.PlayerSession); - return true; - } - - private PlayerBoundUserInterface? GetUIOrNull(EntityUid uid, Enum? key, IntrinsicUIComponent? component = null) - { - if (!Resolve(uid, ref component)) - return null; - - return key is null ? null : _uiSystem.GetUiOrNull(uid, key); + return _uiSystem.TryToggleUi(uid, key, actor.PlayerSession); } } diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 7c9aed188f..723b9de626 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -115,7 +115,7 @@ namespace Content.Server.VendingMachines { var state = new VendingMachineInterfaceState(GetAllInventory(uid, component)); - _userInterfaceSystem.TrySetUiState(uid, VendingMachineUiKey.Key, state); + _userInterfaceSystem.SetUiState(uid, VendingMachineUiKey.Key, state); } private void OnInventoryEjectMessage(EntityUid uid, VendingMachineComponent component, VendingMachineEjectMessage args) @@ -123,7 +123,7 @@ namespace Content.Server.VendingMachines if (!this.IsPowered(uid, EntityManager)) return; - if (args.Session.AttachedEntity is not { Valid: true } entity || Deleted(entity)) + if (args.Actor is not { Valid: true } entity || Deleted(entity)) return; AuthorizedVend(uid, entity, args.Type, args.ID, component); diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.cs b/Content.Server/VoiceMask/VoiceMaskSystem.cs index ad9020d324..df972b9a14 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.cs @@ -41,17 +41,14 @@ public sealed partial class VoiceMaskSystem : EntitySystem { if (message.Name.Length > HumanoidCharacterProfile.MaxNameLength || message.Name.Length <= 0) { - _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-failure"), uid, message.Session, PopupType.SmallCaution); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-failure"), uid, message.Actor, PopupType.SmallCaution); return; } component.VoiceName = message.Name; - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} set voice of {ToPrettyString(uid):mask}: {component.VoiceName}"); - else - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"Voice of {ToPrettyString(uid):mask} set: {component.VoiceName}"); + _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(message.Actor):player} set voice of {ToPrettyString(uid):mask}: {component.VoiceName}"); - _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), uid, message.Actor); TrySetLastKnownName(uid, message.Name); @@ -66,7 +63,7 @@ public sealed partial class VoiceMaskSystem : EntitySystem ent.Comp.SpeechVerb = msg.Verb; // verb is only important to metagamers so no need to log as opposed to name - _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), ent, msg.Session); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), ent, msg.Actor); TrySetLastSpeechVerb(ent, msg.Verb); @@ -94,14 +91,12 @@ public sealed partial class VoiceMaskSystem : EntitySystem ent.Comp.Enabled = !args.IsToggled; } - private void OpenUI(EntityUid player, ActorComponent? actor = null) + private void OpenUI(EntityUid player) { - if (!Resolve(player, ref actor)) - return; - if (!_uiSystem.TryGetUi(player, VoiceMaskUIKey.Key, out var bui)) + if (!_uiSystem.HasUi(player, VoiceMaskUIKey.Key)) return; - _uiSystem.OpenUi(bui, actor.PlayerSession); + _uiSystem.OpenUi(player, VoiceMaskUIKey.Key, player); UpdateUI(player); } @@ -112,7 +107,7 @@ public sealed partial class VoiceMaskSystem : EntitySystem return; } - if (_uiSystem.TryGetUi(owner, VoiceMaskUIKey.Key, out var bui)) - _uiSystem.SetUiState(bui, new VoiceMaskBuiState(component.VoiceName, component.SpeechVerb)); + if (_uiSystem.HasUi(owner, VoiceMaskUIKey.Key)) + _uiSystem.SetUiState(owner, VoiceMaskUIKey.Key, new VoiceMaskBuiState(component.VoiceName, component.SpeechVerb)); } } diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index a2deb11fe7..5d31a4d144 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -17,6 +17,7 @@ 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; @@ -393,11 +394,11 @@ public sealed class WiresSystem : SharedWiresSystem private void OnWiresActionMessage(EntityUid uid, WiresComponent component, WiresActionMessage args) { - if (args.Session.AttachedEntity == null) + if (args.Actor == null) { return; } - var player = (EntityUid) args.Session.AttachedEntity; + var player = (EntityUid) args.Actor; if (!EntityManager.TryGetComponent(player, out HandsComponent? handsComponent)) { @@ -458,7 +459,7 @@ public sealed class WiresSystem : SharedWiresSystem { if (TryComp(args.User, out ActorComponent? actor)) { - _uiSystem.TryOpen(uid, WiresUiKey.Key, actor.PlayerSession); + _uiSystem.OpenUi(uid, WiresUiKey.Key, actor.PlayerSession); args.Handled = true; } } @@ -468,7 +469,8 @@ public sealed class WiresSystem : SharedWiresSystem { if (args.Open) return; - _uiSystem.TryCloseAll(ent, WiresUiKey.Key); + + _uiSystem.CloseUi(ent.Owner, WiresUiKey.Key); } private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) @@ -574,18 +576,17 @@ public sealed class WiresSystem : SharedWiresSystem statuses.Sort((a, b) => a.position.CompareTo(b.position)); - _uiSystem.TrySetUiState(uid, WiresUiKey.Key, new WiresBoundUserInterfaceState( + _uiSystem.SetUiState((uid, ui), WiresUiKey.Key, new WiresBoundUserInterfaceState( clientList.ToArray(), statuses.Select(p => new StatusEntry(p.key, p.value)).ToArray(), Loc.GetString(wires.BoardName), wires.SerialNumber, - wires.WireSeed), ui: ui); + wires.WireSeed)); } public void OpenUserInterface(EntityUid uid, ICommonSession player) { - if (_uiSystem.TryGetUi(uid, WiresUiKey.Key, out var ui)) - _uiSystem.OpenUi(ui, player); + _uiSystem.OpenUi(uid, WiresUiKey.Key, player); } /// @@ -629,7 +630,7 @@ public sealed class WiresSystem : SharedWiresSystem if (!args.WiresAccessible) { - _uiSystem.TryCloseAll(uid, WiresUiKey.Key); + _uiSystem.CloseUi(uid, WiresUiKey.Key); } } diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs index 2e546dd200..59ca913a39 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs @@ -223,8 +223,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem var state = new AnalysisConsoleUpdateState(GetNetEntity(artifact), analyzerConnected, serverConnected, canScan, canPrint, msg, scanning, paused, active?.StartTime, active?.AccumulatedRunTime, totalTime, points, biasDirection == BiasDirection.Down); - var bui = _ui.GetUi(uid, ArtifactAnalzyerUiKey.Key); - _ui.SetUiState(bui, state); + _ui.SetUiState(uid, ArtifactAnalzyerUiKey.Key, state); } /// @@ -235,7 +234,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem /// private void OnServerSelectionMessage(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleServerSelectionMessage args) { - _ui.TryOpen(uid, ResearchClientUiKey.Key, args.Session); + _ui.OpenUi(uid, ResearchClientUiKey.Key, args.Actor); } /// diff --git a/Content.Shared/Administration/Components/SharedHeadstandComponent.cs b/Content.Shared/Administration/Components/SharedHeadstandComponent.cs index ebc23c7b05..96a4dfc2dd 100644 --- a/Content.Shared/Administration/Components/SharedHeadstandComponent.cs +++ b/Content.Shared/Administration/Components/SharedHeadstandComponent.cs @@ -1,6 +1,9 @@ -namespace Content.Shared.Administration.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Administration.Components; /// /// Flips the target's sprite on it's head, so they do a headstand. /// +[NetworkedComponent] public abstract partial class SharedHeadstandComponent : Component { } diff --git a/Content.Shared/Administration/Components/SharedKillSignComponent.cs b/Content.Shared/Administration/Components/SharedKillSignComponent.cs index 2e6d54ca88..9a95454f72 100644 --- a/Content.Shared/Administration/Components/SharedKillSignComponent.cs +++ b/Content.Shared/Administration/Components/SharedKillSignComponent.cs @@ -1,5 +1,8 @@ -namespace Content.Shared.Administration.Components; +using Robust.Shared.GameStates; +namespace Content.Shared.Administration.Components; + +[NetworkedComponent] public abstract partial class SharedKillSignComponent : Component { diff --git a/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs b/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs index 34a64d0edb..3bea79d345 100644 --- a/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs @@ -42,7 +42,7 @@ public sealed class SolutionTransferSystem : EntitySystem var newTransferAmount = FixedPoint2.Clamp(message.Value, ent.Comp.MinimumTransferAmount, ent.Comp.MaximumTransferAmount); ent.Comp.TransferAmount = newTransferAmount; - if (message.Session.AttachedEntity is { Valid: true } user) + if (message.Actor is { Valid: true } user) _popup.PopupClient(Loc.GetString("comp-solution-transfer-set-amount", ("amount", newTransferAmount)), ent, user); } @@ -53,10 +53,9 @@ public sealed class SolutionTransferSystem : EntitySystem if (!args.CanAccess || !args.CanInteract || !comp.CanChangeTransferAmount || args.Hands == null) return; - if (!TryComp(args.User, out var actor)) - return; - // Custom transfer verb + var @event = args; + args.Verbs.Add(new AlternativeVerb() { Text = Loc.GetString("comp-solution-transfer-verb-custom-amount"), @@ -64,8 +63,7 @@ public sealed class SolutionTransferSystem : EntitySystem // TODO: remove server check when bui prediction is a thing Act = () => { - if (_net.IsServer) - _ui.TryOpen(uid, TransferAmountUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, TransferAmountUiKey.Key, @event.User); }, Priority = 1 }); diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index 83e09b1a6d..914b34d3c1 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -626,9 +626,9 @@ namespace Content.Shared.Containers.ItemSlots return; if (args.TryEject && slot.HasItem) - TryEjectToHands(uid, slot, args.Session.AttachedEntity, false); - else if (args.TryInsert && !slot.HasItem && args.Session.AttachedEntity is EntityUid user) - TryInsertFromHand(uid, slot, user); + TryEjectToHands(uid, slot, args.Actor, true); + else if (args.TryInsert && !slot.HasItem) + TryInsertFromHand(uid, slot, args.Actor); } #endregion diff --git a/Content.Shared/Content.Shared.csproj b/Content.Shared/Content.Shared.csproj index 4cca399b28..51a80dfd21 100644 --- a/Content.Shared/Content.Shared.csproj +++ b/Content.Shared/Content.Shared.csproj @@ -23,6 +23,9 @@ false + + + diff --git a/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs b/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs index 53d58f1d80..dbb1f6f2c4 100644 --- a/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs +++ b/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs @@ -1,8 +1,10 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Extinguisher; +[NetworkedComponent] public abstract partial class SharedFireExtinguisherComponent : Component { [DataField("refillSound")] public SoundSpecifier RefillSound = new SoundPathSpecifier("/Audio/Effects/refill.ogg"); diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 2eabe14d23..1f421d0e6f 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -76,8 +76,11 @@ namespace Content.Shared.Interaction public override void Initialize() { + SubscribeLocalEvent(HandleUserInterfaceRangeCheck); SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); + SubscribeAllEvent(HandleInteractInventorySlotEvent); + SubscribeLocalEvent(OnRemoveAttempt); SubscribeLocalEvent(OnUnequip); SubscribeLocalEvent(OnUnequipHand); @@ -108,7 +111,9 @@ namespace Content.Shared.Interaction /// private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) { - if (ev.Sender.AttachedEntity is not { } user || !_actionBlockerSystem.CanInteract(user, ev.Target)) + var user = ev.Actor; + + if (!_actionBlockerSystem.CanInteract(user, ev.Target)) { ev.Cancel(); return; @@ -1145,6 +1150,21 @@ namespace Content.Shared.Interaction RaiseLocalEvent(uidA, new ContactInteractionEvent(uidB.Value)); 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; + } + } } /// diff --git a/Content.Shared/Paper/SharedPaperComponent.cs b/Content.Shared/Paper/SharedPaperComponent.cs index dd87f9f907..f65a599e53 100644 --- a/Content.Shared/Paper/SharedPaperComponent.cs +++ b/Content.Shared/Paper/SharedPaperComponent.cs @@ -1,8 +1,10 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Paper; +[NetworkedComponent] public abstract partial class SharedPaperComponent : Component { /// diff --git a/Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs b/Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs new file mode 100644 index 0000000000..af193c8dfc --- /dev/null +++ b/Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Power.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ActivatableUIRequiresPowerComponent : Component +{ +} diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 3bec0e1d01..4670f2dbf8 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -2,9 +2,12 @@ using System.Collections.Frozen; 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; @@ -29,6 +32,7 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; +using Robust.Shared.Utility; namespace Content.Shared.Storage.EntitySystems; @@ -36,6 +40,7 @@ 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!; @@ -73,6 +78,7 @@ public abstract class SharedStorageSystem : EntitySystem private FrozenDictionary _nextSmallest = FrozenDictionary.Empty; private const string QuickInsertUseDelayID = "quickInsert"; + private const string OpenUiUseDelayID = "storage"; protected readonly List CantFillReasons = []; @@ -86,7 +92,13 @@ public abstract class SharedStorageSystem : EntitySystem _xformQuery = GetEntityQuery(); _prototype.PrototypesReloaded += OnPrototypesReloaded; + Subs.BuiEvents(StorageComponent.StorageUiKey.Key, subs => + { + subs.Event(OnBoundUIClosed); + }); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent>(AddUiVerb); SubscribeLocalEvent(OnStorageGetState); SubscribeLocalEvent(OnStorageHandleState); SubscribeLocalEvent(OnComponentInit, before: new[] { typeof(SharedContainerSystem) }); @@ -121,10 +133,13 @@ public abstract class SharedStorageSystem : EntitySystem UpdatePrototypeCache(); } - protected virtual void OnMapInit(Entity entity, ref MapInitEvent args) + private void OnMapInit(Entity entity, ref MapInitEvent args) { if (TryComp(entity, out var useDelayComp)) + { UseDelay.SetLength((entity, useDelayComp), entity.Comp.QuickInsertCooldown, QuickInsertUseDelayID); + UseDelay.SetLength((entity, useDelayComp), entity.Comp.OpenUiCooldown, OpenUiUseDelayID); + } } private void OnStorageGetState(EntityUid uid, StorageComponent component, ref ComponentGetState args) @@ -139,7 +154,6 @@ public abstract class SharedStorageSystem : EntitySystem args.State = new StorageComponentState() { Grid = new List(component.Grid), - IsUiOpen = component.IsUiOpen, MaxItemSize = component.MaxItemSize, StoredItems = storedItems, SavedLocations = component.SavedLocations @@ -153,7 +167,6 @@ public abstract class SharedStorageSystem : EntitySystem component.Grid.Clear(); component.Grid.AddRange(state.Grid); - component.IsUiOpen = state.IsUiOpen; component.MaxItemSize = state.MaxItemSize; component.StoredItems.Clear(); @@ -205,9 +218,108 @@ public abstract class SharedStorageSystem : EntitySystem UpdateAppearance((uid, storageComp, null)); } - public virtual void UpdateUI(Entity entity) {} + /// + /// If the user has nested-UIs open (e.g., PDA UI open when pda is in a backpack), close them. + /// + private void CloseNestedInterfaces(EntityUid uid, EntityUid actor, StorageComponent? storageComp = null) + { + if (!Resolve(uid, ref storageComp)) + return; - public virtual void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false) { } + // for each containing thing + // if it has a storage comp + // ensure unsubscribe from session + // if it has a ui component + // close ui + foreach (var entity in storageComp.Container.ContainedEntities) + { + _ui.CloseUis(entity, actor); + } + } + + private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundUIClosedEvent args) + { + CloseNestedInterfaces(uid, args.Actor, storageComp); + + // If UI is closed for everyone + if (!_ui.IsUiOpen(uid, args.UiKey)) + { + UpdateAppearance((uid, storageComp, null)); + Audio.PlayPredicted(storageComp.StorageCloseSound, uid, args.Actor); + } + } + + 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); + + // Does this player currently have the storage UI open? + var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User); + + ActivationVerb verb = new() + { + Act = () => + { + if (uiOpen) + { + _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, args.User); + } + else + { + OpenStorageUI(uid, args.User, component, silent); + } + } + }; + + if (uiOpen) + { + verb.Text = Loc.GetString("comp-storage-verb-close-storage"); + verb.Icon = new SpriteSpecifier.Texture( + new("/Textures/Interface/VerbIcons/close.svg.192dpi.png")); + } + else + { + verb.Text = Loc.GetString("comp-storage-verb-open-storage"); + verb.Icon = new SpriteSpecifier.Texture( + new("/Textures/Interface/VerbIcons/open.svg.192dpi.png")); + } + args.Verbs.Add(verb); + } + + /// + /// 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) + { + 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 (!silent) + { + if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key)) + Audio.PlayPredicted(storageComp.StorageOpenSound, uid, entity); + + if (useDelay != null) + UseDelay.TryResetDelay((uid, useDelay)); + } + + _ui.OpenUi(uid, StorageComponent.StorageUiKey.Key, entity); + } + + public virtual void UpdateUI(Entity entity) {} private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerbsEvent args) { @@ -261,7 +373,16 @@ public abstract class SharedStorageSystem : EntitySystem if (args.Handled || TryComp(uid, out var lockComponent) && lockComponent.Locked) return; - OpenStorageUI(uid, args.User, storageComp); + // Toggle + if (_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User)) + { + _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, args.User); + } + else + { + OpenStorageUI(uid, args.User, storageComp); + } + args.Handled = true; } @@ -460,8 +581,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(uid, out var storageComp)) return; - if (!_ui.TryGetUi(uid, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(entity)) @@ -503,8 +623,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(storageEnt, out var storageComp)) return; - if (!_ui.TryGetUi(storageEnt, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(itemEnt)) @@ -530,8 +649,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(storageEnt, out var storageComp)) return; - if (!_ui.TryGetUi(storageEnt, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(itemEnt)) @@ -558,8 +676,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(storageEnt, out var storageComp)) return; - if (!_ui.TryGetUi(storageEnt, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(itemEnt)) @@ -584,11 +701,10 @@ public abstract class SharedStorageSystem : EntitySystem var storage = GetEntity(msg.Storage); var item = GetEntity(msg.Item); - if (!TryComp(storage, out var storageComp)) + if (!HasComp(storage)) return; - if (!_ui.TryGetUi(storage, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storage, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(item)) @@ -605,11 +721,7 @@ public abstract class SharedStorageSystem : EntitySystem private void OnBoundUIOpen(EntityUid uid, StorageComponent storageComp, BoundUIOpenedEvent args) { - if (!storageComp.IsUiOpen) - { - storageComp.IsUiOpen = true; - UpdateAppearance((uid, storageComp, null)); - } + UpdateAppearance((uid, storageComp, null)); } private void OnEntInserted(Entity entity, ref EntInsertedIntoContainerMessage args) @@ -687,11 +799,13 @@ public abstract class SharedStorageSystem : EntitySystem var capacity = storage.Grid.GetArea(); var used = GetCumulativeItemAreas((uid, storage)); + var isOpen = _ui.IsUiOpen(entity.Owner, StorageComponent.StorageUiKey.Key); + _appearance.SetData(uid, StorageVisuals.StorageUsed, used, appearance); _appearance.SetData(uid, StorageVisuals.Capacity, capacity, appearance); - _appearance.SetData(uid, StorageVisuals.Open, storage.IsUiOpen, appearance); - _appearance.SetData(uid, SharedBagOpenVisuals.BagState, storage.IsUiOpen ? SharedBagState.Open : SharedBagState.Closed, appearance); - _appearance.SetData(uid, StackVisuals.Hide, !storage.IsUiOpen, appearance); + _appearance.SetData(uid, StorageVisuals.Open, isOpen, appearance); + _appearance.SetData(uid, SharedBagOpenVisuals.BagState, isOpen ? SharedBagState.Open : SharedBagState.Closed, appearance); + _appearance.SetData(uid, StackVisuals.Hide, !isOpen, appearance); } /// @@ -1343,8 +1457,6 @@ public abstract class SharedStorageSystem : EntitySystem [Serializable, NetSerializable] protected sealed class StorageComponentState : ComponentState { - public bool IsUiOpen; - public Dictionary StoredItems = new(); public Dictionary> SavedLocations = new(); diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index 43a93e4b0f..ef682dd4f9 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -19,10 +19,6 @@ namespace Content.Shared.Storage { public static string ContainerId = "storagebase"; - // TODO: This fucking sucks - [ViewVariables(VVAccess.ReadWrite), DataField] - public bool IsUiOpen; - [ViewVariables] public Container Container = default!; @@ -232,15 +228,6 @@ namespace Content.Shared.Storage } } - /// - /// An extra BUI message that either opens, closes, or focuses the storage window based on context. - /// - [Serializable, NetSerializable] - public sealed class StorageModifyWindowMessage : BoundUserInterfaceMessage - { - - } - [NetSerializable] [Serializable] public enum StorageVisuals : byte diff --git a/Content.Server/UserInterface/ActivatableUIComponent.cs b/Content.Shared/UserInterface/ActivatableUIComponent.cs similarity index 87% rename from Content.Server/UserInterface/ActivatableUIComponent.cs rename to Content.Shared/UserInterface/ActivatableUIComponent.cs index cc0e5008e4..74e6134932 100644 --- a/Content.Server/UserInterface/ActivatableUIComponent.cs +++ b/Content.Shared/UserInterface/ActivatableUIComponent.cs @@ -1,16 +1,14 @@ using Content.Shared.Whitelist; -using Robust.Server.GameObjects; -using Robust.Server.Player; -using Robust.Shared.Player; +using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations; -namespace Content.Server.UserInterface +namespace Content.Shared.UserInterface { - [RegisterComponent] + [RegisterComponent, NetworkedComponent] public sealed partial class ActivatableUIComponent : Component { - [DataField(required: true, customTypeSerializer:typeof(EnumSerializer))] - public Enum? Key { get; set; } + [DataField(required: true, customTypeSerializer: typeof(EnumSerializer))] + public Enum Key { get; set; } = default!; [ViewVariables(VVAccess.ReadWrite)] [DataField] @@ -70,6 +68,6 @@ namespace Content.Server.UserInterface /// NOTE: DO NOT DIRECTLY SET, USE ActivatableUISystem.SetCurrentSingleUser /// [ViewVariables] - public ICommonSession? CurrentSingleUser; + public EntityUid? CurrentSingleUser; } } diff --git a/Content.Shared/UserInterface/ActivatableUIEvents.cs b/Content.Shared/UserInterface/ActivatableUIEvents.cs index 6e6b3f63c6..338673a3ca 100644 --- a/Content.Shared/UserInterface/ActivatableUIEvents.cs +++ b/Content.Shared/UserInterface/ActivatableUIEvents.cs @@ -24,12 +24,12 @@ public sealed class UserOpenActivatableUIAttemptEvent : CancellableEntityEventAr public sealed class AfterActivatableUIOpenEvent : EntityEventArgs { public EntityUid User { get; } - public readonly ICommonSession Session; + public readonly EntityUid Actor; - public AfterActivatableUIOpenEvent(EntityUid who, ICommonSession session) + public AfterActivatableUIOpenEvent(EntityUid who, EntityUid actor) { User = who; - Session = session; + Actor = actor; } } diff --git a/Content.Server/UserInterface/ActivatableUIRequiresPowerCellComponent.cs b/Content.Shared/UserInterface/ActivatableUIRequiresPowerCellComponent.cs similarity index 65% rename from Content.Server/UserInterface/ActivatableUIRequiresPowerCellComponent.cs rename to Content.Shared/UserInterface/ActivatableUIRequiresPowerCellComponent.cs index fdc56f89a0..aa9e561e07 100644 --- a/Content.Server/UserInterface/ActivatableUIRequiresPowerCellComponent.cs +++ b/Content.Shared/UserInterface/ActivatableUIRequiresPowerCellComponent.cs @@ -1,13 +1,12 @@ -using Content.Server.PowerCell; using Content.Shared.PowerCell; -using Content.Shared.UserInterface; +using Robust.Shared.GameStates; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; /// /// Specifies that the attached entity requires power. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class ActivatableUIRequiresPowerCellComponent : Component { diff --git a/Content.Server/UserInterface/ActivatableUISystem.Power.cs b/Content.Shared/UserInterface/ActivatableUISystem.Power.cs similarity index 82% rename from Content.Server/UserInterface/ActivatableUISystem.Power.cs rename to Content.Shared/UserInterface/ActivatableUISystem.Power.cs index d4dcc91d46..c904224328 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.Power.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.Power.cs @@ -1,13 +1,11 @@ -using Content.Server.PowerCell; using Content.Shared.PowerCell; -using Content.Shared.UserInterface; using Robust.Shared.Containers; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; public sealed partial class ActivatableUISystem { - [Dependency] private readonly PowerCellSystem _cell = default!; + [Dependency] private readonly SharedPowerCellSystem _cell = default!; private void InitializePower() { @@ -23,10 +21,9 @@ public sealed partial class ActivatableUISystem _cell.SetPowerCellDrawEnabled(uid, false); if (HasComp(uid) && - TryComp(uid, out var activatable) && - activatable.Key != null) + TryComp(uid, out var activatable)) { - _uiSystem.TryCloseAll(uid, activatable.Key); + _uiSystem.CloseUi(uid, activatable.Key); } } @@ -57,13 +54,13 @@ public sealed partial class ActivatableUISystem /// public void CheckUsage(EntityUid uid, ActivatableUIComponent? active = null, ActivatableUIRequiresPowerCellComponent? component = null, PowerCellDrawComponent? draw = null) { - if (!Resolve(uid, ref component, ref draw, ref active, false) || active.Key == null) + if (!Resolve(uid, ref component, ref draw, ref active, false)) return; - if (_cell.HasCharge(uid, draw.UseRate)) + if (_cell.HasActivatableCharge(uid)) return; - _uiSystem.TryCloseAll(uid, active.Key); + _uiSystem.CloseUi(uid, active.Key); } private void OnBatteryOpenAttempt(EntityUid uid, ActivatableUIRequiresPowerCellComponent component, ActivatableUIOpenAttemptEvent args) @@ -72,10 +69,11 @@ public sealed partial class ActivatableUISystem return; // Check if we have the appropriate drawrate / userate to even open it. - if (args.Cancelled || !_cell.HasCharge(uid, MathF.Max(draw.DrawRate, draw.UseRate), user: args.User)) + if (args.Cancelled || + !_cell.HasActivatableCharge(uid, draw, user: args.User) || + !_cell.HasDrawCharge(uid, draw, user: args.User)) { args.Cancel(); - return; } } } diff --git a/Content.Server/UserInterface/ActivatableUISystem.cs b/Content.Shared/UserInterface/ActivatableUISystem.cs similarity index 81% rename from Content.Server/UserInterface/ActivatableUISystem.cs rename to Content.Shared/UserInterface/ActivatableUISystem.cs index 5f2314df90..bfe8491b15 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.cs @@ -1,23 +1,21 @@ -using Content.Server.Administration.Managers; using Content.Shared.ActionBlocker; +using Content.Shared.Administration.Managers; using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Popups; -using Content.Shared.UserInterface; using Content.Shared.Verbs; -using Robust.Server.GameObjects; using Robust.Shared.Player; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; public sealed partial class ActivatableUISystem : EntitySystem { - [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly ISharedAdminManager _adminManager = default!; [Dependency] private readonly ActionBlockerSystem _blockerSystem = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; public override void Initialize() @@ -49,7 +47,7 @@ public sealed partial class ActivatableUISystem : EntitySystem if (!comp.RequireHands) return; - if (!TryComp(ev.Sender.AttachedEntity, out HandsComponent? hands) || hands.Hands.Count == 0) + if (!TryComp(ev.Actor, out HandsComponent? hands) || hands.Hands.Count == 0) ev.Cancel(); } @@ -128,7 +126,9 @@ public sealed partial class ActivatableUISystem : EntitySystem private void OnUIClose(EntityUid uid, ActivatableUIComponent component, BoundUIClosedEvent args) { - if (args.Session != component.CurrentSingleUser) + var user = args.Actor; + + if (user != component.CurrentSingleUser) return; if (!Equals(args.UiKey, component.Key)) @@ -139,18 +139,12 @@ public sealed partial class ActivatableUISystem : EntitySystem private bool InteractUI(EntityUid user, EntityUid uiEntity, ActivatableUIComponent aui) { - if (!TryComp(user, out ActorComponent? actor)) + if (!_uiSystem.HasUi(uiEntity, aui.Key)) return false; - if (aui.Key == null) - return false; - - if (!_uiSystem.TryGetUi(uiEntity, aui.Key, out var ui)) - return false; - - if (ui.SubscribedSessions.Contains(actor.PlayerSession)) + if (_uiSystem.IsUiOpen(uiEntity, aui.Key, user)) { - _uiSystem.CloseUi(ui, actor.PlayerSession); + _uiSystem.CloseUi(uiEntity, aui.Key, user); return true; } @@ -160,10 +154,10 @@ public sealed partial class ActivatableUISystem : EntitySystem if (aui.RequireHands && !HasComp(user)) return false; - if (aui.AdminOnly && !_adminManager.IsAdmin(actor.PlayerSession)) + if (aui.AdminOnly && !_adminManager.IsAdmin(user)) return false; - if (aui.SingleUser && (aui.CurrentSingleUser != null) && (actor.PlayerSession != aui.CurrentSingleUser)) + if (aui.SingleUser && aui.CurrentSingleUser != null && user != aui.CurrentSingleUser) { string message = Loc.GetString("machine-already-in-use", ("machine", uiEntity)); _popupSystem.PopupEntity(message, uiEntity, user); @@ -171,7 +165,7 @@ public sealed partial class ActivatableUISystem : EntitySystem // If we get here, supposedly, the object is in use. // Check with BUI that it's ACTUALLY in use just in case. // Since this could brick the object if it goes wrong. - if (ui.SubscribedSessions.Count != 0) + if (_uiSystem.IsUiOpen(uiEntity, aui.Key)) return false; } @@ -189,24 +183,25 @@ public sealed partial class ActivatableUISystem : EntitySystem var bae = new BeforeActivatableUIOpenEvent(user); RaiseLocalEvent(uiEntity, bae); - SetCurrentSingleUser(uiEntity, actor.PlayerSession, aui); - _uiSystem.OpenUi(ui, actor.PlayerSession); + SetCurrentSingleUser(uiEntity, user, aui); + _uiSystem.OpenUi(uiEntity, aui.Key, user); //Let the component know a user opened it so it can do whatever it needs to do - var aae = new AfterActivatableUIOpenEvent(user, actor.PlayerSession); + var aae = new AfterActivatableUIOpenEvent(user, user); RaiseLocalEvent(uiEntity, aae); return true; } - public void SetCurrentSingleUser(EntityUid uid, ICommonSession? v, ActivatableUIComponent? aui = null) + public void SetCurrentSingleUser(EntityUid uid, EntityUid? user, ActivatableUIComponent? aui = null) { if (!Resolve(uid, ref aui)) return; + if (!aui.SingleUser) return; - aui.CurrentSingleUser = v; + aui.CurrentSingleUser = user; RaiseLocalEvent(uid, new ActivatableUIPlayerChangedEvent()); } @@ -216,10 +211,10 @@ public sealed partial class ActivatableUISystem : EntitySystem if (!Resolve(uid, ref aui, false)) return; - if (aui.Key == null || !_uiSystem.TryGetUi(uid, aui.Key, out var ui)) + if (!_uiSystem.HasUi(uid, aui.Key)) return; - _uiSystem.CloseAll(ui); + _uiSystem.CloseUi(uid, aui.Key); } private void OnHandDeselected(EntityUid uid, ActivatableUIComponent? aui, HandDeselectedEvent args) diff --git a/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml b/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml index e13070d1ba..4893fa2557 100644 --- a/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml +++ b/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml @@ -19,7 +19,7 @@ key: enum.PaperUiKey.Key - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: Paper content: book-text-holoparasite-info diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index a69c770f40..5d9fc64e12 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -23,8 +23,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface # to prevent bag open/honk spam - type: UseDelay delay: 0.5 @@ -267,7 +267,7 @@ - type: Sprite sprite: Clothing/Back/Backpacks/syndicate.rsi - type: ExplosionResistance - damageCoefficient: 0.1 + damageCoefficient: 0.1 #Special - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Back/specific.yml b/Resources/Prototypes/Entities/Clothing/Back/specific.yml index 8af00039b5..fcdecffc8f 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/specific.yml @@ -14,9 +14,9 @@ default: ClothingBackpack - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key + enum.StorageUiKey.Key: type: StorageBoundUserInterface - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: entity @@ -51,8 +51,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: DrawableSolution solution: tank - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml index 703730daf3..76af5067ae 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml @@ -36,8 +36,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/Ears/specific.yml b/Resources/Prototypes/Entities/Clothing/Ears/specific.yml index 093f5e645b..83612ac4b2 100644 --- a/Resources/Prototypes/Entities/Clothing/Ears/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Ears/specific.yml @@ -16,5 +16,5 @@ default: ClothingHeadsetGrey - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml b/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml index c04f348287..fa87ed398e 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml @@ -16,6 +16,6 @@ default: ClothingEyesGlassesSunglasses - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index 96bdd61f94..02ec58bd67 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -377,7 +377,7 @@ - type: Actions - type: UserInterface interfaces: - - key: enum.MeleeSpeechUiKey.Key + enum.MeleeSpeechUiKey.Key: type: MeleeSpeechBoundUserInterface - type: StaticPrice price: 0 diff --git a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml index e6a5731999..6140bcd8ed 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml @@ -19,9 +19,9 @@ - type: FingerprintMask - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - + - type: entity parent: ClothingHandsChameleon id: ClothingHandsChameleonThief diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index ec0921c512..a844fd724a 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -245,7 +245,7 @@ - 0,0,0,0 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key + enum.StorageUiKey.Key: type: StorageBoundUserInterface - type: ContainerContainer containers: @@ -834,8 +834,8 @@ - 0,0,0,0 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Clothing/Head/specific.yml b/Resources/Prototypes/Entities/Clothing/Head/specific.yml index 1dd36bff94..636f922d85 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/specific.yml @@ -16,5 +16,5 @@ default: ClothingHeadHatBeret - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml index 0a0fc68469..7f758a27d2 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml @@ -18,7 +18,7 @@ - type: IdentityBlocker # need that for default ClothingMaskGas - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: HideLayerClothing slots: diff --git a/Resources/Prototypes/Entities/Clothing/Neck/specific.yml b/Resources/Prototypes/Entities/Clothing/Neck/specific.yml index 1f50dc1ef1..56fddceaad 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/specific.yml @@ -16,5 +16,5 @@ default: ClothingNeckScarfStripedRed - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 987d3c2f24..e5067e84c5 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -38,8 +38,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: StaticPrice price: 70 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml index 9be8c22a0a..c3d9bb1224 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml @@ -16,5 +16,5 @@ default: ClothingOuterVest - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml index 880239b51e..485d530ea5 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml @@ -110,7 +110,7 @@ key: enum.SharedGasTankUiKey.Key - type: UserInterface interfaces: - - key: enum.SharedGasTankUiKey.Key + enum.SharedGasTankUiKey.Key: type: GasTankBoundUserInterface - type: Explosive explosionType: Default diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index 987eda582e..4ae752345a 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -185,7 +185,7 @@ default: ClothingShoesColorBlack - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml index ad02f4aa67..a2c903bac3 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml @@ -38,5 +38,5 @@ default: ClothingUniformJumpsuitColorBlack - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key - type: ChameleonBoundUserInterface \ No newline at end of file + enum.ChameleonUiKey.Key: + type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 9907c5f71f..27a19ab899 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -63,12 +63,12 @@ locPrefix: silicon - type: UserInterface interfaces: - - key: enum.SiliconLawsUiKey.Key - type: SiliconLawBoundUserInterface - - key: enum.BorgUiKey.Key - type: BorgBoundUserInterface - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.SiliconLawsUiKey.Key: + type: SiliconLawBoundUserInterface + enum.BorgUiKey.Key: + type: BorgBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: ActivatableUI key: enum.BorgUiKey.Key - type: SiliconLawBound diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 819c7beacf..c0a99ec8a0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1077,8 +1077,8 @@ - id: FoodMeat - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -1169,8 +1169,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: Sprite drawdepth: Mobs layers: @@ -2283,8 +2283,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2358,8 +2358,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2422,8 +2422,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2499,8 +2499,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2648,8 +2648,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2857,8 +2857,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2914,8 +2914,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -3007,8 +3007,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -3124,8 +3124,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -3188,8 +3188,8 @@ bloodMaxVolume: 60 - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml index 8a10337c94..6aea0e89b0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml @@ -76,8 +76,8 @@ - id: BikeHorn - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: MobThresholds thresholds: 0: Alive diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 747268466a..f6cf36196f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -211,8 +211,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -274,8 +274,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -373,8 +373,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index 68ebf52dc0..83d3dbd069 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -75,8 +75,8 @@ softness: 1 - type: UserInterface interfaces: - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface - type: Visibility layer: 2 #ghost vis layer - type: Store diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 9a4d4ec3aa..c808ed2d21 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -300,8 +300,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: Sprite layers: - map: ["enum.DamageStateVisualLayers.Base"] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index eeee640225..8cfd199dca 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -171,8 +171,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: entity id: MobKangarooSpaceSalvage diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index af18791fa7..38092e3aa7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -34,32 +34,32 @@ - CentralCommand - type: UserInterface interfaces: - - key: enum.SolarControlConsoleUiKey.Key + enum.SolarControlConsoleUiKey.Key: type: SolarControlConsoleBoundUserInterface - - key: enum.CommunicationsConsoleUiKey.Key + enum.CommunicationsConsoleUiKey.Key: type: CommunicationsConsoleBoundUserInterface - - key: enum.RadarConsoleUiKey.Key + enum.RadarConsoleUiKey.Key: type: RadarConsoleBoundUserInterface - - key: enum.CargoConsoleUiKey.Orders + enum.CargoConsoleUiKey.Orders: type: CargoOrderConsoleBoundUserInterface - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: type: CrewMonitoringBoundUserInterface - - key: enum.GeneralStationRecordConsoleKey.Key - # who the fuck named this bruh + enum.GeneralStationRecordConsoleKey.Key: + # who the fuck named this bruh type: GeneralStationRecordConsoleBoundUserInterface - type: IntrinsicUI uis: - - key: enum.SolarControlConsoleUiKey.Key + enum.SolarControlConsoleUiKey.Key: toggleAction: ActionAGhostShowSolar - - key: enum.CommunicationsConsoleUiKey.Key + enum.CommunicationsConsoleUiKey.Key: toggleAction: ActionAGhostShowCommunications - - key: enum.RadarConsoleUiKey.Key + enum.RadarConsoleUiKey.Key: toggleAction: ActionAGhostShowRadar - - key: enum.CargoConsoleUiKey.Orders + enum.CargoConsoleUiKey.Orders: toggleAction: ActionAGhostShowCargo - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: toggleAction: ActionAGhostShowCrewMonitoring - - key: enum.GeneralStationRecordConsoleKey.Key + enum.GeneralStationRecordConsoleKey.Key: toggleAction: ActionAGhostShowStationRecords - type: SolarControlConsole # look ma i AM the computer! - type: CommunicationsConsole diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index ae4a370f9d..26c0ae30ec 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -95,8 +95,8 @@ - type: MeleeSpeech - type: UserInterface interfaces: - - key: enum.MeleeSpeechUiKey.Key - type: MeleeSpeechBoundUserInterface + enum.MeleeSpeechUiKey.Key: + type: MeleeSpeechBoundUserInterface - type: Actions - type: Guardian - type: InteractionPopup diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index cf04d82b50..01b938ffa8 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -192,11 +192,11 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.VoiceMaskUIKey.Key + enum.VoiceMaskUIKey.Key: type: VoiceMaskBoundUserInterface - - key: enum.HumanoidMarkingModifierKey.Key + enum.HumanoidMarkingModifierKey.Key: type: HumanoidMarkingModifierBoundUserInterface - - key: enum.StrippingUiKey.Key + enum.StrippingUiKey.Key: type: StrippableBoundUserInterface - type: Puller - type: Speech @@ -372,5 +372,5 @@ requiredLegs: 2 - type: UserInterface interfaces: - - key: enum.HumanoidMarkingModifierKey.Key # sure, this can go here too + enum.HumanoidMarkingModifierKey.Key: # sure, this can go here too type: HumanoidMarkingModifierBoundUserInterface diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index de2f88e59d..081973c3d2 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -26,14 +26,14 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - key: enum.VoiceMaskUIKey.Key - type: VoiceMaskBoundUserInterface - - key: enum.HumanoidMarkingModifierKey.Key - type: HumanoidMarkingModifierBoundUserInterface - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.VoiceMaskUIKey.Key: + type: VoiceMaskBoundUserInterface + enum.HumanoidMarkingModifierKey.Key: + type: HumanoidMarkingModifierBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface # to prevent bag open/honk spam - type: UseDelay delay: 0.5 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index e8ae787636..a729eed9c8 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -33,8 +33,8 @@ solution: drink - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: entity parent: DrinkBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index ca67e51792..5d092673ed 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -21,8 +21,8 @@ maxTransferAmount: 15 - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Sprite state: icon layers: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml index 763c4210ae..156cd5a767 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml @@ -25,8 +25,8 @@ maxTransferAmount: 10 - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Drink - type: Sprite state: icon diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml index 829d68279d..ad2e760141 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml @@ -29,8 +29,8 @@ state: icon - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: PhysicalComposition materialComposition: Steel: 50 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index 67154963d1..a6b14d722d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -39,8 +39,8 @@ solution: drink - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: DamageOnLand damage: types: @@ -122,8 +122,8 @@ solution: drink - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml index 70303cfdff..40cb141af7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml @@ -37,8 +37,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml index 670b556e35..ada46c5d02 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml @@ -21,5 +21,5 @@ - DoorElectronicsConfigurator - type: UserInterface interfaces: - - key: enum.DoorElectronicsConfigurationUiKey.Key - type: DoorElectronicsBoundUserInterface + enum.DoorElectronicsConfigurationUiKey.Key: + type: DoorElectronicsBoundUserInterface diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml index 08e96d1de2..c0ce4cba18 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml @@ -18,7 +18,7 @@ key: enum.WarDeclaratorUiKey.Key - type: UserInterface interfaces: - - key: enum.WarDeclaratorUiKey.Key + enum.WarDeclaratorUiKey.Key: type: WarDeclaratorBoundUserInterface - type: WarDeclarator message: war-declarator-default-message diff --git a/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml b/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml index 7436ae7c98..e7c0b14beb 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml @@ -20,8 +20,8 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.ForensicScannerUiKey.Key - type: ForensicScannerBoundUserInterface + enum.ForensicScannerUiKey.Key: + type: ForensicScannerBoundUserInterface - type: ForensicScanner - type: GuideHelp guides: diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 73976b48e0..e1efc03993 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -89,16 +89,16 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.PdaUiKey.Key - type: PdaBoundUserInterface - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface - - key: enum.RingerUiKey.Key - type: RingerBoundUserInterface - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.HealthAnalyzerUiKey.Key - type: HealthAnalyzerBoundUserInterface + enum.PdaUiKey.Key: + type: PdaBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface + enum.RingerUiKey.Key: + type: RingerBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.HealthAnalyzerUiKey.Key: + type: HealthAnalyzerBoundUserInterface - type: Tag tags: - DoorBumpOpener diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml index fa9071d3e9..b4e336b37d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml @@ -30,8 +30,8 @@ singleUser: true - type: UserInterface interfaces: - - key: enum.NavMapBeaconUiKey.Key - type: NavMapBeaconBoundUserInterface + enum.NavMapBeaconUiKey.Key: + type: NavMapBeaconBoundUserInterface - type: Item size: Small - type: SubFloorHide diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_map.yml b/Resources/Prototypes/Entities/Objects/Devices/station_map.yml index c37d8935f3..0d2f890a1d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_map.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_map.yml @@ -28,7 +28,7 @@ acts: [ "Destruction" ] - type: UserInterface interfaces: - - key: enum.StationMapUiKey.Key + enum.StationMapUiKey.Key: type: StationMapBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml index 07d918b576..684260b737 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml @@ -13,8 +13,8 @@ key: enum.InstrumentUiKey.Key - type: UserInterface interfaces: - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface - type: Item size: Normal - type: StaticPrice @@ -51,8 +51,8 @@ acts: ["Destruction"] - type: UserInterface interfaces: - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml b/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml index d8f11cdea2..63175dc89a 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml @@ -36,8 +36,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface # to prevent bag open/honk spam - type: UseDelay delay: 0.5 diff --git a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml index cb755b161a..4aab2efdb9 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml @@ -18,8 +18,8 @@ - type: SpaceGarbage - type: UserInterface interfaces: - - key: enum.CrayonUiKey.Key - type: CrayonBoundUserInterface + enum.CrayonUiKey.Key: + type: CrayonBoundUserInterface - type: Crayon capacity: 15 - type: Food diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 537562f461..df8f487240 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -13,10 +13,10 @@ program: 2 - type: UserInterface interfaces: - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.StationMapUiKey.Key - type: UntrackedStationMapBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.StationMapUiKey.Key: + type: UntrackedStationMapBoundUserInterface - type: Sprite sprite: Objects/Fun/pai.rsi layers: diff --git a/Resources/Prototypes/Entities/Objects/Misc/books.yml b/Resources/Prototypes/Entities/Objects/Misc/books.yml index 78f9edc9c5..e44e981a6c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/books.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/books.yml @@ -25,8 +25,8 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: Tag tags: - Book @@ -49,7 +49,7 @@ color: "#0a2a6b" - state: decor_wingette color: "#082561" - - state: icon_text + - state: icon_text color: gold - state: icon_planet color: "#42b6f5" @@ -361,7 +361,7 @@ description: Each book is unique! What is hidden in this one? components: - type: RandomMetadata - nameSegments: + nameSegments: - book_hint_appearance - book_type - type: RandomSprite @@ -410,7 +410,7 @@ icon_skull: "" icon_text: "" icon_text2: "" - icon_text3: "" + icon_text3: "" overlay: overlay_blood: "" overlay_dirt: Sixteen @@ -451,7 +451,7 @@ - book_story_element_trait - "." storySeparator: "" - + - type: entity parent: BookBase id: BookAtmosDistro @@ -530,4 +530,4 @@ - state: icon_corner color: gold - type: Paper - content: book-text-atmos-vents \ No newline at end of file + content: book-text-atmos-vents diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index b44b71930f..3de1afe8b8 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -658,9 +658,9 @@ default: PassengerIDCard - type: UserInterface interfaces: - - key: enum.AgentIDCardUiKey.Key + enum.AgentIDCardUiKey.Key: type: AgentIDCardBoundUserInterface - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 0c52b2381c..08e5e3caaf 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -22,8 +22,8 @@ requireHands: false - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: Item size: Tiny - type: Tag @@ -264,8 +264,8 @@ key: enum.PaperUiKey.Key - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: entity parent: Paper @@ -695,10 +695,10 @@ key: enum.CargoConsoleUiKey.Orders - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Orders - type: CargoOrderConsoleBoundUserInterface - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.CargoConsoleUiKey.Orders: + type: CargoOrderConsoleBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: MeleeWeapon wideAnimationRotation: 180 damage: diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index 2336945f17..a0f5e254d5 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -126,7 +126,7 @@ ents: [ ] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key + enum.StorageUiKey.Key: type: StorageBoundUserInterface - type: entity @@ -160,8 +160,8 @@ Telecrystal: 0 - type: UserInterface interfaces: - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface - type: entity parent: BaseSubdermalImplant diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index b4f95d81e5..f6b2b0a70c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -40,8 +40,8 @@ - 0,0,0,1 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Tag tags: - Book diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml index 706407b8a6..55a58ef18a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml @@ -9,11 +9,11 @@ - 0,0,0,1 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Sprite sprite: Objects/Specific/Chapel/chaplainurn.rsi state: icon - type: Item size: Normal - sprite: Objects/Specific/Chapel/chaplainurn.rsi \ No newline at end of file + sprite: Objects/Specific/Chapel/chaplainurn.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml b/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml index 0894d6a754..ca74dca8a7 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml @@ -44,8 +44,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Storage maxItemSize: Normal grid: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index 6e5362d9bb..dab6f9f20f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -39,8 +39,8 @@ doAfterDelay: 10 - type: UserInterface interfaces: - - key: enum.MechUiKey.Key - type: MechBoundUserInterface + enum.MechUiKey.Key: + type: MechBoundUserInterface - type: MeleeWeapon hidden: true attackRate: 0.75 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml index 6dfe039cc0..f30e1cf633 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml @@ -20,7 +20,7 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: type: CrewMonitoringBoundUserInterface - type: CrewMonitoringConsole - type: DeviceNetwork diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index 64bd04569b..4f8b6f2936 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -20,7 +20,7 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.HealthAnalyzerUiKey.Key + enum.HealthAnalyzerUiKey.Key: type: HealthAnalyzerBoundUserInterface - type: HealthAnalyzer scanningEndSound: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml index b02c7109d3..4250d9ccdd 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml @@ -13,7 +13,7 @@ inHandsOnly: true - type: UserInterface interfaces: - - key: enum.AnomalyScannerUiKey.Key + enum.AnomalyScannerUiKey.Key: type: AnomalyScannerBoundUserInterface - type: AnomalyScanner - type: GuideHelp diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml index e896832e5f..d7b0a566e1 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml @@ -13,8 +13,8 @@ closeOnHandDeselect: true - type: UserInterface interfaces: - - key: enum.MagicMirrorUiKey.Key - type: MagicMirrorBoundUserInterface + enum.MagicMirrorUiKey.Key: + type: MagicMirrorBoundUserInterface - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 1 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml index e5f7a5ec3e..2241cdd4aa 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml @@ -45,14 +45,14 @@ ano01_on: Rainbow - type: UserInterface #needs to be here for certain effects interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.IntercomUiKey.Key - type: IntercomBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.IntercomUiKey.Key: + type: IntercomBoundUserInterface - type: Appearance - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml index 57b3dab921..4c3dac1816 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml @@ -22,14 +22,14 @@ noRot: true - type: UserInterface #needs to be here for certain effects interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.IntercomUiKey.Key - type: IntercomBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.IntercomUiKey.Key: + type: IntercomBoundUserInterface - type: Reactive groups: Acidic: [Touch] diff --git a/Resources/Prototypes/Entities/Objects/Specific/atmos.yml b/Resources/Prototypes/Entities/Objects/Specific/atmos.yml index 0dc714aba0..acf5f6f240 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/atmos.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/atmos.yml @@ -17,8 +17,8 @@ key: enum.GasAnalyzerUiKey.Key - type: UserInterface interfaces: - - key: enum.GasAnalyzerUiKey.Key - type: GasAnalyzerBoundUserInterface + enum.GasAnalyzerUiKey.Key: + type: GasAnalyzerBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml index 8034844a82..4bd71f898d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml @@ -36,7 +36,7 @@ solution: beaker - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key + enum.TransferAmountUiKey.Key: type: TransferAmountBoundUserInterface - type: Drink solution: beaker diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml index 6c81fa9466..3005f6b947 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml @@ -44,8 +44,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Item size: Tiny sprite: Objects/Specific/Chemistry/beaker.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml index 65f5fbb5d0..ed36861bb2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml @@ -50,8 +50,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Item size: Tiny sprite: Objects/Specific/Chemistry/vial.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index fdf58dc484..4989320e6f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -45,8 +45,8 @@ solution: beaker - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Drink solution: beaker - type: Appearance @@ -138,8 +138,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Drink solution: beaker - type: Appearance @@ -276,8 +276,8 @@ solution: dropper - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Spillable solution: injector - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml index aa17685c24..459beeef18 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml @@ -63,8 +63,8 @@ heldPrefix: old-radio - type: UserInterface interfaces: - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface - type: ActivatableUI key: enum.StoreUiKey.Key - type: Store diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 9a367841c4..b6c7c49855 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -62,7 +62,7 @@ doAfter: 0.5 - type: UserInterface interfaces: - - key: enum.AccessOverriderUiKey.Key + enum.AccessOverriderUiKey.Key: type: AccessOverriderBoundUserInterface - type: ActivatableUI key: enum.AccessOverriderUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Tools/bucket.yml b/Resources/Prototypes/Entities/Objects/Tools/bucket.yml index 77803a13ec..77c5e54897 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/bucket.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/bucket.yml @@ -35,8 +35,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: MeleeWeapon soundNoDamage: path: "/Audio/Effects/Fluids/splat.ogg" diff --git a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml index 295412debc..87959ebef3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml @@ -142,8 +142,8 @@ - type: GasAnalyzer - type: UserInterface interfaces: - - key: enum.GasAnalyzerUiKey.Key - type: GasAnalyzerBoundUserInterface + enum.GasAnalyzerUiKey.Key: + type: GasAnalyzerBoundUserInterface - type: Appearance - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 2f281e141a..65942e330e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -19,8 +19,8 @@ key: enum.SharedGasTankUiKey.Key - type: UserInterface interfaces: - - key: enum.SharedGasTankUiKey.Key - type: GasTankBoundUserInterface + enum.SharedGasTankUiKey.Key: + type: GasTankBoundUserInterface - type: GasTank outputPressure: 21.3 air: diff --git a/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml b/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml index 1d9bb47e0e..4b46a93353 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml @@ -17,7 +17,7 @@ inHandsOnly: true - type: UserInterface interfaces: - - key: enum.HandLabelerUiKey.Key + enum.HandLabelerUiKey.Key: type: HandLabelerBoundUserInterface - type: HandLabeler whitelist: diff --git a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml index 5647737219..5938193181 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml @@ -34,7 +34,7 @@ singleUser: true - type: UserInterface interfaces: - - key: enum.RadarConsoleUiKey.Key + enum.RadarConsoleUiKey.Key: type: RadarConsoleBoundUserInterface - type: StaticPrice price: 150 @@ -69,4 +69,4 @@ name: power-cell-slot-component-slot-name-default startingItem: PowerCellMicroreactor disableEject: true - swap: false \ No newline at end of file + swap: false diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index f40f47115b..04f8b9f9f6 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -40,7 +40,7 @@ size: Huge - type: UserInterface interfaces: - - key: enum.SharedGasTankUiKey.Key + enum.SharedGasTankUiKey.Key: type: GasTankBoundUserInterface - type: Clothing sprite: Objects/Tanks/Jetpacks/blue.rsi diff --git a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml index 903b8d3f90..ad31a6ec02 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml @@ -13,8 +13,8 @@ key: enum.SprayPainterUiKey.Key - type: UserInterface interfaces: - - key: enum.SprayPainterUiKey.Key - type: SprayPainterBoundUserInterface + enum.SprayPainterUiKey.Key: + type: SprayPainterBoundUserInterface - type: SprayPainter colorPalette: red: '#FF1212FF' diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 695725140f..0a0c702324 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -167,5 +167,5 @@ key: enum.ThiefBackpackUIKey.Key - type: UserInterface interfaces: - - key: enum.ThiefBackpackUIKey.Key + enum.ThiefBackpackUIKey.Key: type: ThiefBackpackBoundUserInterface diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index b3103816eb..452a905329 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -216,11 +216,11 @@ inHandsOnly: true - type: UserInterface interfaces: - - key: enum.NetworkConfiguratorUiKey.List + enum.NetworkConfiguratorUiKey.List: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Configure + enum.NetworkConfiguratorUiKey.Configure: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Link + enum.NetworkConfiguratorUiKey.Link: type: NetworkConfiguratorBoundUserInterface - type: Tag tags: @@ -272,11 +272,11 @@ - DoorElectronicsConfigurator - type: UserInterface interfaces: - - key: enum.NetworkConfiguratorUiKey.List + enum.NetworkConfiguratorUiKey.List: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Configure + enum.NetworkConfiguratorUiKey.Configure: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Link + enum.NetworkConfiguratorUiKey.Link: type: NetworkConfiguratorBoundUserInterface - type: StaticPrice price: 56 @@ -389,8 +389,8 @@ price: 100 - type: UserInterface interfaces: - - key: enum.RcdUiKey.Key - type: RCDMenuBoundUserInterface + enum.RcdUiKey.Key: + type: RCDMenuBoundUserInterface - type: ActivatableUI key: enum.RcdUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml index e925bdab87..c96a1522d2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml @@ -34,8 +34,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: DrawableSolution solution: chamber - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Objects/base_item.yml b/Resources/Prototypes/Entities/Objects/base_item.yml index 55c4bbd6b7..39bb8c3a2a 100644 --- a/Resources/Prototypes/Entities/Objects/base_item.yml +++ b/Resources/Prototypes/Entities/Objects/base_item.yml @@ -52,8 +52,8 @@ - type: Storage - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml b/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml index d661009b6d..082f5e0799 100644 --- a/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml +++ b/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml @@ -30,8 +30,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ReagentDispenserUiKey.Key - type: ReagentDispenserBoundUserInterface + enum.ReagentDispenserUiKey.Key: + type: ReagentDispenserBoundUserInterface - type: Anchorable - type: Pullable - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 8b2ce8ab56..86657eb46e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -104,8 +104,8 @@ - type: SpawnOnOverload - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Airtight noAirWhenFullyAirBlocked: false - type: RadiationBlocker diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml index 2a8cc0c526..559dca704c 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml @@ -79,8 +79,8 @@ alwaysRandomize: true - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Airtight - type: Occluder - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index a5b8a8dc74..fcdb432dce 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -90,7 +90,7 @@ - type: WiresPanel - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Physics canCollide: false diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 1819c9d0ef..dc2acb7927 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -56,8 +56,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Airtight - type: RadiationBlocker resistance: 2 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index a6515b52c6..1ec6c04ffe 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -66,7 +66,7 @@ damageContainer: Inorganic damageModifierSet: Glass - type: ExaminableDamage - messages: WindowMessages + messages: WindowMessages - type: RCDDeconstructable cost: 8 delay: 8 @@ -130,8 +130,8 @@ layoutId: Airlock - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Appearance - type: WiresVisuals - type: Airtight diff --git a/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml b/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml index 792f076679..30aa793767 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml @@ -59,8 +59,8 @@ - Spellbook - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: InteractionOutline - type: ContainerContainer containers: diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 2caa4010ca..b79c0e6213 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -33,8 +33,8 @@ storagebase: !type:Container - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: InteractionOutline - type: Clickable - type: Tag diff --git a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml index f02b126248..0824d21ae0 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml @@ -66,8 +66,8 @@ price: 25 - type: UserInterface interfaces: - - key: enum.DisposalUnitUiKey.Key - type: DisposalUnitBoundUserInterface + enum.DisposalUnitUiKey.Key: + type: DisposalUnitBoundUserInterface - type: RatKingRummageable - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index 40fa8cf472..6a351d47f0 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -138,9 +138,9 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SpaceVillainArcadeUiKey.Key + enum.SpaceVillainArcadeUiKey.Key: type: SpaceVillainArcadeBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Computer board: SpaceVillainArcadeComputerCircuitboard @@ -182,9 +182,9 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.BlockGameUiKey.Key + enum.BlockGameUiKey.Key: type: BlockGameBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Computer board: BlockGameArcadeComputerCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index ef15f73b32..56570697df 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -31,8 +31,8 @@ key: enum.EmergencyConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.EmergencyConsoleUiKey.Key - type: EmergencyConsoleBoundUserInterface + enum.EmergencyConsoleUiKey.Key: + type: EmergencyConsoleBoundUserInterface - type: PointLight radius: 1.5 energy: 1.6 @@ -52,8 +52,8 @@ key: enum.ShuttleConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.ShuttleConsoleUiKey.Key - type: ShuttleConsoleBoundUserInterface + enum.ShuttleConsoleUiKey.Key: + type: ShuttleConsoleBoundUserInterface - type: RadarConsole - type: WorldLoader radius: 256 @@ -211,8 +211,8 @@ key: enum.IFFConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.IFFConsoleUiKey.Key - type: IFFConsoleBoundUserInterface + enum.IFFConsoleUiKey.Key: + type: IFFConsoleBoundUserInterface - type: Computer board: ComputerIFFCircuitboard @@ -231,8 +231,8 @@ key: enum.IFFConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.IFFConsoleUiKey.Key - type: IFFConsoleBoundUserInterface + enum.IFFConsoleUiKey.Key: + type: IFFConsoleBoundUserInterface - type: Computer board: ComputerIFFSyndicateCircuitboard @@ -271,8 +271,8 @@ key: enum.PowerMonitoringConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.PowerMonitoringConsoleUiKey.Key - type: PowerMonitoringConsoleBoundUserInterface + enum.PowerMonitoringConsoleUiKey.Key: + type: PowerMonitoringConsoleBoundUserInterface - type: entity parent: BaseComputer @@ -306,8 +306,8 @@ - type: CriminalRecordsConsole - type: UserInterface interfaces: - - key: enum.CriminalRecordsConsoleKey.Key - type: CriminalRecordsConsoleBoundUserInterface + enum.CriminalRecordsConsoleKey.Key: + type: CriminalRecordsConsoleBoundUserInterface - type: ActivatableUI key: enum.CriminalRecordsConsoleKey.Key - type: Sprite @@ -341,8 +341,8 @@ - type: GeneralStationRecordConsole - type: UserInterface interfaces: - - key: enum.GeneralStationRecordConsoleKey.Key - type: GeneralStationRecordConsoleBoundUserInterface + enum.GeneralStationRecordConsoleKey.Key: + type: GeneralStationRecordConsoleBoundUserInterface - type: ActivatableUI key: enum.GeneralStationRecordConsoleKey.Key - type: PointLight @@ -381,7 +381,7 @@ key: enum.CrewMonitoringUIKey.Key - type: UserInterface interfaces: - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: type: CrewMonitoringBoundUserInterface - type: CrewMonitoringConsole - type: DeviceNetwork @@ -416,10 +416,10 @@ key: enum.ResearchConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.ResearchConsoleUiKey.Key - type: ResearchConsoleBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ResearchConsoleUiKey.Key: + type: ResearchConsoleBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: ApcPowerReceiver powerLoad: 1000 - type: Computer @@ -464,10 +464,10 @@ key: enum.ArtifactAnalzyerUiKey.Key - type: UserInterface interfaces: - - key: enum.ArtifactAnalzyerUiKey.Key - type: AnalysisConsoleBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ArtifactAnalzyerUiKey.Key: + type: AnalysisConsoleBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: ApcPowerReceiver powerLoad: 1000 - type: Computer @@ -509,8 +509,8 @@ key: enum.IdCardConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.IdCardConsoleUiKey.Key - type: IdCardConsoleBoundUserInterface + enum.IdCardConsoleUiKey.Key: + type: IdCardConsoleBoundUserInterface - type: CrewManifestViewer ownerKey: enum.IdCardConsoleUiKey.Key - type: Sprite @@ -580,8 +580,8 @@ key: enum.CommunicationsConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.CommunicationsConsoleUiKey.Key - type: CommunicationsConsoleBoundUserInterface + enum.CommunicationsConsoleUiKey.Key: + type: CommunicationsConsoleBoundUserInterface - type: Computer board: CommsComputerCircuitboard - type: PointLight @@ -644,8 +644,8 @@ key: enum.SolarControlConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.SolarControlConsoleUiKey.Key - type: SolarControlConsoleBoundUserInterface + enum.SolarControlConsoleUiKey.Key: + type: SolarControlConsoleBoundUserInterface - type: Computer board: SolarControlComputerCircuitboard - type: PointLight @@ -674,8 +674,8 @@ key: enum.RadarConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.RadarConsoleUiKey.Key - type: RadarConsoleBoundUserInterface + enum.RadarConsoleUiKey.Key: + type: RadarConsoleBoundUserInterface - type: Computer board: RadarConsoleCircuitboard - type: PointLight @@ -704,8 +704,8 @@ key: enum.CargoConsoleUiKey.Shuttle - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Shuttle - type: CargoShuttleConsoleBoundUserInterface + enum.CargoConsoleUiKey.Shuttle: + type: CargoShuttleConsoleBoundUserInterface - type: Computer board: CargoShuttleComputerCircuitboard - type: PointLight @@ -742,8 +742,8 @@ key: enum.CargoConsoleUiKey.Orders - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Orders - type: CargoOrderConsoleBoundUserInterface + enum.CargoConsoleUiKey.Orders: + type: CargoOrderConsoleBoundUserInterface - type: Computer board: CargoRequestComputerCircuitboard - type: PointLight @@ -786,8 +786,8 @@ key: enum.CargoConsoleUiKey.Bounty - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Bounty - type: CargoBountyConsoleBoundUserInterface + enum.CargoConsoleUiKey.Bounty: + type: CargoBountyConsoleBoundUserInterface - type: Computer board: CargoBountyComputerCircuitboard - type: PointLight @@ -837,8 +837,8 @@ key: enum.CloningConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.CloningConsoleUiKey.Key - type: CloningConsoleBoundUserInterface + enum.CloningConsoleUiKey.Key: + type: CloningConsoleBoundUserInterface - type: Speech speechVerb: Robotic speechSounds: Pai @@ -881,7 +881,7 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SalvageConsoleUiKey.Expedition + enum.SalvageConsoleUiKey.Expedition: type: SalvageExpeditionConsoleBoundUserInterface - type: Computer board: SalvageExpeditionsComputerCircuitboard @@ -926,8 +926,8 @@ anchored: true - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface - type: entity parent: BaseComputer @@ -963,8 +963,8 @@ - type: ActivatableUIRequiresVision - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface - type: entity id: ComputerPalletConsole @@ -990,8 +990,8 @@ key: enum.CargoPalletConsoleUiKey.Sale - type: UserInterface interfaces: - - key: enum.CargoPalletConsoleUiKey.Sale - type: CargoPalletConsoleBoundUserInterface + enum.CargoPalletConsoleUiKey.Sale: + type: CargoPalletConsoleBoundUserInterface - type: Computer board: CargoRequestComputerCircuitboard - type: PointLight @@ -1031,8 +1031,8 @@ anchored: true - type: UserInterface interfaces: - - key: enum.NewsWriterUiKey.Key - type: NewsWriterBoundUserInterface + enum.NewsWriterUiKey.Key: + type: NewsWriterBoundUserInterface - type: entity parent: BaseComputer @@ -1064,7 +1064,7 @@ key: enum.SensorMonitoringConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.SensorMonitoringConsoleUiKey.Key + enum.SensorMonitoringConsoleUiKey.Key: type: SensorMonitoringConsoleBoundUserInterface - type: DeviceNetwork deviceNetId: AtmosDevices diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml index df989a7795..dd58b9709d 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml @@ -19,10 +19,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.DiskConsoleUiKey.Key - type: DiskConsoleBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.DiskConsoleUiKey.Key: + type: DiskConsoleBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: ExtensionCableReceiver - type: Computer board: TechDiskComputerCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml index 6ac969171e..4cb76ea4b9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml @@ -89,9 +89,9 @@ scanDelay: 0 - type: UserInterface interfaces: - - key: enum.HealthAnalyzerUiKey.Key + enum.HealthAnalyzerUiKey.Key: type: HealthAnalyzerBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: ActivatableUI key: enum.HealthAnalyzerUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml index ab09a03fef..8686d88233 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml @@ -27,8 +27,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: Machine board: AnomalyVesselCircuitboard - type: PointLight @@ -298,8 +298,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.AnomalyGeneratorUiKey.Key - type: AnomalyGeneratorBoundUserInterface + enum.AnomalyGeneratorUiKey.Key: + type: AnomalyGeneratorBoundUserInterface - type: Appearance - type: ActiveRadio channels: diff --git a/Resources/Prototypes/Entities/Structures/Machines/bombs.yml b/Resources/Prototypes/Entities/Structures/Machines/bombs.yml index 89cadab6b1..88e650068e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/bombs.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/bombs.yml @@ -10,7 +10,7 @@ - type: InteractionOutline - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Wires layoutId: Defusable diff --git a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml index aee1246021..4e565054b4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml @@ -50,8 +50,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ChemMasterUiKey.Key - type: ChemMasterBoundUserInterface + enum.ChemMasterUiKey.Key: + type: ChemMasterBoundUserInterface - type: ApcPowerReceiver powerLoad: 250 - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index 7e78f66efa..583b5e3548 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -32,8 +32,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.FaxUiKey.Key - type: FaxBoundUi + enum.FaxUiKey.Key: + type: FaxBoundUi - type: ApcPowerReceiver powerLoad: 250 - type: FaxMachine diff --git a/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml b/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml index 3244789a02..b4f05cf68a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml @@ -58,8 +58,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.FlatpackCreatorUIKey.Key - type: FlatpackCreatorBoundUserInterface + enum.FlatpackCreatorUIKey.Key: + type: FlatpackCreatorBoundUserInterface - type: ItemSlots slots: board_slot: diff --git a/Resources/Prototypes/Entities/Structures/Machines/gateway.yml b/Resources/Prototypes/Entities/Structures/Machines/gateway.yml index b6ad9db356..dd01adf6d5 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gateway.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gateway.yml @@ -52,6 +52,6 @@ key: enum.GatewayUiKey.Key - type: UserInterface interfaces: - - key: enum.GatewayUiKey.Key - type: GatewayBoundUserInterface + enum.GatewayUiKey.Key: + type: GatewayBoundUserInterface - type: Gateway diff --git a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml index 618538dccb..6ee454c6a9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml @@ -62,8 +62,8 @@ on: "on" - type: UserInterface interfaces: - - key: enum.GravityGeneratorUiKey.Key - type: GravityGeneratorBoundUserInterface + enum.GravityGeneratorUiKey.Key: + type: GravityGeneratorBoundUserInterface - type: Appearance - type: PointLight radius: 2.5 diff --git a/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml b/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml index 76b8ddd36b..acd8527dbb 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml @@ -26,8 +26,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.JukeboxUiKey.Key - type: JukeboxBoundUserInterface + enum.JukeboxUiKey.Key: + type: JukeboxBoundUserInterface - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 25c6545286..9ad3214dc3 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -38,10 +38,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.LatheUiKey.Key - type: LatheBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.LatheUiKey.Key: + type: LatheBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: Transform anchored: true - type: Pullable diff --git a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml index 37b5e50d31..fe4eb14518 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml @@ -44,8 +44,8 @@ range: 200 - type: UserInterface interfaces: - - key: enum.MicrowaveUiKey.Key - type: MicrowaveBoundUserInterface + enum.MicrowaveUiKey.Key: + type: MicrowaveBoundUserInterface - type: Physics - type: Fixtures fixtures: diff --git a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml index f37c42e474..bc4581d7b6 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml @@ -88,8 +88,8 @@ key: enum.NukeUiKey.Key - type: UserInterface interfaces: - - key: enum.NukeUiKey.Key - type: NukeBoundUserInterface + enum.NukeUiKey.Key: + type: NukeBoundUserInterface - type: StaticPrice price: 50000 # YOU STOLE A NUCLEAR FISSION EXPLOSIVE?! - type: CargoSellBlacklist diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index 773112f6f3..d6e7333313 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -12,8 +12,8 @@ key: enum.ReagentGrinderUiKey.Key - type: UserInterface interfaces: - - key: enum.ReagentGrinderUiKey.Key - type: ReagentGrinderBoundUserInterface + enum.ReagentGrinderUiKey.Key: + type: ReagentGrinderBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: @@ -101,4 +101,4 @@ - type: DrainableSolution solution: output - type: ExaminableSolution - solution: output \ No newline at end of file + solution: output diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml index 948b3f84b2..498759df3c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/research.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml @@ -83,8 +83,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml index a17eed5712..cafdc7cef2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml @@ -28,8 +28,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SalvageMagnetUiKey.Key - type: SalvageMagnetBoundUserInterface + enum.SalvageMagnetUiKey.Key: + type: SalvageMagnetBoundUserInterface - type: Transform noRot: false - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml b/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml index 1eeaec9b7c..904bf46a0b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml @@ -13,7 +13,7 @@ - type: DeviceNetworkRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Router + enum.SurveillanceCameraSetupUiKey.Router: type: SurveillanceCameraSetupBoundUi - type: Machine board: SurveillanceCameraRouterCircuitboard @@ -118,7 +118,7 @@ - type: DeviceNetworkRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Router + enum.SurveillanceCameraSetupUiKey.Router: type: SurveillanceCameraSetupBoundUi - type: Machine board: SurveillanceCameraWirelessRouterCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 6f28b53350..16a5aa55d4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -60,10 +60,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.VendingMachineUiKey.Key - type: VendingMachineBoundUserInterface - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.VendingMachineUiKey.Key: + type: VendingMachineBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-vendingmachine diff --git a/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml index d69eb96f62..fc8f31535c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml @@ -33,7 +33,7 @@ range: 10 - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Camera + enum.SurveillanceCameraSetupUiKey.Camera: type: SurveillanceCameraSetupBoundUi placement: mode: SnapgridCenter diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index 4bea87f817..fa5804c645 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -51,8 +51,8 @@ enabled: false - type: UserInterface interfaces: - - key: enum.GasPressurePumpUiKey.Key - type: GasPressurePumpBoundUserInterface + enum.GasPressurePumpUiKey.Key: + type: GasPressurePumpBoundUserInterface - type: Construction graph: GasBinary node: pressurepump @@ -92,7 +92,7 @@ enabled: false - type: UserInterface interfaces: - - key: enum.GasVolumePumpUiKey.Key + enum.GasVolumePumpUiKey.Key: type: GasVolumePumpBoundUserInterface - type: Construction graph: GasBinary diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml index 316c403d7a..200df727b3 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml @@ -120,7 +120,7 @@ layer: - MachineLayer - type: ApcPowerReceiver - powerDisabled: true #starts off + powerDisabled: true #starts off - type: Sprite sprite: Structures/Piping/Atmospherics/Portable/portable_sheater.rsi noRot: true @@ -144,8 +144,8 @@ - type: WiresVisuals - type: UserInterface interfaces: - - key: enum.SpaceHeaterUiKey.Key - type: SpaceHeaterBoundUserInterface + enum.SpaceHeaterUiKey.Key: + type: SpaceHeaterBoundUserInterface - type: ActivatableUI inHandsOnly: false key: enum.SpaceHeaterUiKey.Key @@ -195,4 +195,4 @@ suffix: Anchored, Enabled components: - type: ApcPowerReceiver - powerDisabled: false \ No newline at end of file + powerDisabled: false diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index d0f239b338..46eb57c388 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -53,7 +53,7 @@ - type: PipeColorVisuals - type: UserInterface interfaces: - - key: enum.GasFilterUiKey.Key + enum.GasFilterUiKey.Key: type: GasFilterBoundUserInterface - type: GasFilter enabled: false @@ -138,7 +138,7 @@ - type: PipeColorVisuals - type: UserInterface interfaces: - - key: enum.GasMixerUiKey.Key + enum.GasMixerUiKey.Key: type: GasMixerBoundUserInterface - type: GasMixer enabled: false diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index e046fb831a..c0664602b4 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -239,8 +239,8 @@ - type: AtmosDevice - type: UserInterface interfaces: - - key: enum.ThermomachineUiKey.Key - type: GasThermomachineBoundUserInterface + enum.ThermomachineUiKey.Key: + type: GasThermomachineBoundUserInterface - type: ActivatableUI inHandsOnly: false key: enum.ThermomachineUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml index 218b532efc..0224105117 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml @@ -143,8 +143,8 @@ key: enum.DisposalTaggerUiKey.Key - type: UserInterface interfaces: - - key: enum.DisposalTaggerUiKey.Key - type: DisposalTaggerBoundUserInterface + enum.DisposalTaggerUiKey.Key: + type: DisposalTaggerBoundUserInterface - type: Construction graph: DisposalPipe node: tagger @@ -219,8 +219,8 @@ key: enum.DisposalRouterUiKey.Key - type: UserInterface interfaces: - - key: enum.DisposalRouterUiKey.Key - type: DisposalRouterBoundUserInterface + enum.DisposalRouterUiKey.Key: + type: DisposalRouterBoundUserInterface - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml index 43dc63445c..b4a5f61ffa 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml @@ -56,8 +56,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.DisposalUnitUiKey.Key - type: DisposalUnitBoundUserInterface + enum.DisposalUnitUiKey.Key: + type: DisposalUnitBoundUserInterface - type: ContainerContainer containers: disposals: !type:Container @@ -79,8 +79,8 @@ - type: DisposalUnit - type: UserInterface interfaces: - - key: enum.DisposalUnitUiKey.Key - type: DisposalUnitBoundUserInterface + enum.DisposalUnitUiKey.Key: + type: DisposalUnitBoundUserInterface - type: RatKingRummageable - type: entity @@ -129,7 +129,7 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.MailingUnitUiKey.Key - type: DisposalUnitBoundUserInterface - - key: enum.ConfigurationUiKey.Key - type: ConfigurationBoundUserInterface + enum.MailingUnitUiKey.Key: + type: DisposalUnitBoundUserInterface + enum.ConfigurationUiKey.Key: + type: ConfigurationBoundUserInterface diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml index ca0cebffec..96392ecd00 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml @@ -17,10 +17,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ParticleAcceleratorControlBoxUiKey.Key - type: ParticleAcceleratorBoundUserInterface - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.ParticleAcceleratorControlBoxUiKey.Key: + type: ParticleAcceleratorBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-pa diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml index c88adca76d..4e4ef8bdbc 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml @@ -65,8 +65,8 @@ key: enum.AmeControllerUiKey.Key - type: UserInterface interfaces: - - key: enum.AmeControllerUiKey.Key - type: AmeControllerBoundUserInterface + enum.AmeControllerUiKey.Key: + type: AmeControllerBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml index dbaacd6abc..d735d9607c 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml @@ -44,7 +44,7 @@ - type: WiresPanel - type: UserInterface interfaces: - - key: enum.GeneratorComponentUiKey.Key + enum.GeneratorComponentUiKey.Key: type: PortableGeneratorBoundUserInterface - type: ActivatableUI key: enum.GeneratorComponentUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 4df502791f..71e4506495 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -81,8 +81,8 @@ - type: ExtensionCableProvider - type: UserInterface interfaces: - - key: enum.ApcUiKey.Key - type: ApcBoundUserInterface + enum.ApcUiKey.Key: + type: ApcBoundUserInterface - type: ActivatableUI inHandsOnly: false singleUser: true diff --git a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml index 2591b3f340..9fd05beaee 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml @@ -313,8 +313,8 @@ fillBaseName: cart_water- - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Drink solution: bucket - type: ContainerContainer diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index cd44f5f585..b38ef61791 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -36,7 +36,7 @@ 3: { state: can-o3, shader: "unshaded" } - type: UserInterface interfaces: - - key: enum.GasCanisterUiKey.Key + enum.GasCanisterUiKey.Key: type: GasCanisterBoundUserInterface - type: Destructible thresholds: diff --git a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml index d341c017a7..08db462be0 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml @@ -24,8 +24,8 @@ map: ["openLayer"] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Transform noRot: true - type: Fixtures @@ -113,8 +113,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Transform noRot: true - type: Fixtures diff --git a/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml b/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml index 961d7854c0..b26bb2c954 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml @@ -60,8 +60,8 @@ - Ore - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml index 62f2000593..7f306bbf94 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml @@ -57,10 +57,10 @@ - type: InteractionOutline - type: UserInterface interfaces: - - key: enum.SharedAirAlarmInterfaceKey.Key - type: AirAlarmBoundUserInterface - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.SharedAirAlarmInterfaceKey.Key: + type: AirAlarmBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-airalarm diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml index 05988fbc21..3088e0a001 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml @@ -60,8 +60,8 @@ delta: fire_3 - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-firealarm diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml index 037a89a988..2cf77d843c 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml @@ -63,9 +63,9 @@ key: enum.IntercomUiKey.Key - type: UserInterface interfaces: - - key: enum.IntercomUiKey.Key + enum.IntercomUiKey.Key: type: IntercomBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Construction graph: Intercom diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml index b524f099bf..d02bce020d 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml @@ -16,5 +16,5 @@ key: enum.MagicMirrorUiKey.Key - type: UserInterface interfaces: - - key: enum.MagicMirrorUiKey.Key - type: MagicMirrorBoundUserInterface + enum.MagicMirrorUiKey.Key: + type: MagicMirrorBoundUserInterface diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml index 451495f58d..408ab6b67c 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml @@ -110,8 +110,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface # Wall Televisions @@ -169,8 +169,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface - type: PointLight radius: 1.5 energy: 1.6 diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml index 421ab93be9..f2315583e3 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml @@ -50,8 +50,8 @@ - Write - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml index d1df619b7a..2ae5040910 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml @@ -86,7 +86,7 @@ acts: [ "Destruction" ] - type: UserInterface interfaces: - - key: enum.StationMapUiKey.Key + enum.StationMapUiKey.Key: type: StationMapBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml index dfbe99b2d2..2ac81b463a 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml @@ -42,9 +42,9 @@ InUse: camera_in_use - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Camera + enum.SurveillanceCameraSetupUiKey.Camera: type: SurveillanceCameraSetupBoundUi - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: StaticPrice price: 200 diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml index 0c284eec7a..dd7eb5bea8 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml @@ -32,8 +32,8 @@ key: enum.SignalTimerUiKey.Key - type: UserInterface interfaces: - - key: enum.SignalTimerUiKey.Key - type: SignalTimerBoundUserInterface + enum.SignalTimerUiKey.Key: + type: SignalTimerBoundUserInterface - type: ApcPowerReceiver powerLoad: 100 - type: Electrified diff --git a/Resources/Prototypes/Entities/Structures/cryopod.yml b/Resources/Prototypes/Entities/Structures/cryopod.yml index 9063e8b138..bdb8862a82 100644 --- a/Resources/Prototypes/Entities/Structures/cryopod.yml +++ b/Resources/Prototypes/Entities/Structures/cryopod.yml @@ -12,8 +12,8 @@ map: ["base"] - type: UserInterface interfaces: - - key: enum.CryostorageUIKey.Key - type: CryostorageBoundUserInterface + enum.CryostorageUIKey.Key: + type: CryostorageBoundUserInterface - type: ActivatableUI key: enum.CryostorageUIKey.Key - type: AccessReader diff --git a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml index 911c1c2e88..84df09af33 100644 --- a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml +++ b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml @@ -214,8 +214,8 @@ permanentComponents: - type: UserInterface interfaces: - - key: enum.SignalLinkerUiKey.Key - type: SignalPortSelectorBoundUserInterface + enum.SignalLinkerUiKey.Key: + type: SignalPortSelectorBoundUserInterface - type: ToolTileCompatible - type: Tool qualities: From 934c5089a9d7cd700ed891b46768331e566edcf0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 08:17:30 +0000 Subject: [PATCH 23/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index dd488a6bcb..d3d03f4091 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: liltenhead - changes: - - message: Reduced energy shield's hp from 150 to 100. - type: Tweak - id: 5943 - time: '2024-02-15T20:54:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25258 - author: PJB3005 changes: - message: Nuke has some more blinkenlights now. @@ -3850,3 +3843,10 @@ id: 6442 time: '2024-04-26T08:01:21.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27293 +- author: metalgearsloth + changes: + - message: Add predicted UI opening for storage and PDAs. + type: Add + id: 6443 + time: '2024-04-26T08:16:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27214 From 37e03e0d2947e9d3d97f3248eec91f26de9f951f Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 18:22:23 +1000 Subject: [PATCH 24/66] Update submodule to 220.0.0 (#27338) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index eb63809999..123d0ae6ac 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit eb638099999dce3a43d90772ca976ae010d649c0 +Subproject commit 123d0ae6acf397654c135fe2b8f5268ff80c9bcf From 35edea1c96666c13b653433417d6d2479593d6c7 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 26 Apr 2024 03:29:56 -0700 Subject: [PATCH 25/66] Fixes blank syndicate uplink UI (#27344) Co-authored-by: Plykiya --- Content.Server/Store/Systems/StoreSystem.Ui.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 864fe1185a..fa363c54c1 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -89,7 +89,7 @@ public sealed partial class StoreSystem return; // TODO: Why is the state not being set unless this? - if (!_ui.IsUiOpen(store, StoreUiKey.Key)) + if (!_ui.HasUi(store, StoreUiKey.Key)) return; //this is the person who will be passed into logic for all listing filtering. From 13c65378425e2d8254e8ed4e68061643b1245308 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 20:36:57 +1000 Subject: [PATCH 26/66] Fix network configurator memory leaking (#27346) * Fix network configurator memory leaking Doesn't dispose this window. * Fix the other part --- .../NetworkConfiguratorBoundUserInterface.cs | 1 + .../Systems/NetworkConfiguratorSystem.cs | 1 - .../Systems/SharedNetworkConfiguratorSystem.cs | 13 +++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs b/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs index 264c297b63..80c98f143b 100644 --- a/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs +++ b/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs @@ -88,6 +88,7 @@ public sealed class NetworkConfiguratorBoundUserInterface : BoundUserInterface base.Dispose(disposing); if (!disposing) return; + _linkMenu?.Dispose(); _listMenu?.Dispose(); _configurationMenu?.Dispose(); } diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index b68f8a594b..3460124158 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -62,7 +62,6 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem SubscribeLocalEvent(OnClearLinks); SubscribeLocalEvent(OnToggleLinks); SubscribeLocalEvent(OnConfigButtonPressed); - SubscribeLocalEvent(OnUiOpenAttempt); SubscribeLocalEvent(OnComponentRemoved); } diff --git a/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs b/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs index 4aa9db199d..53928f83a9 100644 --- a/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs +++ b/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs @@ -1,10 +1,23 @@ using Content.Shared.Actions; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.UserInterface; using Robust.Shared.Serialization; namespace Content.Shared.DeviceNetwork.Systems; public abstract class SharedNetworkConfiguratorSystem : EntitySystem { + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnUiOpenAttempt); + } + + private void OnUiOpenAttempt(EntityUid uid, NetworkConfiguratorComponent configurator, ActivatableUIOpenAttemptEvent args) + { + if (configurator.LinkModeActive) + args.Cancel(); + } } public sealed partial class ClearAllOverlaysEvent : InstantActionEvent From adce5793707d83852f783f891335e0d481aaa94d Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Fri, 26 Apr 2024 05:17:25 -0700 Subject: [PATCH 27/66] Fix mobs not being able to pry doors by just left clicking on them (#27349) --- Content.Shared/Prying/Systems/PryingSystem.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Content.Shared/Prying/Systems/PryingSystem.cs b/Content.Shared/Prying/Systems/PryingSystem.cs index 69a63f72b5..5a15057f1e 100644 --- a/Content.Shared/Prying/Systems/PryingSystem.cs +++ b/Content.Shared/Prying/Systems/PryingSystem.cs @@ -1,15 +1,14 @@ -using Content.Shared.Prying.Components; -using Content.Shared.Verbs; -using Content.Shared.DoAfter; -using Robust.Shared.Serialization; +using System.Diagnostics.CodeAnalysis; using Content.Shared.Administration.Logs; using Content.Shared.Database; +using Content.Shared.DoAfter; using Content.Shared.Doors.Components; -using System.Diagnostics.CodeAnalysis; using Content.Shared.Interaction; using Content.Shared.Popups; -using Robust.Shared.Audio; +using Content.Shared.Prying.Components; +using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; +using Robust.Shared.Serialization; using PryUnpoweredComponent = Content.Shared.Prying.Components.PryUnpoweredComponent; namespace Content.Shared.Prying.Systems; @@ -99,14 +98,16 @@ public sealed class PryingSystem : EntitySystem // to be marked as handled. return true; - return StartPry(target, user, null, 0.1f, out id); // hand-prying is much slower + // hand-prying is much slower + var modifier = CompOrNull(user)?.SpeedModifier ?? 0.1f; + return StartPry(target, user, null, modifier, out id); } private bool CanPry(EntityUid target, EntityUid user, out string? message, PryingComponent? comp = null) { BeforePryEvent canev; - if (comp != null) + if (comp != null || Resolve(user, ref comp)) { canev = new BeforePryEvent(user, comp.PryPowered, comp.Force); } From 80bbf19f95e3e14975b5f92a9e1936d8952b092b Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 12:18:31 +0000 Subject: [PATCH 28/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d3d03f4091..ad3a54c9db 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: Nuke has some more blinkenlights now. - type: Tweak - id: 5944 - time: '2024-02-16T00:26:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25297 - author: MACMAN2003 changes: - message: Thindows no longer duplicate glass when broken. @@ -3850,3 +3843,11 @@ id: 6443 time: '2024-04-26T08:16:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27214 +- author: DrSmugleaf + changes: + - message: Fixed mobs that are able to pry doors not being able to do so by just + left clicking on them. + type: Fix + id: 6444 + time: '2024-04-26T12:17:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27349 From 498109a833047d933a5f72edf87961542c516f58 Mon Sep 17 00:00:00 2001 From: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:31:50 +1000 Subject: [PATCH 29/66] fix wieldable guns not being able to cycle inhand (#27307) * Add UnwieldOverride variable that overrides unwielding inhand to enable other interactions * Give LMGs UnwieldOverride * logically inverted UnwieldOverride to UnwieldOnUse * fixed typo --- Content.Shared/Wieldable/Components/WieldableComponent.cs | 7 +++++++ Content.Shared/Wieldable/WieldableSystem.cs | 2 +- .../Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Wieldable/Components/WieldableComponent.cs b/Content.Shared/Wieldable/Components/WieldableComponent.cs index 4a50b93072..5dc6abbbbe 100644 --- a/Content.Shared/Wieldable/Components/WieldableComponent.cs +++ b/Content.Shared/Wieldable/Components/WieldableComponent.cs @@ -26,6 +26,13 @@ public sealed partial class WieldableComponent : Component [AutoNetworkedField, DataField("wielded")] public bool Wielded = false; + /// + /// Whether using the item inhand while wielding causes the item to unwield. + /// Unwielding can conflict with other inhand actions. + /// + [DataField] + public bool UnwieldOnUse = true; + [DataField("wieldedInhandPrefix")] public string? WieldedInhandPrefix = "wielded"; diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index 6bd406c1ca..ba3f787a4b 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -125,7 +125,7 @@ public sealed class WieldableSystem : EntitySystem if (!component.Wielded) args.Handled = TryWield(uid, component, args.User); - else + else if (component.UnwieldOnUse) args.Handled = TryUnwield(uid, component, args.User); } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index 49b2eeaada..79f2e7b45f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -14,6 +14,7 @@ slots: - Back - type: Wieldable + unwieldOnUse: false - type: GunWieldBonus minAngle: -20 maxAngle: -20 From 11227c754c732932347f80355406dc5deb1cb0a0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 12:32:56 +0000 Subject: [PATCH 30/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ad3a54c9db..2743b7635e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: MACMAN2003 - changes: - - message: Thindows no longer duplicate glass when broken. - type: Fix - id: 5945 - time: '2024-02-16T04:03:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25304 - author: Golinth changes: - message: Mindshields are no longer separate and appear as a border around job @@ -3851,3 +3844,10 @@ id: 6444 time: '2024-04-26T12:17:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27349 +- author: WarMechanic + changes: + - message: Fixed unwielding overruling gun cycling + type: Fix + id: 6445 + time: '2024-04-26T12:31:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27307 From e1a52477706b6ebc2b4d74f5a98e6f913279e905 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:37:09 +1000 Subject: [PATCH 31/66] Fix magic mirror prediction (#27356) --- .../MagicMirrorBoundUserInterface.cs | 3 --- .../MagicMirror/MagicMirrorSystem.cs | 8 +++++++ .../MagicMirror/MagicMirrorSystem.cs | 16 ++++---------- .../MagicMirror/MagicMirrorComponent.cs | 8 +++---- .../MagicMirror/SharedMagicMirrorSystem.cs | 21 ++++++++++++++++++- 5 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 Content.Client/MagicMirror/MagicMirrorSystem.cs rename {Content.Server => Content.Shared}/MagicMirror/MagicMirrorComponent.cs (89%) diff --git a/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs b/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs index bfbf2efe4f..f6979bf8d7 100644 --- a/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs +++ b/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs @@ -72,9 +72,6 @@ public sealed class MagicMirrorBoundUserInterface : BoundUserInterface if (!disposing) return; - if (_window != null) - _window.OnClose -= Close; - _window?.Dispose(); } } diff --git a/Content.Client/MagicMirror/MagicMirrorSystem.cs b/Content.Client/MagicMirror/MagicMirrorSystem.cs new file mode 100644 index 0000000000..9b0b1dea0b --- /dev/null +++ b/Content.Client/MagicMirror/MagicMirrorSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.MagicMirror; + +namespace Content.Client.MagicMirror; + +public sealed class MagicMirrorSystem : SharedMagicMirrorSystem +{ + +} diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index 188ff40b02..84f1f1c3e5 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -16,13 +16,12 @@ namespace Content.Server.MagicMirror; /// /// Allows humanoids to change their appearance mid-round. /// -public sealed class MagicMirrorSystem : EntitySystem +public sealed class MagicMirrorSystem : SharedMagicMirrorSystem { [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly MarkingManager _markings = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; public override void Initialize() @@ -45,16 +44,6 @@ public sealed class MagicMirrorSystem : EntitySystem SubscribeLocalEvent(OnChangeColorDoAfter); SubscribeLocalEvent(OnRemoveSlotDoAfter); SubscribeLocalEvent(OnAddSlotDoAfter); - - SubscribeLocalEvent(OnMirrorRangeCheck); - } - - private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) - { - if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value)) - { - args.Result = BoundUserInterfaceRangeResult.Fail; - } } private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args) @@ -309,12 +298,15 @@ public sealed class MagicMirrorSystem : EntitySystem facialHair, humanoid.MarkingSet.PointsLeft(MarkingCategories.FacialHair) + facialHair.Count); + // TODO: Component states component.Target = targetUid; _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); + Dirty(mirrorUid, component); } private void OnUiClosed(Entity ent, ref BoundUIClosedEvent args) { ent.Comp.Target = null; + Dirty(ent); } } diff --git a/Content.Server/MagicMirror/MagicMirrorComponent.cs b/Content.Shared/MagicMirror/MagicMirrorComponent.cs similarity index 89% rename from Content.Server/MagicMirror/MagicMirrorComponent.cs rename to Content.Shared/MagicMirror/MagicMirrorComponent.cs index 624a381ca5..6357543905 100644 --- a/Content.Server/MagicMirror/MagicMirrorComponent.cs +++ b/Content.Shared/MagicMirror/MagicMirrorComponent.cs @@ -1,13 +1,13 @@ using Content.Shared.DoAfter; -using Content.Shared.Humanoid; using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.MagicMirror; +namespace Content.Shared.MagicMirror; /// /// Allows humanoids to change their appearance mid-round. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class MagicMirrorComponent : Component { [DataField] @@ -16,7 +16,7 @@ public sealed partial class MagicMirrorComponent : Component /// /// Magic mirror target, used for validating UI messages. /// - [DataField] + [DataField, AutoNetworkedField] public EntityUid? Target; /// diff --git a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs index 0b22e02498..f9c941ffe3 100644 --- a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs +++ b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs @@ -1,10 +1,29 @@ using Content.Shared.DoAfter; using Content.Shared.Humanoid.Markings; -using Robust.Shared.Player; +using Content.Shared.Interaction; using Robust.Shared.Serialization; namespace Content.Shared.MagicMirror; +public abstract class SharedMagicMirrorSystem : EntitySystem +{ + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMirrorRangeCheck); + } + + private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) + { + if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value)) + { + args.Result = BoundUserInterfaceRangeResult.Fail; + } + } +} + [Serializable, NetSerializable] public enum MagicMirrorUiKey : byte { From 080b1b1e0ca40b34d1a3538942ee54acdd8b117f Mon Sep 17 00:00:00 2001 From: Redfire1331 <125223432+Redfire1331@users.noreply.github.com> Date: Fri, 26 Apr 2024 08:39:32 -0400 Subject: [PATCH 32/66] Added Chopsticks (#27298) * added chopstick sprites * Create chopsticks.yml * added chopstick yml * hopfully it acts like a forke * added chopsticks to dinnerware vendor * uncapitalized the name * Update Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> * made the chopsticks icon a reasonable size * added chopsticks to chang vendor * made paired chopsticks you can break apart * added them to vendors --------- Co-authored-by: redfire1331 Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> --- Resources/Audio/Effects/chopstickbreak.ogg | Bin 0 -> 5552 bytes .../VendingMachines/Inventories/chang.yml | 1 + .../Inventories/dinnerware.yml | 1 + .../Entities/Objects/Misc/chopsticks.yml | 31 ++++++++++++++++++ .../Objects/Misc/chopstick.rsi/icon.png | Bin 0 -> 4359 bytes .../Misc/chopstick.rsi/inhand-left.png | Bin 0 -> 749 bytes .../Misc/chopstick.rsi/inhand-right.png | Bin 0 -> 711 bytes .../Objects/Misc/chopstick.rsi/meta.json | 25 ++++++++++++++ .../Objects/Misc/chopstick.rsi/paired.png | Bin 0 -> 4648 bytes 9 files changed, 58 insertions(+) create mode 100644 Resources/Audio/Effects/chopstickbreak.ogg create mode 100644 Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/icon.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/meta.json create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/paired.png diff --git a/Resources/Audio/Effects/chopstickbreak.ogg b/Resources/Audio/Effects/chopstickbreak.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bac8ac0462142220880d06ef77ba8b476debc3c8 GIT binary patch literal 5552 zcmahNc|6qH_s-bmX{@0kY9=%Dh!HXs8Cwj(jIj*!3Qc&jHKt!)DKVCZBn@ezvP>Zo zS>lycwoPK&45R@h_}*TwpZ+KW z1LJHk2rb0^@O}QlY#{<+Qzm=>5Nn1IJ+C2Lgpxm-P*O-qop-z-PyY5_?WowYnqMH* z$#4H26SEDQOg9h>4TbF5@W%=Z2;a@xXAX%0kVxEUETn4h4fbCaL`W<@*IHS7Ab=$R z7`7V0PQX^>qBN{r)hEzaogp*oR!$0WXd@?|4lFxEr|7&@vJdWPR|Xvj1(L`Il({Kn zX&o-s+$%F)*BnC0B!~+Z;!svU23t}Pq>`mIxf6zFa`Dg1me5>Vk{1f%rnR{%t*-Io z%SezJV`A?bFG-q4b8qY6QsSBouc>myO>k*({}{GEieF)s%#U|4S<>JJk`JgZ&w(M^ zXT(dA+ts*sWVixJ(lupn2f0{-OCU+F;c6T2Rsk6RoG-wo6yRi08db8O9RQT2n{rzu z`tAwz-AeQd>0i7h;6VUs$Y-BYWS{-B-M9kxCu4;C*v>X?vo`HFPl?acr*aGyhV2_X#S_aK|fT$x+%i0 z-)m&jOS7eOSOeJ{@46VD!35@F%oyxT96zsYmiPbk<*mag*M`o%yb*k>8v8zJ8pA{V z*d{zs5TU$X9phjb)J_1FlER2gd5TM)Fw4X^WMYFe z1EaHxPxGIjK1(PSu>h2iMc7g<97riSkWzdgeL6Wa=yY~*3IEr77iJnRzx;oFg~-7% z07PN7@55}TVr;1p5Lq`?PH0{99U{hdpI%3g@$w$KmCT_*J)@SB#`gmNK<@4p<&JK& zvm&;Ss!yls_fc*8X!QTroO_L(m7rl|gaO;dVBar4l}?^6JJpUWIzO<3G+8uo9~YN9 zg(3#zv{8xHa;@29E>8j)O&qwvxFWU_o6-9^9bRB;J4pmhK`Uu{N#P?mO63K{7K)(O zJ!B#mzTU$L7><`T1@0lGl~4#s!QYDft_&4~r7{3V<*2gw1fG8~X+B|7b$MpB2t{w=F>Fg2xeP=aa_H%2;P5 zTNh>KfRb%rmhl5)6E}Cdv$AuaJKbB=nVyYx-stSCOs6T?(pBiRY-f56>!ESzkUM=$ zmEKp&@>z)S%;t=3bRH7ELMjKoGHXM}PW@CxA8@CSm_n+FTNKlc&hmzu_cOf*=$`#C zP;(#6c}Rs$&!!LcvFO>Hol*2L59ZJS-Mc?#q(5P2f6VRT(uS~mmoHzcD*IHm;Zwt_ zmpq4FC*gwnY~1M1o;9H~PNYn=!BIK6bvct7Xa>CllS zD8`{@C+viL0|`%}!^T#fb)$2}c+8zpY*pCKO~Z|0TPs2XMl7l-*2!&eyrRb(F>Ppc z&f$zrueN@&DbcvMIuz;~i(>9P#Tg5F+2HCn!27GlQL=mU$;W^x6ctf~lNPrq|(#>CcTuQ5+vATY10n^47m1qY^D(%uAvHKsw>X5)#X# z!BcUd#?7^MA}1@y!&HFhW>A~exc5nTbvD%sUy?wjrmDqfkk(__J1Dq(fh)x^pWAPR zuS}pa_LleY8L1}R9tKWO<4Q>_5oq{?nAoL}+jCE5l5_<;5#c_GkQWbAC`@z=J$#E7 zNf#TRPLa|PWKx{40yS$wWfspL5(XK2>sxZzI6+G$WiM9X<>N%ERb!_MC)X8CE~ueW zL$cUZsEQ>|AwX3W3K6afs*<;&KvgsfT$TT?_&zVn@0C!MBeCC=nhFVy6e3g=R{5-- z9Hd{Q7=XjJss>yxuhFo^FHhd58c=>iI61a8lX6Tr`LTMK4tG>O<1@)-R) zT_rUPnp3@SRrM0y?AaUfU2x|uu9UR$8ir3ADe3# z;}Rr<{9ZZ9XU`EQ2WcTDb!s7S4hB>;*&hI_A2E5D9@g`Y!nj8Y<6c~cLX^xWCljZN zjHQW_xx5tOly(u7IEm&`ji$7DnN%S}l@%0aQbY22RO;{LFz%7UxL<9IRh5Eaiv=07 zU{?gXAWBSm3y}R=^-NrDoG({K~eW4x87!GGl#6#yWnTs}VCeVSQgPTJsi1A*C z>2()jY7=%E(>)<3n>Fsm6!O$^eAGPpgqTpDO^H4OoUz3OKhoy9u$K*UpKia|(gwh5 zaVc;fx!Pm98D3+Bo@iCDaD!({w%3VA!K+k&qEcXPREvORiDAB+vPP96NQS;DeF9#Q z$9TefQV0onia%?!|5R!J14)1-7c;Q5ZSXw4(#$en=T}55RNAB_$k`{iSq5*CMv~0u z@t~#r(umT6qDKtJEH;YbP*OAKUzQv1N~M&yXaqo?>SvTy_Vc$uzf}z>BMqV{!TPOU z?9LmD8PpJBKZ8AY<5a(YnaR{>JnD9}a=_*Kg~tcy@U@JP2j)xKT-VAz2K%+Jm`o)u zj>f-+1*UHrX-bRx`j(U*0RM^?12%ETHkM)XRMI6^33n?k1GG{8@PKn+9KvlwZZy1{ zaagJdCvPQ<-Teb6;H53|$q0Cv-}zu2VKj9f%0e8KB9fIBLeGEV@WRSgM8#u&LIN&| zf)nyV+oG)C@ZHKkaG5`GRO$~LJgV<}JgNgMLD6Q=Rn^G4>U34VLYY-su_FJq1VFjj zgZ5`0`93kQL`RxfTw+DRClamiX5{1y+#7I?9v#DO$4fuW_Vp%{>p zM_EXbbuA;RVRdV@JJH@)PdrH~3n&m(0A@YzAEaeMi|ufWM3nmDxDB(LQC6rpRP$3H zYu|KBX4BR;iMpeY#q$cNQo;`k08f7<0BsT|g>JN6Vyoo#q&6vgSPjG04w|GulMd3x z#yIIje&wz1CvOmnut@pd#Kpx$5cESJE-w1K5eJxMqVV%Zh&N2rG(;nm)@iR@tD~)F zu#se@|0~hZ$jE4_0+H5Awj!UX@sa961MRaR za)0vJoi5wLk>1UVTeN1T^G0V8X;!6)aVOjck4h?lUHWGlW%rF^gE-CW8y@tQ7M_+x z9J1UW`}EFNEe%@${1}<3e}Cxs+yA26r@&aosQ@H2s2j6ac-WvGwZHF~=5-)MyCAs%Lvk#0c`}X+*vCN{zP4n47;1*lhK~xXE0DVFRyjf}1L--Ka zxN6wZVC!f^u!e#Mp)U3?_r6m=`(XX+w9SRTj5e4d{I*$QLBxtK1D~uK-_F-90bgh} z7h3;bBmYLp=Wa>i#p*u>w)T9iO9PKAtXEGjd|F+^R|8<2_AE8=4uMDMjr4wbef^gq zo>{oW%}j^4FQR}vn7M9d*Q*x$3vR#C2;Jw}FHox*w8>~QpJEv>`i z4$%u);$ZJkPEk}{7-_oUR%0g;Os)>uy#3bc^;L=;qr-ag}!c5LZLdH9zZZ^>Zi)@J6^K<7;Ff$6Wl zzB>V9^#YM=@pbm4V7=_;PYXxB6GodcQY3a=y>h$lyaYT|#NN!r(8tn3pFzXRv9W zp5IjS>KpDYoY9JRU?9qld)8gyV_bX-L*0E#w7&fA^=FTl^0u3U9t~-Gi_Cd%_S44V zeCY)Xis144FXA`CBV?Q03-`y$YBfe|P}X}F>p%ca$PM3apk0pUup>gfz$o(RQ;JRaGqozTOQT+1pLkaK%hq24J!)TcQd>($68Mii1{UzXaIJX$*Q= z>17jX1M`JBmsRmK=A*C9Zk2_~MkSo(E6Rj-+{@FNQB&_wON{R{sa}&7SPeqb+ZIhqDRCXxj91Y7r0O zEb|l?^u$hTitN{|H@tS}1tGU7^rg1!KV;7AQt)YfUkakN?}x>#Gs_hNyBC}#x7|yR zSkaFHjrPab7FjNgp2Fq^B+#>~ik%& z7v@LpuhEsKR z2EL2IRoaTLaCofTt~WQm`TOzh?1wvYZT9(GchLmKrdbG; z2YmXJAIh_upeGbF!_g>57OJZs=(FUDiBN4v#o>wL&&Qd{^4@` z77H&f3z|~To}``|Yw4bhuB!Ce_x3m2+3J$?u!nZmQWYkV*9QwV6?17TwSul!Ngnv+ zf;E3DKC!QFXbl<{UH3$Nm%v+AfBwp#y@vaG_LW`Xh(%Jlw%xi@&k-Gu(r*~xHP+-w zxqdkAenNXZ3E5XMwssd!ts0!SIuzOc$M~uWT5rfWruRKb+Tpk6RV%Ly!~}1M?!Ile zr>H`41dkAZ0yCaPpl{ouYdPW;@2<>xI%C$pEbKgS8p~=nlwNQYJiwR_S4{*xp#|JL z7c`fvaZ~d__>!gP#4N@2y2jsoN#9l;uLw+h;p%b8`m?V-$AM~~sgLPW3L@6KcNHn&|V*)geKbrqvSqCBxiQ&L&^+Yu2H? z6I-YS+8rsVIxv47p&tK8+84Dp$HMJi@mL6DzTGnT-SGTy&Y`Qs(yK{wp9l;IFT!Dj ztrhe2G$HOtLBd_tPwNoH)!K3$D}1_)qU4iF5^G}a;s+hJb)>yT$1OJguJ~J3L)_5= zc=e!;^^WVC)MosK5i>`|pAyVstD+8LEG3sTGW>$o2iZ-p#15b%#AbsGK_QU;H%{y~ A#Q*>R literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml index 282f58535b..5befd85ca8 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml @@ -7,4 +7,5 @@ DrinkHellRamen: 3 FoodSnackChowMein: 3 FoodSnackDanDanNoodles: 3 + PairedChopsticks: 3 # rice? diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml index 86f35b5269..11e48f830e 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml @@ -6,6 +6,7 @@ RollingPin: 4 Spoon: 4 Fork: 4 + PairedChopsticks: 4 FoodBowlBig: 10 FoodPlate: 10 FoodPlateSmall: 10 diff --git a/Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml b/Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml new file mode 100644 index 0000000000..47cae456fa --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml @@ -0,0 +1,31 @@ +- type: entity + parent: BaseItem + id: ChopSticks + name: chopsticks + description: A very traditional utensil. + components: + - type: Sprite + sprite: Objects/Misc/chopstick.rsi + state: icon + - type: Item + sprite: Objects/Misc/chopstick.rsi + size: Small + - type: Utensil + types: + - Fork + +- type: entity + parent: BaseItem + name: paired chopsticks + id: PairedChopsticks + description: You should probably seperate them. + components: + - type: SpawnItemsOnUse + items: + - id: ChopSticks + - type: Sprite + sprite: Objects/Misc/chopstick.rsi + state: paired + - type: EmitSoundOnUse + sound: + path: /Audio/Effects/chopstickbreak.ogg diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/icon.png b/Resources/Textures/Objects/Misc/chopstick.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..95acfb53cd1abf0129bba7035a51835395009949 GIT binary patch literal 4359 zcmeHKeQ*vL>x1N!y_5#WwX?2DO|0NcNg!x5>6i zJ1{uySg)Wrr9ekKK6(X_n-j(MM(ULwAFbC@M4Te0z(G&FD%^SHPEp`6^xjRs=bX9e z%=uq8lkC3F$M1cf-}^kzWSgDEg$q*dPJtk3fxXCD0`9Q#O-ca2q5Ar3;MP~~Dwj*> zFf0W{Uhr|STqkib7ZG>}ik$a5^V9p_q$9UB<>ptAH-2zt9}&&p^VH(jW=HrB8Rfj~ z#O=DHC-yd`C%(6N+uAiQX?Tr8)!d{v*zPestPyh0_N{7ZYtPBv{zw&UHr*jZ`;%l)S6_v)9F&9TzTi z{$ACwBKfgp59pzPfBf|RxCa+?>I*(tXxWh!*q?gy@XM-?Q_qi7EL9a&H9}C_GlIq9 zv|B6_>3}45ZrEZj>U%h|X=s1OMsM|@#!Z%{zp+a*s5XPzoWWS8vb(U&$}A8c5L2uXXNz4l9V5*)~l z3Ky5{U7z)N=ZU(_U26|^ePh0v+8FP@udik;Q&gF3-v_TQSdrnPv)1$!Y-%QV4Vb^( z`-?oAX2-e=ESTM%kkR^S;%MVguWs|1(m)B8cJ0VV-wYVu?@9gb-ETxU_%0k=bZqpF zb;62`2b163(0b{zcgxC3X?b_|i1*8Tq&HP}bd5qtGv7N7b;vn$M}En<*^Ne!vN5L-m3 z)v9w-U{jFgsS<0!I0RUk)m~YaC=?Bc!?_fTP#p z28K7#2+42+Lh^0`akH#e!6678MzThOdm6+~f&!>Y+BZEa1&RewIRtAUSYC@58H__n zoF)*OH1G({vOL2Rgr3K9Vo)qY6^KDU4USXr(;g0$0-l&cA)Ly0+RbXM2Ah&NeYDI2 z2hamTfEB}`DV0m`bEPt^@QLT(B&Nej0>kxq4xybgdYlV}KrJe$IHn==F^zIC6i5e9 zODmNM0Ag~G4P^;(v@8Z)qUbZLm7rk7b5iX94aL$jZKY)nfMQyb!bnQ1b74kGOHiZ% z0ZVL}y~qlD-T$&y+6Oj`9eR-v0{hp+L}NWw%2ki8#+E)I)=V%QYYU2I#!?8;wHzCZ z6JU+07%v_0aA1Cn7wm*w_>N-WbU3EZ!C3?+-JqT@T8|jqIElD1p4S=OoKdf1W}=5g zUJlbiF5d%q1YCgvjd2A(Fn(04X4;3noN^9;GQbfsNtq5)qvOe<%EXw+)`b2SAEubW zv=IaR#$;f0fk}u?j>2)il%exIUgPKRJ?;RY=Qf!YzjJiW(KRauW@S8AU2}BJih)@f z&sEp|jjoibmnkj){sD!-tJ1l3t6ITpR)YJHLMt??eA;_o-U=kiQc*<+f>IYL-#F;S zotZ$GDBB&j#LM%SEm*33@Y2a4AnLSR^IheAOl4;L-pa+#&HHgEX>4Tx04R}tkv&MmKpe$i(@I4u4y{_wexbF3Pjq&;2 zOq3{l-R0f=y}kW=rqkaKp;dCZq+@ck00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=mZ!P0t%lZYR>=w02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{006~FL_t(|+U?pQ4gxU{h2en&u>^&{;4oy}El<%|db000000AR{|yY5?TIu@$aH5Wd37fTKyc-M)D z%x>J-|9LmYLgW*QE;{58HR`5T#b}*@AZ;5xouZk2j;KA*Ap%*4bM32-#A2&5g14Jwi6k@U`v{ fOyeE_0Dx>?L%uzS(p1EE00000NkvXXu0mjf_+UEa literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png b/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..51dc3961d5fb20143c1e1790a015d77792f79036 GIT binary patch literal 711 zcmV;&0yzDNP)EX>4Tx04R}tkv&MmKpe$i(@I4u4y{_wexbF3Pjq&;2 zOq3{l-R0f=y}kW=rqkaKp;dCZq+@ck00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=mZ!P3@FsW2BiQ102y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{005s!L_t(|+U?r04Z<)G1<l*`rxOV2JP)oq?*J!q-K5b_R0RFo)2yGmtZ? tN*X^GYxyjl-yXJ{(c?|tyFUQX!Ut(uI>Y1w!Z-i`002ovPDHLkV1iLYEZP77 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/meta.json b/Resources/Textures/Objects/Misc/chopstick.rsi/meta.json new file mode 100644 index 0000000000..78e9149225 --- /dev/null +++ b/Resources/Textures/Objects/Misc/chopstick.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/pull/1179", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "paired" + } + ] + } \ No newline at end of file diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/paired.png b/Resources/Textures/Objects/Misc/chopstick.rsi/paired.png new file mode 100644 index 0000000000000000000000000000000000000000..220dc31ecbaa2f8acec076f42b4e60df68fd7bdb GIT binary patch literal 4648 zcmeHLdr%X19uJ_16d0?*Nqf~bSbUtD>}IneSrQ&5Kw?drB51tpP2DFfkO#>^0UUud)wo5L_}(y9CY zwWspeO`mcud+E=fU-XBCmCvNN1vysQ%h<>5EbT;|7?r3U$)w;Zf-uMSKzjin~ zmX_!0ms|{+nJ>BFO1V;jPyb!gvS}S9ir9|CPd946<})6Kbd{}oKDv6AM70)emJT8xqG*xbC z==!cZ+FvTGdaY9^5$bpkMRg<&@m4ck)8(*Bw}u zzG(K0!!6m({^+2p)m!t7RAa4C&ULkXbo=@Z|1T?YNfy$01@ z{XjV9Z=btj+stlHw`s#O^VZ%x_SM~I|54u-d_E%f-HY17*KLc74|TRSG5gxFb~5eK zf>%C1*5ta@-LxXF>C*f%68Y_K_Ow{=P3oOnQ>IIqi`MkXG13q6_q=2LwB#>s$^U#< zeRJE{?9jL~!3V5!HEZuAKh*u=Frw>;pG>D**? z-(UIc$AE}|pvQK(uyDZX<1hqwQIyY^g5->ZA^6LWsQ+}+Bkuh&QPyP72rh2moMb1rqYv3mhK8r;`S732-l(o!Pl-byeXzq5 zCqfKh7+4SO=3N5sbU-2|NjZxIom2|^&`^DLm)SfF@9+$=0QivmNS7RyA#%H2K03oA zq!j~@!GeA?!;=LzsyvhRIE&mgn^w#^gt*ZV3_YChDsmSD+F@upTfo{us0Yl7j+rvU zWVQ}xh!o`Tc2^(^kUb_+;JFd9#?&Ty0_}`01f&n+j)@-XJrE3{%x1#iq>IGzOa`4) zoS$HvG|v!$Tcujfp&AN>F*T=wl@!Op6pk}6$@a2XG9 z5Dl$lDV%~aj$>gZrbb~3(QvR*p~CS5oFNefItt=NHxE=v7L2Y+gkk_x0>-E@hEu>A z8Uau!iNT~&&A}+ca5RTuDh^EuKru9t?sVHpu$;V|%wgp&M^3;Y5>BLAO**MUhKyLO z1*E`%1h5Bq2jld5MqF9Eon0=FBA;jiszlT{ieQKeMb+3y&T; z2+$6omK2o=00MT<4WW0lq~LUCIh_SMsaO;wW)8c}U_&vaKpIGa1)zvRNgzr>foGv= zLa8Kh4Gf0JsCXyCb0z;RTHHR6c3{zsya&u*5-<(yspV|pz-VAtzy~%H1O>JQLDB;) zc*tUw3DgO&23&M5>BwQh`7tQiAv^ygVqgJ#ssxmQQ6&ZRgpev&O`%Gl2#&)w6su9; z^jLI{lM}q8n@!CDJOZwOKm%Ms3kH{J;n;X@E-S7BpbT&X1IiE$p}+_nk;#b9S02ex$%UU+a5weO-0mqsphQydQRptZ(c&9Zp4@Ut305S9X=fwYI^x_8ezVaZkr~|Sd?UKuP}}!?`=P!sbm=u2sTJ$LD4ROlVLNo9y6bvO>3#o< zwgc5iXYsY67Z&#~Zf)y$^_zQ%^{-i)L%>)H#`*(2OroUYZtrw$=dPPJ%TCcT7dTQ6 z_RJFHeO1J3@>*`*-i`xw*rqitpdN@OpadfydxDb@_h)*ms-5 literal 0 HcmV?d00001 From 8febdc5fc4851f44802bc675d90d3412bd0d4da6 Mon Sep 17 00:00:00 2001 From: wafehling Date: Fri, 26 Apr 2024 05:39:56 -0700 Subject: [PATCH 33/66] Added hotkey and controller to re-open end of round scoreboard (#25884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added keybind for scoreboard, starting work * Fixed the window appearing * Added loc text * Updated namespace for ScoreboardUIController.cs * Switched to UISystemDependency "- UIControllers can use [Dependency] as normal for IoC services and other controllers, but must use [UISystemDependency] for entity systems, which may be null as controllers exist before entity systems do." Jezithyr — 10/12/2022 1:20 PM * Reverted back to functional state * Replace with UISystemDependency * Move RoundEndSummaryWindow to ScoreboardUIController * Convert to EntitySystem * Clean up command bind * Move to RoundEnd directory * Remove Nukeops rule when no nukies * Cleanup * Change to toggle hotkey * Cleanup * Revert "Remove Nukeops rule when no nukies" This reverts commit 5d4bbca09f45110b24a674d59b505be87b602b67. * Cleanup * Make the Toggle hotkey work in lobby * Fix error --------- Co-authored-by: SlamBamActionman Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> --- .../GameTicking/Managers/ClientGameTicker.cs | 16 ++---- Content.Client/Input/ContentContexts.cs | 1 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 + .../RoundEnd/RoundEndSummaryUIController.cs | 51 +++++++++++++++++++ .../RoundEnd/RoundEndSummaryWindow.cs | 1 - Content.Shared/Input/ContentKeyFunctions.cs | 1 + .../en-US/escape-menu/ui/options-menu.ftl | 1 + Resources/keybinds.yml | 3 ++ 8 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 Content.Client/RoundEnd/RoundEndSummaryUIController.cs diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs index f62f99c6df..309db2eb4e 100644 --- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs +++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs @@ -7,7 +7,7 @@ using Content.Shared.GameWindow; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Client.State; -using Robust.Shared.Utility; +using Robust.Client.UserInterface; namespace Content.Client.GameTicking.Managers { @@ -18,16 +18,11 @@ namespace Content.Client.GameTicking.Managers [Dependency] private readonly IClientAdminManager _admin = default!; [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; - [ViewVariables] private bool _initialized; private Dictionary> _jobsAvailable = new(); private Dictionary _stationNames = new(); - /// - /// The current round-end window. Could be used to support re-opening the window after closing it. - /// - private RoundEndSummaryWindow? _window; - [ViewVariables] public bool AreWeReady { get; private set; } [ViewVariables] public bool IsGameStarted { get; private set; } [ViewVariables] public string? RestartSound { get; private set; } @@ -152,12 +147,7 @@ namespace Content.Client.GameTicking.Managers // Force an update in the event of this song being the same as the last. RestartSound = message.RestartSound; - // Don't open duplicate windows (mainly for replays). - if (_window?.RoundId == message.RoundId) - return; - - //This is not ideal at all, but I don't see an immediately better fit anywhere else. - _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, EntityManager); + _userInterfaceManager.GetUIController().OpenRoundEndSummaryWindow(message); } } } diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 2e888b3df9..8a7ca3b773 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -38,6 +38,7 @@ namespace Content.Client.Input common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); common.AddFunction(ContentKeyFunctions.InspectEntity); + common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow); // Not in engine, because engine cannot check for sanbox/admin status before starting placement. common.AddFunction(ContentKeyFunctions.EditorCopyObject); diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index aca9efcfe2..a575f1ba51 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -215,6 +215,7 @@ namespace Content.Client.Options.UI.Tabs AddButton(ContentKeyFunctions.OpenInventoryMenu); AddButton(ContentKeyFunctions.OpenAHelp); AddButton(ContentKeyFunctions.OpenActionsMenu); + AddButton(ContentKeyFunctions.ToggleRoundEndSummaryWindow); AddButton(ContentKeyFunctions.OpenEntitySpawnWindow); AddButton(ContentKeyFunctions.OpenSandboxWindow); AddButton(ContentKeyFunctions.OpenTileSpawnWindow); diff --git a/Content.Client/RoundEnd/RoundEndSummaryUIController.cs b/Content.Client/RoundEnd/RoundEndSummaryUIController.cs new file mode 100644 index 0000000000..cf824833ef --- /dev/null +++ b/Content.Client/RoundEnd/RoundEndSummaryUIController.cs @@ -0,0 +1,51 @@ +using Content.Client.GameTicking.Managers; +using Content.Shared.GameTicking; +using Content.Shared.Input; +using JetBrains.Annotations; +using Robust.Client.Input; +using Robust.Client.UserInterface.Controllers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Player; + +namespace Content.Client.RoundEnd; + +[UsedImplicitly] +public sealed class RoundEndSummaryUIController : UIController, + IOnSystemLoaded +{ + [Dependency] private readonly IInputManager _input = default!; + + private RoundEndSummaryWindow? _window; + + private void ToggleScoreboardWindow(ICommonSession? session = null) + { + if (_window == null) + return; + + if (_window.IsOpen) + { + _window.Close(); + } + else + { + _window.OpenCenteredRight(); + _window.MoveToFront(); + } + } + + public void OpenRoundEndSummaryWindow(RoundEndMessageEvent message) + { + // Don't open duplicate windows (mainly for replays). + if (_window?.RoundId == message.RoundId) + return; + + _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, + message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, EntityManager); + } + + public void OnSystemLoaded(ClientGameTicker system) + { + _input.SetInputCommand(ContentKeyFunctions.ToggleRoundEndSummaryWindow, + InputCmdHandler.FromDelegate(ToggleScoreboardWindow)); + } +} diff --git a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs index 5b73c77934..9c9f83a427 100644 --- a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs +++ b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Numerics; using Content.Client.Message; using Content.Shared.GameTicking; -using Robust.Client.GameObjects; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Utility; diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index cf874434ec..886a0d5d3a 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -42,6 +42,7 @@ namespace Content.Shared.Input public static readonly BoundKeyFunction MovePulledObject = "MovePulledObject"; public static readonly BoundKeyFunction ReleasePulledObject = "ReleasePulledObject"; public static readonly BoundKeyFunction MouseMiddle = "MouseMiddle"; + public static readonly BoundKeyFunction ToggleRoundEndSummaryWindow = "ToggleRoundEndSummaryWindow"; public static readonly BoundKeyFunction OpenEntitySpawnWindow = "OpenEntitySpawnWindow"; public static readonly BoundKeyFunction OpenSandboxWindow = "OpenSandboxWindow"; public static readonly BoundKeyFunction OpenTileSpawnWindow = "OpenTileSpawnWindow"; diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 416d87f7c5..1c0c0005b4 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -173,6 +173,7 @@ ui-options-function-open-crafting-menu = Open crafting menu ui-options-function-open-inventory-menu = Open inventory ui-options-function-open-a-help = Open admin help ui-options-function-open-abilities-menu = Open action menu +ui-options-function-toggle-round-end-summary-window = Toggle round end summary window ui-options-function-open-entity-spawn-window = Open entity spawn menu ui-options-function-open-sandbox-window = Open sandbox menu ui-options-function-open-tile-spawn-window = Open tile spawn menu diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 886fec35de..b08f4cb4ed 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -452,6 +452,9 @@ binds: - function: OpenDecalSpawnWindow type: State key: F8 +- function: OpenScoreboardWindow + type: State + key: F9 - function: OpenSandboxWindow type: State key: B From 053ec6a30972bd61c18b78e2f7f1d1940e28f565 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 12:41:02 +0000 Subject: [PATCH 34/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2743b7635e..fc183320f7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Golinth - changes: - - message: Mindshields are no longer separate and appear as a border around job - icons on the SecHUD - type: Tweak - id: 5946 - time: '2024-02-16T15:58:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25303 - author: Lukasz825700516 changes: - message: Damaging stacked glass sheets now gives appropriate amount of glass shards @@ -3851,3 +3843,10 @@ id: 6445 time: '2024-04-26T12:31:50.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27307 +- author: wafehling + changes: + - message: You can now reopen the end of round summary window with F9. + type: Tweak + id: 6446 + time: '2024-04-26T12:39:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25884 From 3bed1ddc48219ecc99f957b3d40aa4842046b5a8 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:45:30 +0200 Subject: [PATCH 35/66] Add morgue access door (#26852) Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../Objects/Devices/Electronics/door_access.yml | 10 ++++++++++ .../Entities/Structures/Doors/Airlocks/access.yml | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index bb2f481644..dc3ddefbae 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -157,6 +157,16 @@ # Science - type: entity parent: DoorElectronics + id: DoorElectronicsMorgue + suffix: Morgue, Locked + components: + - type: AccessReader + access: [["Medical"], ["Detective"], ["Chapel"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsCommand + suffix: Command, Locked id: DoorElectronicsResearchDirector suffix: ResearchDirector, Locked components: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 5a337cb136..d798d0c3be 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -235,6 +235,16 @@ containers: board: [ DoorElectronicsChemistry ] +- type: entity + parent: AirlockMedical + id: AirlockMedicalMorgueLocked + suffix: Morgue, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsMorgue ] + + - type: entity parent: AirlockScience id: AirlockScienceLocked From 394c325246c76e234ef6600194a45d9325d3702d Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:45:38 +1000 Subject: [PATCH 36/66] Fix PAI BUI (#27357) --- Content.Shared/UserInterface/ActivatableUISystem.cs | 5 +---- Resources/Prototypes/Entities/Objects/Fun/pai.yml | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Content.Shared/UserInterface/ActivatableUISystem.cs b/Content.Shared/UserInterface/ActivatableUISystem.cs index bfe8491b15..5d848c0fde 100644 --- a/Content.Shared/UserInterface/ActivatableUISystem.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.cs @@ -56,10 +56,7 @@ public sealed partial class ActivatableUISystem : EntitySystem if (args.Handled || args.Key == null) return; - if (!TryComp(args.Performer, out ActorComponent? actor)) - return; - - args.Handled = _uiSystem.TryToggleUi(uid, args.Key, actor.PlayerSession); + args.Handled = _uiSystem.TryToggleUi(uid, args.Key, args.Performer); } private void AddOpenUiVerb(EntityUid uid, ActivatableUIComponent component, GetVerbsEvent args) diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index df8f487240..1b9c5303c6 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -15,8 +15,10 @@ interfaces: enum.InstrumentUiKey.Key: type: InstrumentBoundUserInterface + requireInputValidation: false enum.StationMapUiKey.Key: type: UntrackedStationMapBoundUserInterface + requireInputValidation: false - type: Sprite sprite: Objects/Fun/pai.rsi layers: From 30b74027fbfb60a871b87efd058e6c49a85ba450 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:58:24 +1000 Subject: [PATCH 37/66] Fix RD suffix (#27358) --- .../Entities/Objects/Devices/Electronics/door_access.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index dc3ddefbae..f75fa2584e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -165,8 +165,6 @@ - type: entity parent: DoorElectronics - id: DoorElectronicsCommand - suffix: Command, Locked id: DoorElectronicsResearchDirector suffix: ResearchDirector, Locked components: From 413d69e71f883501285e1673e5b669713af5547d Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Fri, 26 Apr 2024 06:02:08 -0700 Subject: [PATCH 38/66] Fix the game giving up forever when not being able to start a preset (#27359) --- Content.Server/GameTicking/GameTicker.RoundFlow.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 792d838169..83d8390dd4 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -245,7 +245,10 @@ namespace Content.Server.GameTicking var origReadyPlayers = readyPlayers.ToArray(); if (!StartPreset(origReadyPlayers, force)) + { + _startingRound = false; return; + } // MapInitialize *before* spawning players, our codebase is too shit to do it afterwards... _mapManager.DoMapInitialize(DefaultMap); From 36084d9712c0d213923ee26def575852d706c5b1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 13:03:14 +0000 Subject: [PATCH 39/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fc183320f7..8dfe3f5692 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Lukasz825700516 - changes: - - message: Damaging stacked glass sheets now gives appropriate amount of glass shards - type: Fix - id: 5947 - time: '2024-02-16T18:42:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25308 - author: Plykiya changes: - message: The firefighting door remote now has access to atmos doors. @@ -3850,3 +3843,10 @@ id: 6446 time: '2024-04-26T12:39:56.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/25884 +- author: DrSmugleaf + changes: + - message: Fixed the game never starting again if it fails to start once. + type: Fix + id: 6447 + time: '2024-04-26T13:02:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27359 From 50fb91bd1837ea8a78677dbb211559ded5bba018 Mon Sep 17 00:00:00 2001 From: "Mr. 27" <45323883+Dutch-VanDerLinde@users.noreply.github.com> Date: Fri, 26 Apr 2024 09:06:43 -0400 Subject: [PATCH 40/66] monkey reinforcement teleporters can now select between kobold or monkey with a verb (#25982) * inital * Update animals.yml * Update animals.yml * Update Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs Co-authored-by: Tayrtahn * Update Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs Co-authored-by: Tayrtahn * Update Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs Co-authored-by: Tayrtahn * Update Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs Co-authored-by: Tayrtahn * Update Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs Co-authored-by: Tayrtahn * selecting different role will change the description and name * fix name * gargh * the review Hello * e --------- Co-authored-by: Tayrtahn --- .../GhostRoleMobSpawnerComponent.cs | 16 ++-- Content.Server/Ghost/Roles/GhostRoleSystem.cs | 82 +++++++++++++++++-- .../Ghost/Roles/GhostRolePrototype.cs | 38 +++++++++ .../ghost/roles/ghost-role-component.ftl | 4 + .../ghostrole-spawner-verb-selectable.ftl | 1 + .../Locale/en-US/store/uplink-catalog.ftl | 4 +- .../Prototypes/Catalog/uplink_catalog.yml | 16 ++-- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 61 +++++++++++--- .../reinforcement_teleporter.yml | 12 +-- .../Prototypes/Roles/Ghostroles/syndicate.yml | 27 ++++++ Resources/migration.yml | 2 + 11 files changed, 223 insertions(+), 40 deletions(-) create mode 100644 Content.Shared/Ghost/Roles/GhostRolePrototype.cs create mode 100644 Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl create mode 100644 Resources/Prototypes/Roles/Ghostroles/syndicate.yml diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs index 4cdab6ce07..6c2a6986fc 100644 --- a/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs +++ b/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs @@ -1,5 +1,4 @@ using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Ghost.Roles.Components { @@ -10,17 +9,22 @@ namespace Content.Server.Ghost.Roles.Components [Access(typeof(GhostRoleSystem))] public sealed partial class GhostRoleMobSpawnerComponent : Component { - [ViewVariables(VVAccess.ReadWrite)] [DataField("deleteOnSpawn")] + [DataField] public bool DeleteOnSpawn = true; - [ViewVariables(VVAccess.ReadWrite)] [DataField("availableTakeovers")] + [DataField] public int AvailableTakeovers = 1; [ViewVariables] public int CurrentTakeovers = 0; - [ViewVariables(VVAccess.ReadWrite)] - [DataField("prototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? Prototype { get; private set; } + [DataField] + public EntProtoId? Prototype; + + /// + /// If this ghostrole spawner has multiple selectable ghostrole prototypes. + /// + [DataField] + public List SelectablePrototypes = []; } } diff --git a/Content.Server/Ghost/Roles/GhostRoleSystem.cs b/Content.Server/Ghost/Roles/GhostRoleSystem.cs index 0649e68a31..e7495020c8 100644 --- a/Content.Server/Ghost/Roles/GhostRoleSystem.cs +++ b/Content.Server/Ghost/Roles/GhostRoleSystem.cs @@ -23,6 +23,10 @@ using Robust.Shared.Enums; using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Utility; +using Content.Server.Popups; +using Content.Shared.Verbs; +using Robust.Shared.Prototypes; +using Robust.Shared.Collections; namespace Content.Server.Ghost.Roles { @@ -37,6 +41,8 @@ namespace Content.Server.Ghost.Roles [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly SharedMindSystem _mindSystem = default!; [Dependency] private readonly SharedRoleSystem _roleSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; private uint _nextRoleIdentifier; private bool _needsUpdateGhostRoleCount = true; @@ -63,6 +69,7 @@ namespace Content.Server.Ghost.Roles SubscribeLocalEvent(OnUnpaused); SubscribeLocalEvent(OnSpawnerTakeRole); SubscribeLocalEvent(OnTakeoverTakeRole); + SubscribeLocalEvent>(OnVerb); _playerManager.PlayerStatusChanged += PlayerStatusChanged; } @@ -74,11 +81,11 @@ namespace Content.Server.Ghost.Roles switch (args.NewMobState) { case MobState.Alive: - { - if (!ghostRole.Taken) - RegisterGhostRole((component, ghostRole)); - break; - } + { + if (!ghostRole.Taken) + RegisterGhostRole((component, ghostRole)); + break; + } case MobState.Critical: case MobState.Dead: UnregisterGhostRole((component, ghostRole)); @@ -100,11 +107,11 @@ namespace Content.Server.Ghost.Roles public void OpenEui(ICommonSession session) { - if (session.AttachedEntity is not {Valid: true} attached || + if (session.AttachedEntity is not { Valid: true } attached || !EntityManager.HasComponent(attached)) return; - if(_openUis.ContainsKey(session)) + if (_openUis.ContainsKey(session)) CloseEui(session); var eui = _openUis[session] = new GhostRolesEui(); @@ -250,7 +257,7 @@ namespace Content.Server.Ghost.Roles if (metaQuery.GetComponent(uid).EntityPaused) continue; - roles.Add(new GhostRoleInfo {Identifier = id, Name = role.RoleName, Description = role.RoleDescription, Rules = role.RoleRules, Requirements = role.Requirements}); + roles.Add(new GhostRoleInfo { Identifier = id, Name = role.RoleName, Description = role.RoleDescription, Rules = role.RoleRules, Requirements = role.Requirements }); } return roles.ToArray(); @@ -407,6 +414,63 @@ namespace Content.Server.Ghost.Roles args.TookRole = true; } + + private void OnVerb(EntityUid uid, GhostRoleMobSpawnerComponent component, GetVerbsEvent args) + { + var prototypes = component.SelectablePrototypes; + if (prototypes.Count < 1) + return; + + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + var verbs = new ValueList(); + + foreach (var prototypeID in prototypes) + { + if (_prototype.TryIndex(prototypeID, out var prototype)) + { + var verb = CreateVerb(uid, component, args.User, prototype); + verbs.Add(verb); + } + } + + args.Verbs.UnionWith(verbs); + } + + private Verb CreateVerb(EntityUid uid, GhostRoleMobSpawnerComponent component, EntityUid userUid, GhostRolePrototype prototype) + { + var verbText = Loc.GetString(prototype.Name); + + return new Verb() + { + Text = verbText, + Disabled = component.Prototype == prototype.EntityPrototype, + Category = VerbCategory.SelectType, + Act = () => SetMode(uid, prototype, verbText, component, userUid) + }; + } + + public void SetMode(EntityUid uid, GhostRolePrototype prototype, string verbText, GhostRoleMobSpawnerComponent? component, EntityUid? userUid = null) + { + if (!Resolve(uid, ref component)) + return; + + var ghostrolecomp = EnsureComp(uid); + + component.Prototype = prototype.EntityPrototype; + ghostrolecomp.RoleName = verbText; + ghostrolecomp.RoleDescription = prototype.Description; + ghostrolecomp.RoleRules = prototype.Rules; + + // Dirty(ghostrolecomp); + + if (userUid != null) + { + var msg = Loc.GetString("ghostrole-spawner-select", ("mode", verbText)); + _popupSystem.PopupEntity(msg, uid, userUid.Value); + } + } } [AnyCommand] @@ -417,7 +481,7 @@ namespace Content.Server.Ghost.Roles public string Help => $"{Command}"; public void Execute(IConsoleShell shell, string argStr, string[] args) { - if(shell.Player != null) + if (shell.Player != null) EntitySystem.Get().OpenEui(shell.Player); else shell.WriteLine("You can only open the ghost roles UI on a client."); diff --git a/Content.Shared/Ghost/Roles/GhostRolePrototype.cs b/Content.Shared/Ghost/Roles/GhostRolePrototype.cs new file mode 100644 index 0000000000..43d6432250 --- /dev/null +++ b/Content.Shared/Ghost/Roles/GhostRolePrototype.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Ghost.Roles; + +/// +/// For selectable ghostrole prototypes in ghostrole spawners. +/// +[Prototype] +public sealed partial class GhostRolePrototype : IPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// The name of the ghostrole. + /// + [DataField] + public string Name { get; set; } = default!; + + /// + /// The description of the ghostrole. + /// + [DataField] + public string Description { get; set; } = default!; + + /// + /// The entity prototype of the ghostrole + /// + [DataField] + public string EntityPrototype = default!; + + /// + /// Rules of the ghostrole + /// + [DataField] + public string Rules = default!; +} \ No newline at end of file diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 23a178d282..d307813c26 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -228,6 +228,10 @@ ghost-role-information-syndicate-monkey-reinforcement-name = Syndicate Monkey Ag ghost-role-information-syndicate-monkey-reinforcement-description = Someone needs reinforcements. You, a trained monkey, will help them. ghost-role-information-syndicate-monkey-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them. +ghost-role-information-syndicate-kobold-reinforcement-name = Syndicate Kobold Agent +ghost-role-information-syndicate-kobold-reinforcement-description = Someone needs reinforcements. You, a trained kobold, will help them. +ghost-role-information-syndicate-kobold-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them. + ghost-role-information-artifact-name = Sentient Artifact ghost-role-information-artifact-description = Enact your eldritch whims. diff --git a/Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl b/Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl new file mode 100644 index 0000000000..9d649a5e07 --- /dev/null +++ b/Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl @@ -0,0 +1 @@ +ghostrole-spawner-select = Selected: {$mode} \ No newline at end of file diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 57a309ac69..49d4ca0028 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -121,8 +121,8 @@ uplink-agent-id-card-desc = A modified ID card that can copy accesses from other uplink-black-jetpack-name = Black Jetpack uplink-black-jetpack-desc = A black jetpack. It allows you to fly around in space. Refills not included, use your fuel wisely. -uplink-reinforcement-radio-monkey-name = Monkey Reinforcement Teleporter -uplink-reinforcement-radio-monkey-desc = Call in a trained monkey to assist you. Comes with a single syndicate cigarette. +uplink-reinforcement-radio-ancestor-name = Genetic Ancestor Reinforcement Teleporter +uplink-reinforcement-radio-ancestor-desc = Call in a trained ancestor of your choosing to assist you. Comes with a single syndicate cigarette. uplink-reinforcement-radio-name = Reinforcement Teleporter uplink-reinforcement-radio-desc = Radio in a reinforcement agent of extremely questionable quality. No off button, buy this if you're ready to party. They have a pistol with no reserve ammo, and a knife. That's it. diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index a7c2dbc7a4..ca1a2e4f2d 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -937,10 +937,10 @@ - NukeOpsUplink - type: listing - id: UplinkReinforcementRadioSyndicateMonkey - name: uplink-reinforcement-radio-monkey-name - description: uplink-reinforcement-radio-monkey-desc - productEntity: ReinforcementRadioSyndicateMonkey + id: UplinkReinforcementRadioSyndicateAncestor + name: uplink-reinforcement-radio-ancestor-name + description: uplink-reinforcement-radio-ancestor-desc + productEntity: ReinforcementRadioSyndicateAncestor icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 6 @@ -953,10 +953,10 @@ - NukeOpsUplink - type: listing - id: UplinkReinforcementRadioSyndicateMonkeyNukeops # Version for Nukeops that spawns a syndicate monkey with the NukeOperative component. - name: uplink-reinforcement-radio-monkey-name - description: uplink-reinforcement-radio-monkey-desc - productEntity: ReinforcementRadioSyndicateMonkeyNukeops + id: UplinkReinforcementRadioSyndicateAncestorNukeops # Version for Nukeops that spawns a syndicate monkey with the NukeOperative component. + name: uplink-reinforcement-radio-ancestor-name + description: uplink-reinforcement-radio-ancestor-desc + productEntity: ReinforcementRadioSyndicateAncestorNukeops icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 6 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index c0a99ec8a0..ab6afb5403 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1324,9 +1324,10 @@ - type: entity name: kobold - id: MobKobold + id: MobBaseKobold parent: MobBaseAncestor description: Cousins to the sentient race of lizard people, kobolds blend in with their natural habitat and are as nasty as monkeys; ready to pull out your hair and stab you to death. + abstract: true components: - type: NameIdentifier group: Kobold @@ -1420,15 +1421,6 @@ spawned: - id: FoodMeat amount: 2 - - type: Clumsy - clumsyDamage: - types: - Blunt: 2 - Piercing: 7 - groups: - Burn: 3 - clumsySound: - path: /Audio/Voice/Reptilian/reptilian_scream.ogg - type: AlwaysRevolutionaryConvertible - type: GhostTakeoverAvailable - type: SentienceTarget @@ -1439,6 +1431,55 @@ name: ghost-role-information-kobold-name description: ghost-role-information-kobold-description +- type: entity + name: kobold + id: MobKobold + parent: MobBaseKobold + description: Cousins to the sentient race of lizard people, kobolds blend in with their natural habitat and are as nasty as monkeys; ready to pull out your hair and stab you to death. + components: + - type: Clumsy + clumsyDamage: + types: + Blunt: 2 + Piercing: 7 + groups: + Burn: 3 + clumsySound: + path: /Audio/Voice/Reptilian/reptilian_scream.ogg + +- type: entity + id: MobBaseSyndicateKobold + parent: MobBaseKobold + suffix: syndicate base + components: + - type: MobThresholds + thresholds: + 0: Alive + 75: Critical + 200: Dead + - type: NpcFactionMember + factions: + - Syndicate + - type: Loadout + prototypes: [SyndicateOperativeGearMonkey] + +- type: entity + id: MobKoboldSyndicateAgent + parent: MobBaseSyndicateKobold + suffix: syndicate agent + components: + # make the player a traitor once its taken + - type: AutoTraitor + giveUplink: false + giveObjectives: false + +- type: entity + id: MobKoboldSyndicateAgentNukeops # Reinforcement exclusive to nukeops uplink + parent: MobBaseSyndicateKobold + suffix: NukeOps + components: + - type: NukeOperative + - type: entity name: guidebook monkey parent: MobMonkey diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml index f6d57f53a5..3ce39afceb 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml @@ -29,9 +29,9 @@ - type: entity parent: ReinforcementRadioSyndicate - id: ReinforcementRadioSyndicateMonkey - name: syndicate monkey reinforcement radio - description: Calls in a specially trained monkey to assist you. + id: ReinforcementRadioSyndicateAncestor + name: syndicate genetic ancestor reinforcement radio + description: Calls in a specially trained ancestor of your choosing to assist you. components: - type: GhostRole name: ghost-role-information-syndicate-monkey-reinforcement-name @@ -39,14 +39,16 @@ rules: ghost-role-information-syndicate-monkey-reinforcement-rules - type: GhostRoleMobSpawner prototype: MobMonkeySyndicateAgent + selectablePrototypes: ["SyndicateMonkey", "SyndicateKobold"] - type: entity - parent: ReinforcementRadioSyndicateMonkey - id: ReinforcementRadioSyndicateMonkeyNukeops # Reinforcement radio exclusive to nukeops uplink + parent: ReinforcementRadioSyndicateAncestor + id: ReinforcementRadioSyndicateAncestorNukeops # Reinforcement radio exclusive to nukeops uplink suffix: NukeOps components: - type: GhostRoleMobSpawner prototype: MobMonkeySyndicateAgentNukeops + selectablePrototypes: ["SyndicateMonkeyNukeops", "SyndicateKoboldNukeops"] - type: entity parent: ReinforcementRadioSyndicate diff --git a/Resources/Prototypes/Roles/Ghostroles/syndicate.yml b/Resources/Prototypes/Roles/Ghostroles/syndicate.yml new file mode 100644 index 0000000000..24c0d8b3e3 --- /dev/null +++ b/Resources/Prototypes/Roles/Ghostroles/syndicate.yml @@ -0,0 +1,27 @@ +- type: ghostRole + id: SyndicateKobold + name: ghost-role-information-syndicate-kobold-reinforcement-name + description: ghost-role-information-syndicate-kobold-reinforcement-description + rules: ghost-role-information-syndicate-kobold-reinforcement-rules + entityPrototype: MobKoboldSyndicateAgent + +- type: ghostRole + id: SyndicateKoboldNukeops + name: ghost-role-information-syndicate-kobold-reinforcement-name + description: ghost-role-information-syndicate-kobold-reinforcement-description + rules: ghost-role-information-syndicate-kobold-reinforcement-rules + entityPrototype: MobKoboldSyndicateAgentNukeops + +- type: ghostRole + id: SyndicateMonkey + name: ghost-role-information-syndicate-monkey-reinforcement-name + description: ghost-role-information-syndicate-monkey-reinforcement-description + rules: ghost-role-information-syndicate-monkey-reinforcement-name + entityPrototype: MobMonkeySyndicateAgent + +- type: ghostRole + id: SyndicateMonkeyNukeops + name: ghost-role-information-syndicate-monkey-reinforcement-name + description: ghost-role-information-syndicate-monkey-reinforcement-description + rules: ghost-role-information-syndicate-monkey-reinforcement-name + entityPrototype: MobMonkeySyndicateAgentNukeops \ No newline at end of file diff --git a/Resources/migration.yml b/Resources/migration.yml index 04e4f4b080..bf18cfe555 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -327,3 +327,5 @@ WeaponPistolN1984Nonlethal: WeaponPistolN1984 WeaponSubMachineGunVectorRubber: WeaponSubMachineGunVector WeaponSubMachineGunDrozdRubber: WeaponSubMachineGunDrozd WeaponRifleLecterRubber: WeaponRifleLecter +ReinforcementRadioSyndicateMonkey: ReinforcementRadioSyndicateAncestor +ReinforcementRadioSyndicateMonkeyNukeops: ReinforcementRadioSyndicateAncestorNukeops From a04d143c2ce4494f25b596edffb2fcf7101d3faa Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 13:07:49 +0000 Subject: [PATCH 41/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8dfe3f5692..13e6ab9af7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: The firefighting door remote now has access to atmos doors. - type: Tweak - id: 5948 - time: '2024-02-16T18:50:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25097 - author: themias changes: - message: t-ray scanners can now penetrate carpets and puddles @@ -3850,3 +3843,14 @@ id: 6447 time: '2024-04-26T13:02:08.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27359 +- author: Dutch-VanDerLinde + changes: + - message: Monkey reinforcement teleporters can now select between kobold and monkey + operative with a verb. + type: Tweak + - message: Monkey reinforcement teleporters have been renamed to "genetic ancestor + reinforcement teleporter". + type: Tweak + id: 6448 + time: '2024-04-26T13:06:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25982 From c6d935497ce26d957103685129c32d7c7ab8db0f Mon Sep 17 00:00:00 2001 From: nao fujiwara Date: Fri, 26 Apr 2024 14:51:26 -0400 Subject: [PATCH 42/66] spooky dress and hairstyle (#27333) * first draft loooong hair * *added the old dress item *added old dress to the theatrical performances create * updated spooky long hair name * fixed an oopsie made when updating item names --- .../Locale/en-US/accessories/human-hair.ftl | 1 + .../Catalog/Fills/Crates/service.yml | 3 +- .../Entities/Clothing/Uniforms/jumpskirts.yml | 11 ++++++++ .../Customization/Markings/human_hair.yml | 7 +++++ .../olddress.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1260 bytes .../Uniforms/Jumpskirt/olddress.rsi/icon.png | Bin 0 -> 533 bytes .../Jumpskirt/olddress.rsi/inhand-left.png | Bin 0 -> 566 bytes .../Jumpskirt/olddress.rsi/inhand-right.png | Bin 0 -> 612 bytes .../Uniforms/Jumpskirt/olddress.rsi/meta.json | 26 ++++++++++++++++++ .../Customization/human_hair.rsi/meta.json | 4 +++ .../human_hair.rsi/spookylong.png | Bin 0 -> 755 bytes 11 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/human_hair.rsi/spookylong.png diff --git a/Resources/Locale/en-US/accessories/human-hair.ftl b/Resources/Locale/en-US/accessories/human-hair.ftl index 3a507ec6cf..f052f232de 100644 --- a/Resources/Locale/en-US/accessories/human-hair.ftl +++ b/Resources/Locale/en-US/accessories/human-hair.ftl @@ -55,6 +55,7 @@ marking-HumanHairCornrows2 = Cornrows 2 marking-HumanHairCornrowbun = Cornrow Bun marking-HumanHairCornrowbraid = Cornrow Braid marking-HumanHairCornrowtail = Cornrow Tail +marking-HumanHairSpookyLong = Spooky Long marking-HumanHairCrewcut = Crewcut marking-HumanHairCrewcut2 = Crewcut 2 marking-HumanHairCurls = Curls diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 141f98edab..38cd6975ee 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -20,7 +20,7 @@ - id: Plunger amount: 2 - id: BoxCleanerGrenades - + - type: entity id: CrateServiceReplacementLights parent: CrateGenericSteel @@ -88,6 +88,7 @@ - id: ClothingNeckCloakVoid - id: RevolverCapGun - id: BarberScissors + - id: ClothingUniformJumpskirtOldDress - type: entity id: CrateServiceCustomSmokable diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index aeebaca31c..998d462898 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -766,3 +766,14 @@ - state: equipped-INNERCLOTHING-jumpskirt - state: equipped-INNERCLOTHING-shirt color: "#b30000" + +- type: entity + parent: ClothingUniformSkirtBase + id: ClothingUniformJumpskirtOldDress + name: old dress + description: A worn-looking dress from a very long time ago. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/olddress.rsi + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/olddress.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml index 449f8aa2cd..c2a7ac4ebf 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml @@ -397,6 +397,13 @@ sprites: - sprite: Mobs/Customization/human_hair.rsi state: cornrowtail +- type: marking + id: HumanHairSpookyLong + bodyPart: Hair + markingCategory: Hair + sprites: + - sprite: Mobs/Customization/human_hair.rsi + state: spookylong - type: marking id: HumanHairCrewcut bodyPart: Hair diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..a300332899cb9269e5bf050ec61f8b37b016aeda GIT binary patch literal 1260 zcmVPx(rb$FWRCt{2no(#QbsWdP-I5YxX_Dr^;7T6iob9@mI*>?+Sd?J34C2E<+7$%L zd{R(Ep*~oA*+cu%2cISpgwf7~u|RPR2vX#T#?dw)%|ekbgtb_VYc|>@w3YKA{Lj01 zx!nJ9NvHfj5EAZx{J!7&-T(e~x!(_9Fc=I5gTY`h8Ztc_6+@%Es5TZF<;CgQsOs30 ztbd9|eDLfUc(`uVnh1^ZqKE6o)hj#}meyL5goULw@#+;`Q-AR68PF!7L$7#vxDS8s z9wD7hA(4pV_u^w|+{1Mv9OmKo2jF&Dkyy@Q?9CT-#Xf2MhC9i{3B&|}h!f0ALaX&H zdQ1@Ud+TZR5BTBt2arg_5f1YJAc>Q4xmhz%)0fkXzUCSb8s){#%8nGgc+5#-BMHn zrv(IqK}8aXzK|(U>+60FAUxjt3&CJeb$dII>&VZ#QGMzJkZb>sgFQonW= zQT#^!)S#XLt9R4VZ$S_gW2xmNwE-Hm;>&%}K(z>#9vvXLn1Gk-LZP?^FV}_DyJ_6{ zHjB*qM$->Ijc_{bxc2!Jh6c{T<2#Sy{i=`R{VpUI6DU18ppI$iE)a{wP})C)^XX3M zyPf3o`D(&t`bG|(!C){L3Lc`>^IG7WE7$?H>ZDzL|Ye$mjE@937)_1U%bHA+_5~xm*^> z=hp3H%Ws9ZZYM>#rXG)4m{J?eZS6u7#gmd9*lIU8kzwMOKYmv-$_v}mqnv3x`q5XeansPWxk-A5L`avibi{a(h z-jZtbq(|WAAMVhGG7RxRw22oZ9t{13OD-mqwfX(Sw$|tK+a;7#JhZz{fx%$>_xT%P W({;BzlHRib0000Px$&q+i@f3ZaQZLlh)gT38)vT!TD^FNb%J)*#$xx#ND%J>SpsJU<@5#>Qrt zh;7HUNL0{_YLTd*#kS*ywO)+Sg!^YE;p05$l!!zH&BuALwkjZToS~9%SQ(T!&S-pi z7B7`L6eSHw67f`i*Xusc1D+QU2n4}0PDrT&R+bkn&22iUHJm^s2qc_9BVp+XNce3| z0RTOW=Y_U#Qg4+VNFWjwG?!Y^CoeZRy+(ptS6*&#x`azDb@hr7qh(fdmN2WD?bnZ+ORC`qRe7W@z~Z XaYDH68c3`_00000NkvXXu0mjfZTaLH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..a85d0a11e9b34c165ea3e90321f93071b342d6da GIT binary patch literal 566 zcmV-60?GY}P)Px$@JU2LRCt{2+ObOlVHgJR$H>8m%4`UV=5T8g8gx34gh=X!f@-j#KdGSxmkJJ1 z2;#;H2_mR1+JdNPP^^f)!QpE$QHX zvzkqd?iT=tr3xvfbhTDTBC*)=dLpriYOM~Xly=jEPIda4kui0lXltdEetP+697-u& zDB3L_=Wgo+vF{#M%1^Bb|d007+GUSMu^5|xKh06@81#$)9ZmuI%` zI)-70-vR;Q2E4t0!9FR8*KvFOAR;0nA|fIpA|j%{;3pREHPK+i$@HB#JE%ajeZA&$ zuQf#fZ!Z+>#s-`?I~EOlnhkJEY8F9!KEM%+hH+}2V{iXJYKb3f`JF`ogp;B67~4xM z?#1%j7It@XSW2f_n$S(t#jXKC5r6<15Oka^P3#(QbA9DI7WcFE z{7ky5_lh+jx1J4|8{0km@gp^hAbJ<*WsWa3i}3G#15U<3nJ6j_v;Y7A07*qoM6N<$ Eg0Us|i~s-t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6da567de572fe274dc39ef8e93e66ba43c74c5 GIT binary patch literal 612 zcmV-q0-ODbP)Px%9!W$&RCt{2+P_O1VHgMSZ%Q*nM2&F}Tbw!+w@e2abUFwIB!jmU)Io>-K@O$R zArw?NLIS07kfllp9D?0Sw?e7n5J@ZIGdR3X3Hfn}_u_la1-~D73HL&HzdYp44bKA* z5fKp)5fKp)5fQMpv#acaqq?8RnJ297oOZ!ckL6ATZHkCG_D)c(y0~iIU~ypv#iE1t z{2EfJRN!~wqFnKmPVSfe8zQ2vTlcW6T+hB`<#64)hlr>+7vagd?SiAq6;FwX`g3{H zSt6p!6|d)7#F1|97yTP^vr{;74*>v~bh5Jm;K)71-0W18`Hj%YJx~Dmpp;n2uHxrK z3jlgPSF)>c4@$B9`2*0-Jy3w>=FtM2pZWhIhjC$Z54;5c;K%npFZ=Sh?5y`$;O4MpK1%%5TSb)F(?%;i?Mieo6wrwYzcRR6uTM-cv5fKp)5fKs5 zF#WB1le9ZSy8ZX35)oA_I#^toiR8S%zQCw3$KDA5sP6vz#}E6Fw9JRK>OYr089O6% z=yn(Y@cl+-za1`URc)tkI-S_K%#+(7NCJCXk_6XO9~t3B8xH+_`=0000Px%tw}^dRCt{2nnALpAPhj`)GRoFOZx~MqPHHHZ6AUo=#rfab;aNOI7s`aO+e5u zud1tUyEGvL2nhf;r{X@Sl(Kl;wk`WTx#hDSR7zPXB>(_ut(W^L41ooiE3Y1}tS=~3ryxrRi z*#rE>=fLl6{LSeEk^#=pc!2j=KiewclG`X;E;$LtglvE_^t8Y3hr|KD$^$r?vS
AKed2l95NYyiuQ1sj4%0}pX6{(tKB{jy1fB* zW3BxdVWrp%eHvy;seD5q#mW%7Jb(KkPz;b;f!y5Q0J}+<_To|kp>HV1^>!N|*BQXm lk@KA3C(f)}p-?ECk}qK>ZBHrb_$UAX002ovPDHLkV1oZvSQ7vM literal 0 HcmV?d00001 From 012857331b9c672d4ead8947a51135d689ad761f Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 18:52:32 +0000 Subject: [PATCH 43/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 13e6ab9af7..3b159b3812 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: themias - changes: - - message: t-ray scanners can now penetrate carpets and puddles - type: Tweak - id: 5949 - time: '2024-02-16T23:37:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25276 - author: Krunk changes: - message: Sound effects have been added for writing on paper. @@ -3854,3 +3847,11 @@ id: 6448 time: '2024-04-26T13:06:44.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/25982 +- author: fujiwaranao + changes: + - message: Players may now select the Creepy Long hairstyle and an appropriately + creepy dress to go with it can be found in theatrical performances crates. + type: Add + id: 6449 + time: '2024-04-26T18:51:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27333 From ef7d85d28523b4a2fbffd334d1c96da77f94e497 Mon Sep 17 00:00:00 2001 From: Pgriha <133212269+Pgriha@users.noreply.github.com> Date: Sat, 27 Apr 2024 01:58:25 +0300 Subject: [PATCH 44/66] More characters slots! (#27361) Add more character slots --- Content.Shared/CCVar/CCVars.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 2954cfecce..6e20a7dc20 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -177,7 +177,7 @@ namespace Content.Shared.CCVar /// Controls the maximum number of character slots a player is allowed to have. ///
public static readonly CVarDef - GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 10, CVar.ARCHIVE | CVar.SERVERONLY); + GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 30, CVar.ARCHIVE | CVar.SERVERONLY); /// /// Controls the game map prototype to load. SS14 stores these prototypes in Prototypes/Maps. From 18e27342d1db61d1f2e01cf9f8a622b10c8bdda3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 26 Apr 2024 22:59:31 +0000 Subject: [PATCH 45/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3b159b3812..bcd2b08f73 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Krunk - changes: - - message: Sound effects have been added for writing on paper. - type: Add - id: 5950 - time: '2024-02-16T23:48:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25257 - author: PotentiallyTom changes: - message: Added new covers for the medical, security, and science guidebooks @@ -3855,3 +3848,10 @@ id: 6449 time: '2024-04-26T18:51:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27333 +- author: Pgriha + changes: + - message: Increase limit of characters 10 -> 30. + type: Tweak + id: 6450 + time: '2024-04-26T22:58:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27361 From 1dd0e0718cc7d45d4a06a05f257beaecc4fce37c Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 27 Apr 2024 12:35:18 +1000 Subject: [PATCH 46/66] Update submodule to 220.1.0 (#27380) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 123d0ae6ac..6e0205d1a8 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 123d0ae6acf397654c135fe2b8f5268ff80c9bcf +Subproject commit 6e0205d1a80a97122ce66bf09e0feeb3cb034c3d From cc2fa6f57e955917d68b3ec52f1d8a552292eb74 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 27 Apr 2024 15:08:50 +1000 Subject: [PATCH 47/66] Remove redundant HasUi (#27381) Doesn't fix anything but still. --- Content.Shared/UserInterface/ActivatableUISystem.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Content.Shared/UserInterface/ActivatableUISystem.cs b/Content.Shared/UserInterface/ActivatableUISystem.cs index 5d848c0fde..452f08c094 100644 --- a/Content.Shared/UserInterface/ActivatableUISystem.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.cs @@ -208,9 +208,6 @@ public sealed partial class ActivatableUISystem : EntitySystem if (!Resolve(uid, ref aui, false)) return; - if (!_uiSystem.HasUi(uid, aui.Key)) - return; - _uiSystem.CloseUi(uid, aui.Key); } From 7d4d66887b1617e929a64d4e6fe5d6d88b5e5a58 Mon Sep 17 00:00:00 2001 From: Ty Ashley <42426760+TyAshley@users.noreply.github.com> Date: Sat, 27 Apr 2024 00:13:12 -0500 Subject: [PATCH 48/66] Persist Agent ID Job Icon between UI loads (#27379) Modified the Agent ID Card to persist the selected Job Icon between UI loads --- .../Access/UI/AgentIDCardBoundUserInterface.cs | 6 +++--- Content.Client/Access/UI/AgentIDCardWindow.xaml.cs | 6 +++++- Content.Server/Access/Systems/AgentIDCardSystem.cs | 4 ++-- Content.Shared/Access/SharedAgentIDCardSystem.cs | 10 ++++++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs index 73f18aec8d..c3fac8cb92 100644 --- a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs +++ b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs @@ -40,9 +40,9 @@ namespace Content.Client.Access.UI SendMessage(new AgentIDCardJobChangedMessage(newJob)); } - public void OnJobIconChanged(string newJobIcon) + public void OnJobIconChanged(string newJobIconId) { - SendMessage(new AgentIDCardJobIconChangedMessage(newJobIcon)); + SendMessage(new AgentIDCardJobIconChangedMessage(newJobIconId)); } /// @@ -57,7 +57,7 @@ namespace Content.Client.Access.UI _window.SetCurrentName(cast.CurrentName); _window.SetCurrentJob(cast.CurrentJob); - _window.SetAllowedIcons(cast.Icons); + _window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId); } protected override void Dispose(bool disposing) diff --git a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs index beca0c41ba..9a38c0c485 100644 --- a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs +++ b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs @@ -38,7 +38,7 @@ namespace Content.Client.Access.UI JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text); } - public void SetAllowedIcons(HashSet icons) + public void SetAllowedIcons(HashSet icons, string currentJobIconId) { IconGrid.DisposeAllChildren(); @@ -79,6 +79,10 @@ namespace Content.Client.Access.UI jobIconButton.AddChild(jobIconTexture); jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIcon.ID); IconGrid.AddChild(jobIconButton); + + if (jobIconId.Equals(currentJobIconId)) + jobIconButton.Pressed = true; + i++; } } diff --git a/Content.Server/Access/Systems/AgentIDCardSystem.cs b/Content.Server/Access/Systems/AgentIDCardSystem.cs index 2c4425ec10..d5e9dc357d 100644 --- a/Content.Server/Access/Systems/AgentIDCardSystem.cs +++ b/Content.Server/Access/Systems/AgentIDCardSystem.cs @@ -67,7 +67,7 @@ namespace Content.Server.Access.Systems if (!TryComp(uid, out var idCard)) return; - var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", component.Icons); + var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", idCard.JobIcon ?? "", component.Icons); _uiSystem.SetUiState(uid, AgentIDCardUiKey.Key, state); } @@ -94,7 +94,7 @@ namespace Content.Server.Access.Systems return; } - if (!_prototypeManager.TryIndex(args.JobIcon, out var jobIcon)) + if (!_prototypeManager.TryIndex(args.JobIconId, out var jobIcon)) { return; } diff --git a/Content.Shared/Access/SharedAgentIDCardSystem.cs b/Content.Shared/Access/SharedAgentIDCardSystem.cs index ef6690cc35..d027a3937f 100644 --- a/Content.Shared/Access/SharedAgentIDCardSystem.cs +++ b/Content.Shared/Access/SharedAgentIDCardSystem.cs @@ -26,12 +26,14 @@ namespace Content.Shared.Access.Systems public readonly HashSet Icons; public string CurrentName { get; } public string CurrentJob { get; } + public string CurrentJobIconId { get; } - public AgentIDCardBoundUserInterfaceState(string currentName, string currentJob, HashSet icons) + public AgentIDCardBoundUserInterfaceState(string currentName, string currentJob, string currentJobIconId, HashSet icons) { Icons = icons; CurrentName = currentName; CurrentJob = currentJob; + CurrentJobIconId = currentJobIconId; } } @@ -60,11 +62,11 @@ namespace Content.Shared.Access.Systems [Serializable, NetSerializable] public sealed class AgentIDCardJobIconChangedMessage : BoundUserInterfaceMessage { - public string JobIcon { get; } + public string JobIconId { get; } - public AgentIDCardJobIconChangedMessage(string jobIcon) + public AgentIDCardJobIconChangedMessage(string jobIconId) { - JobIcon = jobIcon; + JobIconId = jobIconId; } } } From 46d6bf18a830dde81530f4bdea73839ee77fd965 Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:13:24 -0700 Subject: [PATCH 49/66] Add test for failing and then successfully starting a round (#27375) * Add test for failing and then successfully starting nukeops preset * Make test independent from nukeops * Fix nullable error --- .../Tests/GameRules/FailAndStartPresetTest.cs | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs diff --git a/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs b/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs new file mode 100644 index 0000000000..1fed226bee --- /dev/null +++ b/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs @@ -0,0 +1,152 @@ +#nullable enable +using Content.Server.GameTicking; +using Content.Server.GameTicking.Components; +using Content.Server.GameTicking.Presets; +using Content.Shared.CCVar; +using Content.Shared.GameTicking; +using Robust.Shared.GameObjects; + +namespace Content.IntegrationTests.Tests.GameRules; + +[TestFixture] +public sealed class FailAndStartPresetTest +{ + [TestPrototypes] + private const string Prototypes = @" +- type: gamePreset + id: TestPreset + alias: + - nukeops + name: Test Preset + description: """" + showInVote: false + rules: + - TestRule + +- type: gamePreset + id: TestPresetTenPlayers + alias: + - nukeops + name: Test Preset 10 players + description: """" + showInVote: false + rules: + - TestRuleTenPlayers + +- type: entity + id: TestRule + parent: BaseGameRule + noSpawn: true + components: + - type: GameRule + minPlayers: 0 + - type: TestRule + +- type: entity + id: TestRuleTenPlayers + parent: BaseGameRule + noSpawn: true + components: + - type: GameRule + minPlayers: 10 + - type: TestRule +"; + + /// + /// Test that a nuke ops gamemode can start after failing to start once. + /// + [Test] + public async Task FailAndStartTest() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + Dirty = true, + DummyTicker = false, + Connected = true, + InLobby = true + }); + + var server = pair.Server; + var client = pair.Client; + var entMan = server.EntMan; + var ticker = server.System(); + server.System().Run = true; + + Assert.That(server.CfgMan.GetCVar(CCVars.GridFill), Is.False); + Assert.That(server.CfgMan.GetCVar(CCVars.GameLobbyFallbackEnabled), Is.True); + Assert.That(server.CfgMan.GetCVar(CCVars.GameLobbyDefaultPreset), Is.EqualTo("secret")); + server.CfgMan.SetCVar(CCVars.GridFill, true); + server.CfgMan.SetCVar(CCVars.GameLobbyFallbackEnabled, false); + server.CfgMan.SetCVar(CCVars.GameLobbyDefaultPreset, "TestPreset"); + + // Initially in the lobby + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); + Assert.That(client.AttachedEntity, Is.Null); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); + + // Try to start nukeops without readying up + await pair.WaitCommand("setgamepreset TestPresetTenPlayers"); + await pair.WaitCommand("startround"); + await pair.RunTicksSync(10); + + // Game should not have started + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); + Assert.That(!client.EntMan.EntityExists(client.AttachedEntity)); + var player = pair.Player!.AttachedEntity; + Assert.That(!entMan.EntityExists(player)); + + // Ready up and start nukeops + await pair.WaitClientCommand("toggleready True"); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.ReadyToPlay)); + await pair.WaitCommand("setgamepreset TestPreset"); + await pair.WaitCommand("startround"); + await pair.RunTicksSync(10); + + // Game should have started + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.JoinedGame)); + Assert.That(client.EntMan.EntityExists(client.AttachedEntity)); + player = pair.Player!.AttachedEntity!.Value; + Assert.That(entMan.EntityExists(player)); + + ticker.SetGamePreset((GamePresetPrototype?)null); + server.CfgMan.SetCVar(CCVars.GridFill, false); + server.CfgMan.SetCVar(CCVars.GameLobbyFallbackEnabled, true); + server.CfgMan.SetCVar(CCVars.GameLobbyDefaultPreset, "secret"); + server.System().Run = false; + await pair.CleanReturnAsync(); + } +} + +public sealed class TestRuleSystem : EntitySystem +{ + public bool Run; + + public override void Initialize() + { + SubscribeLocalEvent(OnRoundStartAttempt); + } + + private void OnRoundStartAttempt(RoundStartAttemptEvent args) + { + if (!Run) + return; + + if (args.Forced || args.Cancelled) + return; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out _, out _, out var gameRule)) + { + var minPlayers = gameRule.MinPlayers; + if (args.Players.Length >= minPlayers) + continue; + + args.Cancel(); + } + } +} + +[RegisterComponent] +public sealed partial class TestRuleComponent : Component; From 55177fc388e497ee70714d512b754095a13b67b2 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sat, 27 Apr 2024 01:13:39 -0400 Subject: [PATCH 50/66] Hide disposal unit "Jump inside" verb for mobs that won't fit (#27367) Hide "Jump inside" verb showing for mobs that won't fit --- .../Disposal/Unit/EntitySystems/DisposalUnitSystem.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index 21e152c103..416e0744b5 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -143,6 +143,9 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem return; } + if (!CanInsert(uid, component, args.User)) + return; + // Add verb to climb inside of the unit, Verb verb = new() { From bebcc70c7d4ddc305a88667a49a4b2afef3adf7c Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 27 Apr 2024 05:14:19 +0000 Subject: [PATCH 51/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bcd2b08f73..a18dca1d0d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: PotentiallyTom - changes: - - message: Added new covers for the medical, security, and science guidebooks - type: Add - id: 5951 - time: '2024-02-16T23:50:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25232 - author: PJB3005 changes: - message: Fix some rounding issues with complex chemical reactions. @@ -3855,3 +3848,11 @@ id: 6450 time: '2024-04-26T22:58:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27361 +- author: AllenTheGreat + changes: + - message: The Agent ID card will no longer reset the selected job icon between + UI loads + type: Fix + id: 6451 + time: '2024-04-27T05:13:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27379 From defb8dd941cc97e8a5584623cd5a7113b7863b31 Mon Sep 17 00:00:00 2001 From: vorkathbruh <152932728+vorkathbruh@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:44:59 -0700 Subject: [PATCH 52/66] Adjusts price of SWAT crate (#27365) Adjusts price of SWAT crate in cargo_security.yml from 5500 to 7500. --- Resources/Prototypes/Catalog/Cargo/cargo_security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index 62942d9ea5..040efebe7a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -34,7 +34,7 @@ sprite: Clothing/OuterClothing/Armor/riot.rsi state: icon product: CrateSecurityRiot - cost: 5500 + cost: 7500 category: cargoproduct-category-name-security group: market From 87cd1bb0efc126ff69e861f5bf9b4d312191aeaf Mon Sep 17 00:00:00 2001 From: Vyacheslav Kovalevsky <40753025+Slava0135@users.noreply.github.com> Date: Sat, 27 Apr 2024 08:46:50 +0300 Subject: [PATCH 53/66] add cancer mouse for real (#26768) * cancer mouse * minor tweaks * less radioactive * less common * i forgor * even more rare --- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 35 +++++++++++++++++++ Resources/Prototypes/GameRules/events.yml | 4 +++ 2 files changed, 39 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index ab6afb5403..ad5b51d998 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1720,6 +1720,41 @@ Dead: Base: splat-2 +- type: entity + name: cancer mouse + description: Toxic. Squeak! + parent: MobMouse + id: MobMouseCancer + components: + - type: Sprite + color: LightGreen + - type: PointLight + color: LightGreen + radius: 5 + energy: 5 + netsync: false + - type: RadiationSource + intensity: 0.3 + - type: Bloodstream + bloodReagent: UnstableMutagen + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: UncookedAnimalProteins + Quantity: 3 + - ReagentId: Uranium + Quantity: 10 + - type: Butcherable + spawned: + - id: FoodMeatRat + amount: 1 + - id: SheetUranium1 + amount: 1 + - type: Damageable + damageContainer: Biological + damageModifierSet: Zombie + - type: entity name: lizard #Weh parent: SimpleMobBase diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 45519e840d..a5777a7b4d 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -199,6 +199,8 @@ prob: 0.02 - id: MobMouse2 prob: 0.02 + - id: MobMouseCancer + prob: 0.001 specialEntries: - id: SpawnPointGhostRatKing prob: 0.005 @@ -332,6 +334,8 @@ prob: 0.02 - id: MobMouse2 prob: 0.02 + - id: MobMouseCancer + prob: 0.001 - type: entity id: SlimesSpawn From 0215292baaa50044189ffa5176431a99942e93bd Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 27 Apr 2024 01:47:38 -0400 Subject: [PATCH 54/66] welding gas mask (#27108) * welding gas mask * eek --- .../Entities/Clothing/Masks/specific.yml | 29 +++++++++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Prototypes/Recipes/Lathes/devices.yml | 10 +++- Resources/Prototypes/Research/industrial.yml | 1 + .../welding-gas.rsi/equipped-MASK-vox.png | Bin 0 -> 693 bytes .../Mask/welding-gas.rsi/equipped-MASK.png | Bin 0 -> 599 bytes .../Clothing/Mask/welding-gas.rsi/icon-up.png | Bin 0 -> 457 bytes .../Clothing/Mask/welding-gas.rsi/icon.png | Bin 0 -> 480 bytes .../Mask/welding-gas.rsi/inhand-left.png | Bin 0 -> 553 bytes .../Mask/welding-gas.rsi/inhand-right.png | Bin 0 -> 550 bytes .../Clothing/Mask/welding-gas.rsi/meta.json | 49 ++++++++++++++++++ .../welding-gas.rsi/up-equipped-MASK-vox.png | Bin 0 -> 624 bytes .../Mask/welding-gas.rsi/up-equipped-MASK.png | Bin 0 -> 539 bytes .../Mask/welding-gas.rsi/up-inhand-left.png | Bin 0 -> 461 bytes .../Mask/welding-gas.rsi/up-inhand-right.png | Bin 0 -> 474 bytes 15 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-left.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png diff --git a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml index 7f758a27d2..c3a07fa8e9 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml @@ -33,3 +33,32 @@ - type: HideLayerClothing slots: - Snout + +- type: entity + parent: ClothingMaskBase + id: ClothingMaskWeldingGas + name: welding gas mask + description: A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd. + components: + - type: Sprite + sprite: Clothing/Mask/welding-gas.rsi + state: icon + - type: Clothing + sprite: Clothing/Mask/welding-gas.rsi + - type: BreathMask + - type: IngestionBlocker + - type: IdentityBlocker + - type: FlashImmunity + - type: EyeProtection + - type: PhysicalComposition + materialComposition: + Steel: 200 + Glass: 100 + - type: StaticPrice + price: 100 + - type: Tag + tags: + - WhitelistChameleon + - type: HideLayerClothing + slots: + - Snout diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 9ad3214dc3..1bfb67f66a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -287,6 +287,7 @@ - PowerCellMicroreactor - PowerCellHigh - WeaponPistolCHIMP + - ClothingMaskWeldingGas - WeaponGauntletGorilla - SynthesizerInstrument - ClothingShoesBootsMagSci diff --git a/Resources/Prototypes/Recipes/Lathes/devices.yml b/Resources/Prototypes/Recipes/Lathes/devices.yml index 8b748f3fe5..6a786f2b24 100644 --- a/Resources/Prototypes/Recipes/Lathes/devices.yml +++ b/Resources/Prototypes/Recipes/Lathes/devices.yml @@ -76,7 +76,7 @@ Steel: 100 Plastic: 200 Glass: 100 - + - type: latheRecipe id: SignallerAdvanced result: RemoteSignallerAdvanced @@ -175,6 +175,14 @@ Plasma: 1500 Uranium: 150 +- type: latheRecipe + id: ClothingMaskWeldingGas + result: ClothingMaskWeldingGas + completetime: 3 + materials: + Steel: 600 + Glass: 200 + - type: latheRecipe id: WeaponForceGun result: WeaponForceGun diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index 30345a5dfc..ccc6e9c0f4 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -14,6 +14,7 @@ - BorgModuleMining - OreProcessorIndustrialMachineCircuitboard - OreBagOfHolding + - ClothingMaskWeldingGas - type: technology id: AdvancedPowercells diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..e6028f3a4c1bc09fa3f14b022b923c168fa29317 GIT binary patch literal 693 zcmV;m0!safP)Px%Z%IT!RCt{2+P`ZeK@2b zp=Hn_9=U*Nl3w(xfSVBmS8Xr(1Kt&~o2(GYjB7yhK9#fUjI;A&2Ye3@LYQi|+q|m0 zX`N2zZdKXD7n@3%Oy+)7d7FGStw2P~%!yfNW)Kngdc91#-P=5)0U#o7Hkw_?>Wx>RO`gPkIGZ6 z4=-9RqX{q`fbn>Yp9crf-yWf7GdR1uDCa%g-rkxvWz6*9-ot7IWOF%`Juk5hJ`Eyb zr4;KR;9sp4>mXpI6cf>h9))Q!J_g@<$!+5a0035y(YV`l900&zFgSEwH*w$h{ZwKFzV9cZPLs(5M@L8Zz#=eu z(P~xG_?@*75nuQFtb>4c5O5fVyxegczVCAwhH<;s{eG%pII9eiWkkfT>%u7(kH%Od7$olbVF>(PeBP;^fh-ay zh=_NpXYivugnhuz=M&$Fas+Jh0wSr!^P*L7QmX-2%-DE1gr3bX8jXyDr$oe+N@bCM z;CXnS&jA3J-7Y4RNov7Z>lLu9*Xw17h%dWc0KiGD7UvL*MkA{>Pft$)0MGL|qIT1K zcp$|U5P7{fqZRS}_}Dmltd!#4S6A_jN74?%Z#1N>l!^z#W&mvK3L%6LLI@#*5JCtc b#9RIYrsfj`+4PE300000NkvXXu0mjf8jU@K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0a7ea70d131b8cbc7b28a80507425f50119dfb GIT binary patch literal 599 zcmV-d0;v6oP)Px%5lKWrRCt{2+C6LAKo|$`e@n@32!$BDxe+Ju)PTvFE;4v187}lYbnD`PhBGll z-8@alCORGV9Q3|trY6iyrP>vSyu1VMmNYfOpR_hjcs1Tn=(VK1Le?&@YjWPCWG_v`` z%A}OCSEG?N#@J2tBse!nER#~&vu+mva9yjx?6pg6l#o(dv)9ITtp)%%>vjw0bM6nw zn-l;bj^o96dp?K0o8eoL**w9kyRY!(b)Z^ZjO9H->oiCdBBiuSDXX*08e=wgTdvBN z=h0bal~RTC72d6U0>1C#-N^~w9v_!hDi=c7FPE42d~ty^O#z^AQ^v+7y4)mD<_46V lgNTTTh=_=Yh=}N)_7hTF>~O6xcQ60|002ovPDHLkV1ho{8At#C literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png new file mode 100644 index 0000000000000000000000000000000000000000..352e536ca9165cbcef94f785ff9c0cefee8986c0 GIT binary patch literal 457 zcmV;)0XF`LP)Px$gGod|R9J=Wl`W3zFc5&ht{$waf--}WsK8*(P!$^V6eR||M|nX`P*&v*;Xwrk zPk~K9QB|3H!79~uH=E}~dT8^Zi9Mdb%xGX_WaPIq8S+R(LfiS}a_Mca*Mr8fwYK#> zP1D|iL@SC&u-2lrMk&>*Q&kntInp$Z4&p5~0HD)3fKm#rHOu8P+GbP$P4->RKL=rq z`LR#F@+U?KKC)l0*8ohXQvhbO832#R0|4(m0H@O_*6hD4(3ZXT9`8MMT~pWf^SePQ zg|#-S3egn+xL&WZO&e8y=-Gt-gU*aZB&?Ezzh%ksc>LCcyWNh(V!`2XcsZ}Civ51i zDoFr1XW2wVLfdGzR-pNJt0du^WfK7B+>1_86x?n%oO2XK@p9Mbp0jMy<-C)x4J0BV z&+|~0Whl!s7-NFgI%utfG3I%m=Xr=7!QOlhLTmkW+Q>tk_g)?%60$67z1wcLIOlrV z96SY^&8AiE%iwi{GyB5O#hc00000NkvXXu0mjfKDg1r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb8d4b7c7e914cd00178f2028ff57105208273e GIT binary patch literal 480 zcmV<60U!Q}P)Px$nn^@KR9J=Wl_8HJF%-vtY)%q_z*S%-h;CA|Uw|Mh2=>e>Oa&id)fzma{t|MA zG^f^&A4PH%m$73|gy4JPG8f& z0IG}J@6WG%yw4CqV2r_98}9W&^c$#oc>#F68v97Bmu%pDHoF>26^A=xsFVt$EaOjE zvRbXaG~s+cXD}GBTrSV{tEytLSTM>m05;Bblv0hKqj3uA4jyG08|OLz-utthqA1wy zc6je8isCF*=Wd+q+!DXZ$)?TSUS@H00005s$V$PaTW`agf##~=s?p^ta1`>{{| z^=qrh^J~rfUhfh*zR{=2p~ujOld1D@#HyMdXV*;Mvq|vLu5}gj+SjiZ-4Idzk?+Tj zt*sX`T0U09WUSZ8Hk)l*X)eLzl`8u2R@j7VQpf+=T{6Ev@!q{fn|F8r-EP~G7@?VM zA>-s8_%Av=pa1&joommZjnq8wxRZmyqObXH96y6Vo8ln@ozkTGwA588e@neIJtw>D zn={XAmdc_jt7_7x1{rZS{aHErt4wyd!snMySQs|!*tv3UX<1#Ib#n&-tO(rq-u%+Z zyA_iaCYX3i<)*LSY}lW$*7TcW_DsEomw)vcau@7vdS1z(;A>*C+3Z*UZfl8T7k9yJ z6 zv(nlY2+UslQEAif{GOBZwd(g>^K;i!y_;tquRq;e#q-h&gXSPFJ$=1`%F@=u&CD`# pvQzIB7cbZ4`XTPBzUcpH<}<5xEiM#24h60@?kEP)Px$;7LS5RCt{2+ObRHP#g#F@4?}6yTd`@K*4)MCj-I1pc&*8hxb>wxkhy8pu3Yp zrURja(cTTOf50Jy=#UPt0fmEu3~u7q<>#OYMH@Y9(q{O6AkZ}Ay)Um#mhS_Ih=_=Y zh=_=Yi0F~lTC&eU5Xks>T|Lh@b!M%##BnU$FqAY+r5lD4$8oI}VVcaJiU#t1A4j7R za5;8i71&-_K)c;Wr_-5u@4RH0d%fO^YpqtRF!Sf40i!6wzULwO*GF=Fjg{qPtbF;7 zKNlAzM=wtlMfkD4j$}B@zjIs{#+br;CN99!N(lgXo(IQu0RYAr7-MSp>jN({XFil! zDJ6-ua(HkciM67Xs_pZiQA$ZS4D;iy%!Q9YW_NE70C0JARZ_(2{X99DcLX9LA|fIp zA|fIpBBJSNttAM8dbCor-ZL;>c_-FNHw;Ui?_GsqRzd&0xq;)li28keTUx5DE`P12 zKX#l_=6kanoEYY|f#1JU01coqg75nPAXO|vQB8kb()j9Q{jyQXiQ~&?~07*qoM6N<$g7n$|DgXcg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json b/Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json new file mode 100644 index 0000000000..8e9b857325 --- /dev/null +++ b/Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json @@ -0,0 +1,49 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/6f5ca45e3ac06b30fb1957042214a888d8c01722. Inhands, worn sprites, and vox sprites created by EmoGarbage404 (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon-up" + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "up-equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, + { + "name": "up-equipped-MASK-vox", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "up-inhand-left", + "directions": 4 + }, + { + "name": "up-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..90871d7d00628e657fa43cd41161c429bcf495c0 GIT binary patch literal 624 zcmV-$0+0QPP)Px%DoI2^RCt{2+Odk_KpY0}&*R#~msmDCf}N6nt?Z61{z1HluynzGbDdA1&4HL= zxh^)^FR>GhBff;}1I!f?&)lip#Bte$@7E0>Lo)xF3FI4qh-?i819Pr@ZNuSkdaiBb zOOcyOrPAzN`!o4!dxMA=V@$5<#u$i*iK3|F_VKRIY5+vU^m;u6LGaJD@pudX?=lE$ ztsVo zjvp$OO78k{xx6?q5fO8&-)6Hp19rjaa~L*?_U|mr5E1je)q;0_4`7!cb~+sZ#Z#j! zZtM5^c-w9P0D85;&(X+P66K_mtV*pQz)iV~Mk8O4qN$NmDwj7-r&GLbw-}AbPG%QS zFdYW|Wc2_L$8qkOtC;LaKe++P&IlAa7m#tf1hQEG?3Td%^%Z)vL6Ria)e;d?uh;kI z53(iTviiUUGvIGg6qQ88jCMz5&3?EyC%>mlcf?%_FsY({*0 ze6(H`N-6W}Px$)k#D_RCt{2+OcZmKoADt|KJ|QM6AHBV%+B%yE{^BxHoaYg$hG-FJYG)c)b4_xemn9=O6T+9MQIl#*_@ zTaSyPfHCHCtUeJD5fKp)5fKp)5z)V@Q8(vuJbtLUvssp%#c>P(D9bWE$U%hd!}<%0Ilk(asCv9)y%QR9CQ~Qxws%UXK&(WmsrUqi2=PKgwq5hG_pB3Q z={}N@w6w;4#?h1qrwx8?uH;uxf`LU@J%&=Q6X%_Kof13izHD+&*NK}eHWeoKEX!Q= z+9K@z-gS>7E}N{KQY!qjtv-5p*<;1crz&_vx7>a^!E*V{j~#D*OZ%@CtNLrVX6w{V zd%o|wo!6c1|JKaRQz&b9s{*^h{PXe*8Vo#a%wK-hGBj)zyLPK)Z&27euWM&JJJQa* zJpOxk+PRe-A$75?F4qfVdaNR+v;1Z$%Ad^1@F08t`ng{%=UzL9aIKP3R)~n}_vn+k zK^>QVm^yt^Hd%CXR^5uamV~Vb1D1X?>M^vE>%aK6?7Y^|%{P4*Gj3`XZD78k!WlPj ze)iO3>kDr=Pmr$)wq;q`qSHHlV*USnzmr0K{$#7RQd%_EZ}|*)K6Z=eQn_gYg0XsH y5$nPv_U%iukczE6|NHGWjfeVtb36V`m;ZHK^5{;je|5n4VeoYIb6Mw<&;$T8GRe{a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..1362d990110d6d49356c5d116fdad55dc9984a75 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zr+B(JhE&XX zduyZDVFwwu5B?tlTfW(EnLHu<-*_ z)SEIZLVEIyhrbUxUcRuqU-|4OSqB$5i0?6!vO8Y5X7}~lt@AgQr6u=to!EZyxv#;o zjA^O6{Di*Vdu`=ua(dHa?v@in~!{n1J&jVQ)He5RtCH?OEsk&zm z{Aaql6hHs+>{nFr^AMM+?=Rj93&yH@8uF#C`@_u={@Ie@LF(pAjilds@8A8iW)ehz zK-*&yy^nXuuMN4L&UPy6m)Uh|E1%ivY;~*l%r4p>eTUb0_E`hD{{36mbRTtM%#dDN z80u>;keRYJKHq^u_}6!VX955JiKm+WJ^uUm|G9x2`pWNX4R=-WZ;8At|5u{3!|u-g z$BA1HeR;%m`Lwsi^C(*bMI|e#-mceg%WmJ8wbg9FS_2oC*xxK$>?Hq(?}!uxMizso LtDnm{r-UW|_#4;7 literal 0 HcmV?d00001 From f898e72e575942bd8312c6c4ac8e5a634fa8e897 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 27 Apr 2024 05:48:44 +0000 Subject: [PATCH 55/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a18dca1d0d..fe0784a26b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,18 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: Fix some rounding issues with complex chemical reactions. - type: Fix - id: 5952 - time: '2024-02-16T23:54:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25199 -- author: data_redacted - changes: - - message: New lobby art (of an Air Alarm blueprint). - type: Add - id: 5953 - time: '2024-02-17T02:52:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25179 - author: Lank changes: - message: Diona nymphs, small cat-like creatures, several of which make up a Diona. @@ -3856,3 +3842,17 @@ id: 6451 time: '2024-04-27T05:13:13.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27379 +- author: Slava0135 + changes: + - message: added cancer mouse! (for real this time) + type: Add + id: 6452 + time: '2024-04-27T05:46:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26768 +- author: EmoGarbage404 + changes: + - message: Added the welding gas mask to salvage equipment research. + type: Add + id: 6453 + time: '2024-04-27T05:47:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27108 From 36abf1d9ba67ab26c648ae278d6cc80b74691ccc Mon Sep 17 00:00:00 2001 From: Vigers Ray <60344369+VigersRay@users.noreply.github.com> Date: Sat, 27 Apr 2024 08:58:09 +0300 Subject: [PATCH 56/66] Fix stupid NPC. (#26868) * init commit * Review --------- Co-authored-by: metalgearsloth --- .../Preconditions/InContainerPrecondition.cs | 27 ++++ .../Operators/Combat/ContainerOperator.cs | 40 +++++ .../Operators/Combat/EscapeOperator.cs | 140 ++++++++++++++++++ .../Operators/Combat/UnPullOperator.cs | 35 +++++ .../Operators/Combat/UnbuckleOperator.cs | 34 +++++ Resources/Prototypes/NPCs/Combat/melee.yml | 38 +++++ 6 files changed, 314 insertions(+) create mode 100644 Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs diff --git a/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs new file mode 100644 index 0000000000..aa0ad98ede --- /dev/null +++ b/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs @@ -0,0 +1,27 @@ +using Robust.Server.Containers; + +namespace Content.Server.NPC.HTN.Preconditions; + +/// +/// Checks if the owner in container or not +/// +public sealed partial class InContainerPrecondition : HTNPrecondition +{ + private ContainerSystem _container = default!; + + [ViewVariables(VVAccess.ReadWrite)] [DataField("isInContainer")] public bool IsInContainer = true; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _container = sysManager.GetEntitySystem(); + } + + public override bool IsMet(NPCBlackboard blackboard) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + + return IsInContainer && _container.IsEntityInContainer(owner) || + !IsInContainer && !_container.IsEntityInContainer(owner); + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs new file mode 100644 index 0000000000..667d0b8ec4 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs @@ -0,0 +1,40 @@ +using Robust.Server.Containers; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; + +public sealed partial class ContainerOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private ContainerSystem _container = default!; + private EntityQuery _transformQuery; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + [DataField("targetKey", required: true)] + public string TargetKey = default!; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _container = sysManager.GetEntitySystem(); + _transformQuery = _entManager.GetEntityQuery(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + + if (!_container.TryGetOuterContainer(owner, _transformQuery.GetComponent(owner), out var outerContainer) && outerContainer == null) + return; + + var target = outerContainer.Owner; + blackboard.SetValue(TargetKey, target); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + return HTNOperatorStatus.Finished; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs new file mode 100644 index 0000000000..a794e1e314 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs @@ -0,0 +1,140 @@ +using System.Threading; +using System.Threading.Tasks; +using Content.Server.NPC.Components; +using Content.Server.Storage.EntitySystems; +using Content.Shared.CombatMode; +using Robust.Server.Containers; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat.Melee; + +public sealed partial class EscapeOperator : HTNOperator, IHtnConditionalShutdown +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private ContainerSystem _container = default!; + private EntityStorageSystem _entityStorage = default!; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + [DataField("targetKey", required: true)] + public string TargetKey = default!; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _container = sysManager.GetEntitySystem(); + _entityStorage = sysManager.GetEntitySystem(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + var target = blackboard.GetValue(TargetKey); + + if (_entityStorage.TryOpenStorage(owner, target)) + { + TaskShutdown(blackboard, HTNOperatorStatus.Finished); + return; + } + + var melee = _entManager.EnsureComponent(owner); + melee.MissChance = blackboard.GetValueOrDefault(NPCBlackboard.MeleeMissChance, _entManager); + melee.Target = target; + } + + public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard, + CancellationToken cancelToken) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) + { + return (false, null); + } + + if (!_container.IsEntityInContainer(owner)) + { + return (false, null); + } + + if (_entityStorage.TryOpenStorage(owner, target)) + { + return (false, null); + } + + return (true, null); + } + + public void ConditionalShutdown(NPCBlackboard blackboard) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + _entManager.System().SetInCombatMode(owner, false); + _entManager.RemoveComponent(owner); + blackboard.Remove(TargetKey); + } + + public override void TaskShutdown(NPCBlackboard blackboard, HTNOperatorStatus status) + { + base.TaskShutdown(blackboard, status); + + ConditionalShutdown(blackboard); + } + + public override void PlanShutdown(NPCBlackboard blackboard) + { + base.PlanShutdown(blackboard); + + ConditionalShutdown(blackboard); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + base.Update(blackboard, frameTime); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + HTNOperatorStatus status; + + if (_entManager.TryGetComponent(owner, out var combat) && + blackboard.TryGetValue(TargetKey, out var target, _entManager)) + { + combat.Target = target; + + // Success + if (!_container.IsEntityInContainer(owner)) + { + status = HTNOperatorStatus.Finished; + } + else + { + if (_entityStorage.TryOpenStorage(owner, target)) + { + status = HTNOperatorStatus.Finished; + } + else + { + switch (combat.Status) + { + case CombatStatus.TargetOutOfRange: + case CombatStatus.Normal: + status = HTNOperatorStatus.Continuing; + break; + default: + status = HTNOperatorStatus.Failed; + break; + } + } + } + } + else + { + status = HTNOperatorStatus.Failed; + } + + // Mark it as finished to continue the plan. + if (status == HTNOperatorStatus.Continuing && ShutdownState == HTNPlanState.PlanFinished) + { + status = HTNOperatorStatus.Finished; + } + + return status; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs new file mode 100644 index 0000000000..54f422fe67 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs @@ -0,0 +1,35 @@ +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; + +public sealed partial class UnPullOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private PullingSystem _pulling = default!; + + private EntityQuery _pullableQuery; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _pulling = sysManager.GetEntitySystem(); + _pullableQuery = _entManager.GetEntityQuery(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + + _pulling.TryStopPull(owner, _pullableQuery.GetComponent(owner), owner); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + return HTNOperatorStatus.Finished; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs new file mode 100644 index 0000000000..207665d786 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs @@ -0,0 +1,34 @@ +using Content.Server.Buckle.Systems; +using Content.Shared.Buckle.Components; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; + +public sealed partial class UnbuckleOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private BuckleSystem _buckle = default!; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _buckle = sysManager.GetEntitySystem(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + if (!_entManager.TryGetComponent(owner, out var buckle) || !buckle.Buckled) + return; + + _buckle.TryUnbuckle(owner, owner, true, buckle); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + return HTNOperatorStatus.Finished; + } +} diff --git a/Resources/Prototypes/NPCs/Combat/melee.yml b/Resources/Prototypes/NPCs/Combat/melee.yml index 122875ed97..e4b207d16e 100644 --- a/Resources/Prototypes/NPCs/Combat/melee.yml +++ b/Resources/Prototypes/NPCs/Combat/melee.yml @@ -17,6 +17,29 @@ - !type:HTNCompoundTask task: PickupMeleeCompound + - preconditions: + - !type:BuckledPrecondition + isBuckled: true + tasks: + - !type:HTNPrimitiveTask + shutdownState: TaskFinished + operator: !type:UnbuckleOperator + + - preconditions: + - !type:InContainerPrecondition + isInContainer: true + tasks: + - !type:HTNCompoundTask + task: EscapeCompound + + - preconditions: + - !type:PulledPrecondition + isPulled: true + tasks: + - !type:HTNPrimitiveTask + shutdownState: TaskFinished + operator: !type:UnPullOperator + # Melee combat (unarmed or otherwise) - tasks: - !type:HTNPrimitiveTask @@ -101,6 +124,21 @@ proto: NearbyMeleeTargets key: Target +- type: htnCompound + id: EscapeCompound + branches: + - tasks: + - !type:HTNPrimitiveTask + shutdownState: TaskFinished + operator: !type:ContainerOperator + targetKey: Target + - !type:HTNPrimitiveTask + operator: !type:EscapeOperator + targetKey: Target + preconditions: + - !type:InContainerPrecondition + isInContainer: true + - type: htnCompound id: MeleeAttackOrderedTargetCompound branches: From b4212a08f4cb335ee723fd5f52b88223465d7a29 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 27 Apr 2024 05:59:15 +0000 Subject: [PATCH 57/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fe0784a26b..d3e2467904 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,17 +1,4 @@ Entries: -- author: Lank - changes: - - message: Diona nymphs, small cat-like creatures, several of which make up a Diona. - type: Add - - message: Diona are now able to split into three nymphs on death, and will control - one of them. The controlled nymph is able to reform into a new diona after some - time. - type: Add - - message: Diona now combust into flames upon being hit with significant heat damage. - type: Tweak - id: 5954 - time: '2024-02-17T02:54:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24630 - author: PolterTzi changes: - message: Seeds from sampled plants now inherit the sampled plant's health to discourage @@ -3856,3 +3843,10 @@ id: 6453 time: '2024-04-27T05:47:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27108 +- author: VigersRay + changes: + - message: Angered NPC now can unbuckle, unpull and escape from containers. + type: Fix + id: 6454 + time: '2024-04-27T05:58:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26868 From 2f7d0dedbded99a8f3f538c887c3c17aaa667501 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 27 Apr 2024 08:03:58 +0200 Subject: [PATCH 58/66] Displacement map prototype (#26709) Requires https://github.com/space-wizards/RobustToolbox/pull/5023 This uses the new engine features (above) to add a displacement map shader. This allows deforming a sprite based on another sprite. Primary use case is automatically adapting human clothing sprites to different species, something we want to make species like Vox a reality. A basic example of wiring this up with Vox has been added. The system is however incredibly simple and **will** need more work by a content developer to select and toggle displacement maps when appropriate. I am leaving that to somebody else. For example right now the displacement map is applied even if a species already has custom-fit sprites for a piece of clothing, such as the grey jumpsuit for Vox. Basic Aseprite plugins to help with authoring displacement maps have also been made. --- .../Clothing/ClientClothingSystem.cs | 24 +++- .../Inventory/InventoryComponent.cs | 10 ++ .../Prototypes/Entities/Mobs/Species/vox.yml | 11 ++ Resources/Prototypes/Shaders/displacement.yml | 10 ++ .../Species/Vox/displacement.rsi/jumpsuit.png | Bin 0 -> 906 bytes .../Species/Vox/displacement.rsi/meta.json | 18 +++ Resources/Textures/Shaders/displacement.swsl | 18 +++ .../Displacement Map Flip.lua | 78 ++++++++++ .../Displacement Map Visualizer.lua | 135 ++++++++++++++++++ 9 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Shaders/displacement.yml create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json create mode 100644 Resources/Textures/Shaders/displacement.swsl create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index 7e78ac7d70..6d13bf4eda 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -11,6 +11,7 @@ using Content.Shared.Item; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.TypeSerializers.Implementations; using Robust.Shared.Utility; using static Robust.Client.GameObjects.SpriteComponent; @@ -46,6 +47,7 @@ public sealed class ClientClothingSystem : ClothingSystem }; [Dependency] private readonly IResourceCache _cache = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; public override void Initialize() @@ -265,6 +267,7 @@ public sealed class ClientClothingSystem : ClothingSystem // temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a // bookmark to determine where in the list of layers we should insert the clothing layers. bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index); + var displacementData = inventory.Displacements.GetValueOrDefault(slot); // add the new layers foreach (var (key, layerData) in ev.Layers) @@ -304,10 +307,29 @@ public sealed class ClientClothingSystem : ClothingSystem // Sprite layer redactor when // Sprite "redactor" just a week away. if (slot == Jumpsuit) - layerData.Shader ??= "StencilDraw"; + layerData.Shader ??= inventory.JumpsuitShader; sprite.LayerSetData(index, layerData); layer.Offset += slotDef.Offset; + + if (displacementData != null) + { + var displacementKey = $"{key}-displacement"; + if (!revealedLayers.Add(displacementKey)) + { + Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}."); + continue; + } + + var displacementLayer = _serialization.CreateCopy(displacementData.Layer, notNullableOverride: true); + displacementLayer.CopyToShaderParameters!.LayerKey = key; + + // Add before main layer for this item. + sprite.AddLayer(displacementLayer, index); + sprite.LayerMapSet(displacementKey, index); + + revealedLayers.Add(displacementKey); + } } RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true); diff --git a/Content.Shared/Inventory/InventoryComponent.cs b/Content.Shared/Inventory/InventoryComponent.cs index 2a8710f0f2..dde48a62aa 100644 --- a/Content.Shared/Inventory/InventoryComponent.cs +++ b/Content.Shared/Inventory/InventoryComponent.cs @@ -13,6 +13,16 @@ public sealed partial class InventoryComponent : Component [DataField("speciesId")] public string? SpeciesId { get; set; } + [DataField] public string JumpsuitShader = "StencilDraw"; + [DataField] public Dictionary Displacements = []; + public SlotDefinition[] Slots = Array.Empty(); public ContainerSlot[] Containers = Array.Empty(); + + [DataDefinition] + public sealed partial class SlotDisplacementData + { + [DataField(required: true)] + public PrototypeLayerData Layer = default!; + } } diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index a271e9d084..cbed5b7995 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -16,6 +16,17 @@ #- type: VoxAccent # Not yet coded - type: Inventory speciesId: vox + jumpsuitShader: DisplacedStencilDraw + displacements: + jumpsuit: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: jumpsuit + copyToShaderParameters: + # Value required, provide a dummy. Gets overridden when applied. + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV - type: Speech speechVerb: Vox speechSounds: Vox diff --git a/Resources/Prototypes/Shaders/displacement.yml b/Resources/Prototypes/Shaders/displacement.yml new file mode 100644 index 0000000000..5c90738008 --- /dev/null +++ b/Resources/Prototypes/Shaders/displacement.yml @@ -0,0 +1,10 @@ +- type: shader + id: DisplacedStencilDraw + kind: source + path: "/Textures/Shaders/displacement.swsl" + stencil: + ref: 1 + op: Keep + func: NotEqual + params: + displacementSize: 127 diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png new file mode 100644 index 0000000000000000000000000000000000000000..2c938634eb635f50d8063794b40b70cf50efb46f GIT binary patch literal 906 zcmV;519kj~P)Px&L`g(JRCt{2T3e3fAPlUc_h8&?GdJU6gZG1wkY{5EL93*sQD>USWvYz<1BU^E z2gCGspf_FtdOOe?uK>Lr=#5u^-VXG};|2JmdRuJxq|>!s1#bbKvEdx;a-{0-j!F2Kr|9PAvp{{AWv*8B&rZAL~W|9K8b zjnK_3d&c+L#n$D79sZ*fAV3lSX#@x(v4ddcOp4@x!Ujj^=HXI^L;e$_{5j$uMnEK- zKDi3>1LK@>ft?%@e0N06e}FZAuyM?0|$PRzH9m~e!BcND-ITGweu6#%OtMBpeEs(z9zlwli2>ZRi zgIjE~e#ZY}y9Pz;00Rp__(f!VHWw{^&LFT;2V)*c#y`S?Q}yRv2=#WLH(mjHJJ1`i z0KFaPjaPu)4)n$=KyL?n;}xK{1HJKh0n`LCXmUZ~#PC$9rITAk5KA!Z`46j63K6R60frV3OvRBq5eqROV5FS8I0=ea zKmh+ccV5`;TmTr)2584;2lIyZm;?n*7-xWV z8G82+7`cTGgp<3H;J5@2LIfkOz)T(dv?f?|ynO@+9EJh(DH$z1LWq7Eit!6Ko;D9EW3b5P*-5v^21r`vNL^McZMn#+vAp&n39P4}D3jkf;eR g@Z<4C(Z>t$4>*xVl;3MdQ~&?~07*qoM6N<$f}Qh~qW}N^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json new file mode 100644 index 0000000000..6ea6c552b9 --- /dev/null +++ b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by PJB3005", + "size": { + "x": 32, + "y": 32 + }, + "load": { + "srgb": false + }, + "states": [ + { + "name": "jumpsuit", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Shaders/displacement.swsl b/Resources/Textures/Shaders/displacement.swsl new file mode 100644 index 0000000000..ba5ca57852 --- /dev/null +++ b/Resources/Textures/Shaders/displacement.swsl @@ -0,0 +1,18 @@ +uniform sampler2D displacementMap; +uniform highp float displacementSize; +uniform highp vec4 displacementUV; + +varying highp vec2 displacementUVOut; + +void vertex() { + displacementUVOut = mix(displacementUV.xy, displacementUV.zw, tCoord2); +} + +void fragment() { + highp vec4 displacementSample = texture2D(displacementMap, displacementUVOut); + highp vec2 displacementValue = (displacementSample.xy - vec2(128.0 / 255.0)) / (1.0 - 128.0 / 255.0); + COLOR = zTexture(UV + displacementValue * TEXTURE_PIXEL_SIZE * displacementSize * vec2(1.0, -1.0)); + COLOR.a *= displacementSample.a; +} + + diff --git a/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua b/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua new file mode 100644 index 0000000000..3291685071 --- /dev/null +++ b/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua @@ -0,0 +1,78 @@ +local sprite = app.editor.sprite +local cel = app.cel + +if sprite.selection.isEmpty then + print("You need to select something sorry") + return +end + +local diag = Dialog{ + title = "Flip Displacement Map" +} + +diag:check{ + id = "horizontal", + label = "flip horizontal?" +} + +diag:check{ + id = "vertical", + label = "flip vertical?" +} + +diag:button{ + text = "ok", + focus = true, + onclick = function(ev) + local horizontal = diag.data["horizontal"] + local vertical = diag.data["vertical"] + + local selection = sprite.selection + local image = cel.image:clone() + + for x = 0, selection.bounds.width do + for y = 0, selection.bounds.height do + local xSel = x + selection.origin.x + local ySel = y + selection.origin.y + + local xImg = xSel - cel.position.x + local yImg = ySel - cel.position.y + + if xImg < 0 or xImg >= image.width or yImg < 0 or yImg >= image.height then + goto continue + end + + local imgValue = image:getPixel(xImg, yImg) + local color = Color(imgValue) + + if horizontal then + color.red = 128 + -(color.red - 128) + end + + if vertical then + color.green = 128 + -(color.green - 128) + end + + image:drawPixel( + xImg, + yImg, + app.pixelColor.rgba(color.red, color.green, color.blue, color.alpha)) + + ::continue:: + end + end + + cel.image = image + + diag:close() + end +} + +diag:button{ + text = "cancel", + onclick = function(ev) + diag:close() + end +} + +diag:show() diff --git a/Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua b/Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua new file mode 100644 index 0000000000..b16ab797e7 --- /dev/null +++ b/Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua @@ -0,0 +1,135 @@ +-- Displacement Map Visualizer +-- +-- This script will create a little preview window that will test a displacement map. +-- +-- TODO: Handling of sizes != 127 doesn't work properly and rounds differently from the real shader. Ah well. + +local scale = 4 + +-- This script requires UI +if not app.isUIAvailable then + return +end + +local getOffsetPixel = function(x, y, image, rect) + local posX = x - rect.x + local posY = y - rect.y + + if posX < 0 or posX >= image.width or posY < 0 or posY >= image.height then + return image.spec.transparentColor + end + + return image:getPixel(posX, posY) +end + +local pixelValueToColor = function(sprite, value) + return Color(value) +end + +local applyDisplacementMap = function(width, height, size, displacement, displacementRect, target, targetRect) + -- print(Color(displacement:getPixel(17, 15)).red) + local image = target:clone() + image:resize(width, height) + image:clear() + + for x = 0, width - 1 do + for y = 0, height - 1 do + local value = getOffsetPixel(x, y, displacement, displacementRect) + local color = pixelValueToColor(sprite, value) + + if color.alpha ~= 0 then + local offset_x = (color.red - 128) / 127 * size + local offset_y = (color.green - 128) / 127 * size + + local colorValue = getOffsetPixel(x + offset_x, y + offset_y, target, targetRect) + image:drawPixel(x, y, colorValue) + end + end + end + + return image +end + +local dialog = nil + +local sprite = app.editor.sprite +local spriteChanged = sprite.events:on("change", + function(ev) + dialog:repaint() + end) + +local layers = {} +for i,layer in ipairs(sprite.layers) do + table.insert(layers, 1, layer.name) +end + +local findLayer = function(sprite, name) + for i, layer in ipairs(sprite.layers) do + if layer.name == name then + return layer + end + end + + return nil +end + +dialog = Dialog{ + title = "Displacement map preview", + onclose = function(ev) + sprite.events:off(spriteChanged) + end} + +dialog:canvas{ + id = "canvas", + width = sprite.width * scale, + height = sprite.height * scale, + onpaint = function(ev) + local context = ev.context + + local layerDisplacement = findLayer(sprite, dialog.data["displacement-select"]) + local layerTarget = findLayer(sprite, dialog.data["reference-select"]) + -- print(layerDisplacement.name) + -- print(layerTarget.name) + local celDisplacement = layerDisplacement:cel(1) + local celTarget = layerTarget:cel(1) + local image = applyDisplacementMap( + sprite.width, sprite.height, + dialog.data["size"], + celDisplacement.image, celDisplacement.bounds, + celTarget.image, celTarget.bounds) + + context:drawImage(image, 0, 0, image.width, image.height, 0, 0, image.width * scale, context.width, context.height) + end +} + +dialog:combobox{ + id = "displacement-select", + label = "displacement layer", + options = layers, + onchange = function(ev) + dialog:repaint() + end +} + +dialog:combobox{ + id = "reference-select", + label = "reference layer", + options = layers, + onchange = function(ev) + dialog:repaint() + end +} + + +dialog:slider{ + id = "size", + label = "displacement size", + min = 1, + max = 127, + value = 127, + onchange = function(ev) + dialog:repaint() + end +} + +dialog:show{wait = false} From 257b04d27793b8c8853af57a9f53d361062d5d61 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sat, 27 Apr 2024 08:04:51 +0200 Subject: [PATCH 59/66] Vox sprite rework (#26985) weh --- .../UI/HumanoidProfileEditor.xaml.cs | 26 ++++ .../Humanoid/HumanoidCharacterAppearance.cs | 6 +- Content.Shared/Humanoid/SkinColor.cs | 69 ++++++++- Resources/Prototypes/Body/Parts/vox.yml | 8 +- .../Mobs/Customization/Markings/vox_parts.yml | 145 ++++++++++++++++++ .../Prototypes/Entities/Mobs/Species/vox.yml | 43 ++++++ Resources/Prototypes/Species/vox.yml | 51 +++--- .../Effects/creampie.rsi/creampie_vox.png | Bin 0 -> 585 bytes .../Textures/Effects/creampie.rsi/meta.json | 6 +- .../Mobs/Customization/eyes.rsi/meta.json | 2 +- .../Customization/eyes.rsi/vox_eyes_s.png | Bin 125 -> 0 bytes .../Mobs/Customization/vox_parts.rsi/beak.png | Bin 0 -> 396 bytes .../Customization/vox_parts.rsi/l_arm.png | Bin 0 -> 342 bytes .../Customization/vox_parts.rsi/l_foot.png | Bin 0 -> 315 bytes .../Customization/vox_parts.rsi/l_hand.png | Bin 0 -> 349 bytes .../Customization/vox_parts.rsi/l_leg.png | Bin 0 -> 415 bytes .../Customization/vox_parts.rsi/meta.json | 55 +++++++ .../Customization/vox_parts.rsi/r_arm.png | Bin 0 -> 302 bytes .../Customization/vox_parts.rsi/r_foot.png | Bin 0 -> 305 bytes .../Customization/vox_parts.rsi/r_hand.png | Bin 0 -> 354 bytes .../Customization/vox_parts.rsi/r_leg.png | Bin 0 -> 422 bytes .../Mobs/Customization/vox_parts.rsi/tail.png | Bin 0 -> 590 bytes .../vox_parts.rsi/tail_stenciled.png | Bin 0 -> 615 bytes .../Mobs/Species/Vox/parts.rsi/eyes.png | Bin 0 -> 925 bytes .../Mobs/Species/Vox/parts.rsi/full.png | Bin 0 -> 789 bytes .../Mobs/Species/Vox/parts.rsi/groin.png | Bin 0 -> 361 bytes .../Mobs/Species/Vox/parts.rsi/groin_f.png | Bin 318 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/groin_m.png | Bin 318 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/head.png | Bin 0 -> 689 bytes .../Mobs/Species/Vox/parts.rsi/head_f.png | Bin 737 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/head_m.png | Bin 737 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/l_arm.png | Bin 385 -> 399 bytes .../Mobs/Species/Vox/parts.rsi/l_foot.png | Bin 255 -> 9030 bytes .../Mobs/Species/Vox/parts.rsi/l_hand.png | Bin 337 -> 9080 bytes .../Mobs/Species/Vox/parts.rsi/l_leg.png | Bin 596 -> 544 bytes .../Mobs/Species/Vox/parts.rsi/meta.json | 21 +-- .../Mobs/Species/Vox/parts.rsi/r_arm.png | Bin 391 -> 387 bytes .../Mobs/Species/Vox/parts.rsi/r_foot.png | Bin 252 -> 9026 bytes .../Mobs/Species/Vox/parts.rsi/r_hand.png | Bin 354 -> 9085 bytes .../Mobs/Species/Vox/parts.rsi/r_leg.png | Bin 591 -> 549 bytes .../Mobs/Species/Vox/parts.rsi/torso.png | Bin 0 -> 866 bytes .../Mobs/Species/Vox/parts.rsi/torso_f.png | Bin 1038 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/torso_m.png | Bin 1038 -> 0 bytes 43 files changed, 392 insertions(+), 40 deletions(-) create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml create mode 100644 Resources/Textures/Effects/creampie.rsi/creampie_vox.png delete mode 100644 Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/tail.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_m.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/head.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/head_f.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/torso.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 213eb0b662..70b7608f6d 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -697,6 +697,20 @@ namespace Content.Client.Preferences.UI var color = SkinColor.TintedHues(_rgbSkinColorSelector.Color); + CMarkings.CurrentSkinColor = color; + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); + break; + } + case HumanoidSkinColor.VoxFeathers: + { + if (!_rgbSkinColorContainer.Visible) + { + _skinColor.Visible = false; + _rgbSkinColorContainer.Visible = true; + } + + var color = SkinColor.ClosestVoxColor(_rgbSkinColorSelector.Color); + CMarkings.CurrentSkinColor = color; Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); break; @@ -908,6 +922,18 @@ namespace Content.Client.Preferences.UI _rgbSkinColorSelector.Color = Profile.Appearance.SkinColor; break; } + case HumanoidSkinColor.VoxFeathers: + { + if (!_rgbSkinColorContainer.Visible) + { + _skinColor.Visible = false; + _rgbSkinColorContainer.Visible = true; + } + + _rgbSkinColorSelector.Color = SkinColor.ClosestVoxColor(Profile.Appearance.SkinColor); + + break; + } } } diff --git a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs index 44fcef9c4f..fbbf4ecf72 100644 --- a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs @@ -104,7 +104,8 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance HumanoidSkinColor.HumanToned => Humanoid.SkinColor.HumanSkinTone(speciesPrototype.DefaultHumanSkinTone), HumanoidSkinColor.Hues => speciesPrototype.DefaultSkinTone, HumanoidSkinColor.TintedHues => Humanoid.SkinColor.TintedHues(speciesPrototype.DefaultSkinTone), - _ => Humanoid.SkinColor.ValidHumanSkinTone + HumanoidSkinColor.VoxFeathers => Humanoid.SkinColor.ClosestVoxColor(speciesPrototype.DefaultSkinTone), + _ => Humanoid.SkinColor.ValidHumanSkinTone, }; return new( @@ -166,6 +167,9 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance case HumanoidSkinColor.TintedHues: newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor); break; + case HumanoidSkinColor.VoxFeathers: + newSkinColor = Humanoid.SkinColor.ProportionalVoxColor(newSkinColor); + break; } return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ()); diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 960f910a32..2dc95fcf07 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -1,3 +1,6 @@ +using System.Security.Cryptography; +using Microsoft.VisualBasic.CompilerServices; + namespace Content.Shared.Humanoid; public static class SkinColor @@ -7,6 +10,13 @@ public static class SkinColor public const float MinHuesLightness = 0.175f; + public const float MinFeathersHue = 29f / 360; + public const float MaxFeathersHue = 174f / 360; + public const float MinFeathersSaturation = 20f / 100; + public const float MaxFeathersSaturation = 88f / 100; + public const float MinFeathersValue = 36f / 100; + public const float MaxFeathersValue = 55f / 100; + public static Color ValidHumanSkinTone => Color.FromHsv(new Vector4(0.07f, 0.2f, 1f, 1f)); /// @@ -140,11 +150,65 @@ public static class SkinColor return Color.ToHsl(color).Y <= MaxTintedHuesSaturation && Color.ToHsl(color).Z >= MinTintedHuesLightness; } + /// + /// Converts a Color proportionally to the allowed vox color range. + /// Will NOT preserve the specific input color even if it is within the allowed vox color range. + /// + /// Color to convert + /// Vox feather coloration + public static Color ProportionalVoxColor(Color color) + { + var newColor = Color.ToHsv(color); + + newColor.X = newColor.X * (MaxFeathersHue - MinFeathersHue) + MinFeathersHue; + newColor.Y = newColor.Y * (MaxFeathersSaturation - MinFeathersSaturation) + MinFeathersSaturation; + newColor.Z = newColor.Z * (MaxFeathersValue - MinFeathersValue) + MinFeathersValue; + + return Color.FromHsv(newColor); + } + + // /// + // /// Ensures the input Color is within the allowed vox color range. + // /// + // /// Color to convert + // /// The same Color if it was within the allowed range, or the closest matching Color otherwise + public static Color ClosestVoxColor(Color color) + { + var hsv = Color.ToHsv(color); + + hsv.X = Math.Clamp(hsv.X, MinFeathersHue, MaxFeathersHue); + hsv.Y = Math.Clamp(hsv.Y, MinFeathersSaturation, MaxFeathersSaturation); + hsv.Z = Math.Clamp(hsv.Z, MinFeathersValue, MaxFeathersValue); + + return Color.FromHsv(hsv); + } + + /// + /// Verify if this color is a valid vox feather coloration, or not. + /// + /// The color to verify + /// True if valid, false otherwise + public static bool VerifyVoxFeathers(Color color) + { + var colorHsv = Color.ToHsv(color); + + if (colorHsv.X < MinFeathersHue || colorHsv.X > MaxFeathersHue) + return false; + + if (colorHsv.Y < MinFeathersSaturation || colorHsv.Y > MaxFeathersSaturation) + return false; + + if (colorHsv.Z < MinFeathersValue || colorHsv.Z > MaxFeathersValue) + return false; + + return true; + } + /// /// This takes in a color, and returns a color guaranteed to be above MinHuesLightness /// /// - /// Either the color as-is if it's above MinHuesLightness, or the color with luminosity increased above MinHuesLightness + /// Either the color as-is if it's above MinHuesLightness, or the color with luminosity increased above MinHuesLightness public static Color MakeHueValid(Color color) { var manipulatedColor = Color.ToHsv(color); @@ -169,6 +233,7 @@ public static class SkinColor HumanoidSkinColor.HumanToned => VerifyHumanSkinTone(color), HumanoidSkinColor.TintedHues => VerifyTintedHues(color), HumanoidSkinColor.Hues => VerifyHues(color), + HumanoidSkinColor.VoxFeathers => VerifyVoxFeathers(color), _ => false, }; } @@ -180,6 +245,7 @@ public static class SkinColor HumanoidSkinColor.HumanToned => ValidHumanSkinTone, HumanoidSkinColor.TintedHues => ValidTintedHuesSkinTone(color), HumanoidSkinColor.Hues => MakeHueValid(color), + HumanoidSkinColor.VoxFeathers => ClosestVoxColor(color), _ => color }; } @@ -189,5 +255,6 @@ public enum HumanoidSkinColor : byte { HumanToned, Hues, + VoxFeathers, // Vox feathers are limited to a specific color range TintedHues, //This gives a color tint to a humanoid's skin (10% saturation with full hue range). } diff --git a/Resources/Prototypes/Body/Parts/vox.yml b/Resources/Prototypes/Body/Parts/vox.yml index b163ed0864..9f89a0c583 100644 --- a/Resources/Prototypes/Body/Parts/vox.yml +++ b/Resources/Prototypes/Body/Parts/vox.yml @@ -33,10 +33,10 @@ components: - type: Sprite sprite: Mobs/Species/Vox/parts.rsi - state: "torso_m" + state: "torso" - type: Icon sprite: Mobs/Species/Vox/parts.rsi - state: "torso_m" + state: "torso" - type: BodyPart partType: Torso - type: Extractable @@ -54,10 +54,10 @@ components: - type: Sprite sprite: Mobs/Species/Vox/parts.rsi - state: "head_m" + state: "head" - type: Icon sprite: Mobs/Species/Vox/parts.rsi - state: "head_m" + state: "head" - type: BodyPart partType: Head vital: true diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml new file mode 100644 index 0000000000..cd3588bf54 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml @@ -0,0 +1,145 @@ +- type: marking + id: VoxBeak + bodyPart: Snout + markingCategory: Snout + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: beak + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLArmScales + bodyPart: LArm + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_arm + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLLegScales + bodyPart: LLeg + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_leg + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRArmScales + bodyPart: RArm + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_arm + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRLegScales + bodyPart: RLeg + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_leg + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRHandScales + bodyPart: RHand + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_hand + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLHandScales + bodyPart: LHand + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_hand + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLFootScales + bodyPart: LFoot + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_foot + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRFootScales + bodyPart: RFoot + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_foot + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxTail + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Vox] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + # Ideally this should use the normal tail sprite and apply an actual mask over it, not just use a butchered sprite + state: tail_stenciled diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index cbed5b7995..c79947f15c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -60,6 +60,49 @@ damage: types: Slash: 5 # Reduce? + - type: Sprite # Need to redefine the whole order to draw the tail over their gas tank + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LFoot" ] + - map: [ "enum.HumanoidVisualLayers.RFoot" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + - map: [ "enum.HumanoidVisualLayers.RHand" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "id" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "suitstorage" ] # This is not in the default order + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "clownedon" ] + sprite: "Effects/creampie.rsi" + state: "creampie_vox" # Not default + visible: false - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Species/vox.yml b/Resources/Prototypes/Species/vox.yml index 605087a687..53ac4258bc 100644 --- a/Resources/Prototypes/Species/vox.yml +++ b/Resources/Prototypes/Species/vox.yml @@ -6,18 +6,19 @@ sprites: MobVoxSprites markingLimits: MobVoxMarkingLimits dollPrototype: MobVoxDummy - skinColoration: Hues + skinColoration: VoxFeathers + defaultSkinTone: "#6c741d" maleFirstNames: names_vox femaleFirstNames: names_vox naming: First sexes: - - Unsexed - + - Unsexed - type: speciesBaseSprites id: MobVoxSprites sprites: Head: MobVoxHead + Snout: MobHumanoidAnyMarking Hair: MobHumanoidAnyMarking FacialHair: MobHumanoidAnyMarking Chest: MobVoxTorso @@ -30,6 +31,7 @@ RLeg: MobVoxRLeg LFoot: MobVoxLFoot RFoot: MobVoxRFoot + Tail: MobHumanoidAnyMarking - type: markingPoints id: MobVoxMarkingLimits @@ -41,57 +43,70 @@ FacialHair: points: 1 required: false + Head: + points: 1 + required: true + Snout: + points: 1 + required: true + defaultMarkings: [ VoxBeak ] + Arms: + points: 4 + required: true + defaultMarkings: [ VoxLArmScales, VoxRArmScales, VoxRHandScales, VoxLHandScales ] + Legs: + points: 4 + required: true + defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ] Chest: points: 1 required: false - Legs: - points: 2 - required: false - Arms: - points: 2 - required: false + Tail: + points: 1 + required: true + defaultMarkings: [ VoxTail ] - type: humanoidBaseSprite id: MobVoxEyes baseSprite: - sprite: Mobs/Customization/eyes.rsi - state: vox_eyes_s + sprite: Mobs/Species/Vox/parts.rsi + state: eyes - type: humanoidBaseSprite id: MobVoxHead baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: head_m + state: head - type: humanoidBaseSprite id: MobVoxHeadMale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: head_m + state: head - type: humanoidBaseSprite id: MobVoxHeadFemale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: head_f + state: head - type: humanoidBaseSprite id: MobVoxTorso baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: torso_m + state: torso - type: humanoidBaseSprite id: MobVoxTorsoMale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: torso_m + state: torso - type: humanoidBaseSprite id: MobVoxTorsoFemale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: torso_f + state: torso - type: humanoidBaseSprite id: MobVoxLLeg @@ -140,5 +155,3 @@ baseSprite: sprite: Mobs/Species/Vox/parts.rsi state: r_foot - -# diff --git a/Resources/Textures/Effects/creampie.rsi/creampie_vox.png b/Resources/Textures/Effects/creampie.rsi/creampie_vox.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe199b0c867250a8f6829fe5e6d842c3fa3a9b9 GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_s98 zo-U3d6>)E8ZS*^AAmS?Pz{II^sO<UI((ANzKh3y3d|N|*z=0*z3t?GKFf++fx2o%qx@t3 zKXmxVp0WD-T2{*j77zSL!GmeT$>)hv&wFp*YJ1N_I`p^9JHwvfuY9wQnf{`U(-eq@`V!98+HqBo6aLww%pDYT?GWV7pV0GBI%8N52yRof1 zuXIf~gMggfU9Z0kO-GB))*e2$@lZi4+m;2Kx%YGRsu`Mea=vKXXP=XFPF^`<>Qc*n zrwjJ1XILxzA=G%mR}QYL+gbNNGO?X{@aQ@nZLhbVO8%dT{FhvMwx|2k>?cVNa*tZE jyDgTe~DWM4fsWtn- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/creampie.rsi/meta.json b/Resources/Textures/Effects/creampie.rsi/meta.json index 54e0cc73c2..8db8a77945 100644 --- a/Resources/Textures/Effects/creampie.rsi/meta.json +++ b/Resources/Textures/Effects/creampie.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0. creampie_moth by MilenVolf, creampie_arachnid by PixelTheKermit (Github)", + "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0. creampie_moth by MilenVolf, creampie_arachnid by PixelTheKermit (Github), creampie_vox by Errant", "size": { "x": 32, "y": 32 @@ -66,6 +66,10 @@ "name": "creampie_standborg", "directions": 4 }, + { + "name": "creampie_vox", + "directions": 4 + }, { "name": "creampie_xeno_crit" }, diff --git a/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json b/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json index cb94dfab3e..78339d7b76 100644 --- a/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json @@ -1 +1 @@ -{"version": 1, "license": "CC-BY-SA-3.0","copyright": "Vox_eyes Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb and human_eyes taken from https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and modified by DrSmugleaf", "size": {"x": 32, "y": 32}, "states": [{"name": "diona", "directions": 4}, {"name": "eyes", "directions": 4}, {"name":"no_eyes"},{"name": "vox_eyes_s", "directions": 4}]} +{"version": 1, "license": "CC-BY-SA-3.0","copyright": "human_eyes taken from https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and modified by DrSmugleaf", "size": {"x": 32, "y": 32}, "states": [{"name": "diona", "directions": 4}, {"name": "eyes", "directions": 4}, {"name":"no_eyes"}]} diff --git a/Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png b/Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png deleted file mode 100644 index 807e9374c4577407cfb371bf954ac9c304df0d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|%spKkLn`LH zy>*ZisEWn#cYf8|2M+}7C;eI0zLJTdPUYlkMxZhvX!vbb$H>nFW*b~B+{gd1>Ib_8 Oi0kR<=d#Wzp$P!*izAKz diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png new file mode 100644 index 0000000000000000000000000000000000000000..23744679b68c11f339c8c5fb7ab958ab64374cf4 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_nku zPZ!6KinzD8a`{{g1R4^}s`>byiHkcvl9_WPaYsk!O~Kz2S2&if&Y#?Sqh!lxAJ;`q z4Q&ie910B$UJG9DauogH?zpf_@AQ+$7Gd%3*8c(vx7&($Ez0oUv3ujPU#FjaTDu^M zG57YqkoSM@+`W`HqcZmTWhH~-youLey(;~5T}$<*LIc=1?1UVL%)a&ZdE)1CTmya7 z9~a80^So_8^SP!=|MVrh7uQ{l89q(UEt%Z$C*68~`k8`n*LG)B-%;yambvWJ*V_Ec zf3xK~ZHtA!t($k(D`D2Mg$fzRC%os|q*MG^Y(nb#y{uabjwk}HSK9FHhwWR#7haru z*b9~hoDpVZ5pZAt52BR01_nkB zPZ!6KinzD80{NN@cp4sN+8ozAmRKfS@i6I)($raw1wxm#I)m$l78&LS@0+?@ibNEp1bO_J(uY5x&C;mg(LrEZtsb#ugt^ zXa36ad*5~8>KRPl@wYi6{Pthj?Hly@I@^Q1KWookU+)mRzLG)8g@KVpzyUYWc$nqe zxAtGRO?-D}|4gqwdHDL{cH5ciS?_SYbW_j%?Z>;# x7asjlDC56$z5Wk&*Y2h-EeJmx_|F-`X!z!8NO{HWoxp%%@O1TaS?83{1OU22BR0px|3i z7srr_xVN_s@-{gLuwFQtx1!l-$3?ci2RdiHXfT^#_{i1wNRQz~^Yl;Y-`?J93ld>u zV&M=_aA;t_%J}E7;FLx3?QPky*O$Kk9h5tD;!lm__r~XoXD-uRdS0{mMxo5A2`o-JgTe~DWM4f4q2BR01_nlc zPZ!6KinzD8PV+V!2)G7n_Xf<^yGYP#p>Wqip-Js2nyWp&eO3=#XPz@d^8CT1$DEC= z3``sf4H$$j%el{cw&m`g6Vnwgr+$3OjoSPAy6lSP>upY%FBM##;b!1>u=mF9pY4~Q zEWh#C!pZBT*ZLo&v1?^6H%(97*`HfCE$>LL{@UwrYsDAbKIYMbVF9wG30y}c>R+jC zzx{N@%Loy@lC_H#%+v3;VO_P~H%-b%*WeSA|z|-`)2+ z{Mf|VKd)IfO|)O~Jxcj?nWfEE&;Q##Mj1R3aA06$QTf24%v;9({P<57V0bZjy85}S Ib4q9e0N1yLlmGw# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..1a81369838c9c41c4f6c711cbde4f8bfa42373db GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_s7J zPZ!6KinzD8F7`G#2ps$PHA!?&08c8z+z%YN2e_v=8t%Ek_HKJ2uc4)X|HT!5%oP(B z8E@X-IAgTn0S5*gL`86;iLbc*9KP<4$$}~04L{k0hdX)S+SWULc5Kq}(y%)- zp4Z%yiDx|Xu3_Ell4!lh7PCakWL*k>?<+r*Y{zdHFMIuZ*Sh~(HFp2re{emc$D|{s zzQWU9Y_0kC>ACak@9RCP?r95@b-b9dEHm(3MP13K<7-`yccw=^`yvw-n!4X?pVp=F zn^RLOZ>k%dFaELSY30=qYyNWXxAKhnHS15FVdQ&MBb@09T8wZvX%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json b/Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json new file mode 100644 index 0000000000..fd5c14b6a3 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json @@ -0,0 +1,55 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb, modified by Bhijn, Errant and Flareguy", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "beak", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "tail", + "directions": 4 + }, + { + "name": "tail_stenciled", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c70752f441f25d53b49aab5b46aec38d6efb0e GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0px^^f z7srr_xVJYQxehA`um(g|^~LD4pY)A+nsn0jmXD*xQbn~b0xzWtmVc^!l@%1k!XcpG z(7?dR1Z6auHzrEF3)DU6a_>a!)h6u(6=A2AC0}fbm`waF01!E zGb&>~vaIpL_RxKf_rJ^Ucgi-{uG~0Xyg>5!#}h%>$nGoPYGl_j%ja+7Gu;OCD}$%2 KpUXO@geCyp$ZbXd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..58dbe90b09002b330fb9148128d6d17766c54029 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR0px|Rq z7srr_xVJYq@-`a?um-5#HegS_u#r34;iyl}0V$RCDIFzd3ap*ae|`8{y=?as873AE z0R@K!21cxmI}Q&5jUIopi@m-ybJit`KG*xxzG$w^ot3t7RaW@A^t{aybrNlNKJCA9 zwREmhy65MZhSDF~aA)?L<+C zZMp5g%j(}gq?_EAwySb)+drrG&vSo^KU}QMHP!RJGUzXT?JaFP^=c{5y9}PLelF{r G5}E+Gqi)Xt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..e433456bf22d8b5057ed855e9adb1fd6cd087f74 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_nkE zPZ!6KinzD8eEFIc1lkfWf02{%36E=;z2UKhT-)S`V=c!_R+=?GJ-#Q$XYmVj{#$1a zcz9R@92gie2oI)fw@h0$eA7_csk+~)TC1-2u;udo6RjHS7Co6du~mV=R&4$aA*VmJ zJ1WjAKhK=?<#a&hGn?~=H|hKmIX1&rPxfp1Dq~~o`t_~#MfaEXS*;iJcg122-0CdO zp2roH(|;}0blY|8KgZ&eK{e;?_c^nT7Taxm8>q>Kl z-QU;!DDY02fAn_!_oM%qlU7VRZ)JSroVoam2BR01_s6m zPZ!6KinzD80@t}1NVGk)vRqw|Y&fm)?gn1H4Lse2$fWlTk)wk}-Jy^wjx>B)$f$2EMi=DT&AXJIOU=%I7C!!>+o|>I_tMzER(tx=moN7&_|MyL+A&qQZ{^QF%gi)RU(%oW z+M+Kx>+|;4*=%OM$#=dp$kpH8=JRyI<=c$&N*6>fn0USSL*(7X|H5;g3g~%2BR01_mYu zPZ!6KinzD40{fZ_L|hAvx)pvMl>5+J`ogTlaszKfyZk10dxdvRCv*2KDVrgw+qv{{ zZqkITr*}Wc9j%C;l+n?^frj?TH-_d+I=xBe&5Zuz$t6;IW;)kgFKxDsQMf0+?@Oyd zSE1c}UKW|3HGD1SmvV1^oPFEO^Rh|itYbdwuV)wA$naV4*xgp-VmR?3Z@Y1l;yfqA z`KdS8$kd&Q`g`c;iEY|)#Va^M*j7KhIbjhaLt@!8%^y{Jr8xE}YcZ_z*!}1G@4x@| z$$rvv;IOD)z5Br0KOdDj`bEz@zw@tVyU&MG^NZ#C*_zpxGPpRf;6X}?AI|#D{I&k> z@zU6)f6KRC$X)pToLh?oFNc-q8_fl3;iq5lK4O*VyZyGT_4v~w!*$vBzfV4=z1!3& zUFxh*FlUq45kB4vPO&q#-?z_e+_jGVdcqMIo)b3bdrf=!pEv|Foj0HDE08SoNRZzp zG}QE1Tk#j+fIn08&i%cq;P`(oFV`NfBZp`4S-yFFf0xU#f*Za~Z~mLzIV1V_VqAlk zM%SSZR-W%2-`mzT%ulkO>vysxw{H2zg_l@aIF6PTC?@2$u3@U#xzo__b^jM08&Mm_ tfDg*z6|8fX9{bAmc2^rB!YYJ+Feyd4)s|(yc?wJ*44$rjF6*2UngDlf{U87U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png new file mode 100644 index 0000000000000000000000000000000000000000..50627ac5220bfbc37e5b6f6516b5acacd1d75165 GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_mZc zPZ!6KinzD49P?%DKTqIu??nMdK{Qlh&lH(8>GY5fo^>b=ON|8AE(^De?wRJ@1C$Pm$x5$;i$=g?rs!sG`euq6bJvR z%a(t<>zw2N(@`(BU8qi1cIskdnXB?mBp`Uj($8!k*?5lIoHw?4wX1C1>%VpHOXJ?& zmp0Kla?T{lLFZwE*bzS73r?{S-xW)uACy>`EmI-s&EQ!vMpl> zTOBHrJc)C|qD_xKda&tDe4)PJhh1#U@2!qa|E#4&Dnt)7n93IaxSqe;Wmmxs-=;VJ zO%9#0e0gTe~DWM4fKg#`P literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..5069e90b535784bff8038e848fa094a7d9b7402a GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_ow- zPZ!6KinzD49J7T31&*uVToRcwS!A2Zi~y~h%|Rc7J_rSTNSi44%k&S+S80(i3NOBY zP^l6YsXDWUS8d;{W7nAu9Q0l)nYFcU)sy}{KaTGWiL;Ju5wWN{*K7W6j=gj9W5HA-P1eII zbyc?>*yw56owys+&&YgU|FFfm97AvRyNVCFjCA&&{y=+b=T2|-=ZhdHVc2`;Nxg$d_Fx< zM{ZH1O+rEJg|m*UIToGzy>I;yF|Jn6HD$Yf=lVT&3YR}P>#SO+Sn;X{i$3gJx40`| zd$rSD=D%0l{dF1Uu!PxGy%lY_dpDNr@P|W3jdOLFR@tuF_uSHJ&&g})^--n@JNJID zn|AuCx9IxadsFua2rxN0aBwgxDzLOPVB<7yX6dOHOE>>fDf4XCyCa{UJ$u$#udO zE}-bC;yhMo6Yg@E_D?@;&YnMi`P{j_t9cDSk~VrQzUcAuWM%GEzQ_JQcX`)oX4hCa z@3#GCZ`$78KG|M<|7`(>8Ti18}`p-WNy#5-0+Ubj~%iqg>`s2mD z+NvK3KGlh{sy6c;+I?Lm&A)|Ty qZ`Wk26_+HRsK6P(prBtT*LeTWD%VFdg|<~N0D-5gpUXO@geCy)s<1f# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..864a6f00376be96bbf8ad96a633fc2cd946d03c1 GIT binary patch literal 789 zcmV+w1M2*VP)Ui)`= z_Mh+{5QJPj*puQ(P%sz0co0ELLE6A#V=L6Qu}z+SUYzwM?snhXgI*k1US{6Re7`$y z-fTqv%RjC_R0RL}ojEfZ_w;eEP_9xa0l;Twj!Cmw6L(D`<&!&zwSw2{$0d%xC;3(1 z**TQZN(5KH1#ec*TN04LUPOWktX1yHiwEnX;H>D_i%6j(00`i-jiGFGOS0O3Z?XT% z5mcw51RPLEKn8me2|5BAthad}pSr^_EOhLl4M>t80t9gNwyN)>^LoUA6&-sK@vfWR zbATu}Z#>&yvfy*`73uFA+XF~QCAo7IO0#7kK_^{3BzW%u^`W%eTlYuhtlo#$8w`%XCFWOedS2co2|>{+Eruk zef!Bv+kI2D$o7IO=-3hb@F$M=JR-SN)82+_r)6hFpA_FJWDxfbNnmJ*WfJo*Xc=MqnpW{Jvx?WBiiTkZ@?lvNWN3W(revDuJ5uZjU zw+SJkfq=MI(4G0%-Fe`~9aV=+0%-|oxJILDORir(R&?yzm@Z%*k=zPsGQNDg;bQHa zY_BfKqldAr3@bWz_VEi5Zvr$GAo@RG5(GQ@+O)nTygo)G>%3(WwlXIhz&s;AfAOvW zDVJ}H%+IFh$IgDJcoVpPuVu2zub}MX7fQm%-z?v-iOsDm=^vP1_QcO8DLy{{GCObT T5beir00000NkvXXu0mjfr|)qT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0dd8402e5238128e894e83673e8ae369207543 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GGLLkg|>2BR01_nlH zPZ!6KinzD8Hu5$*@U$jQR@KmuXttG@qN|~iz^0)wqv^>)8LNd$EZir!{JQHRBk_Bm z%GC2c4h)Pe0$7N9945Y-&wbvrZ`az=yY|xS-~SF3ynb=(HQTNED?J}uMBUyNE&Or$ zwe=mDvvMTZZcA0Pt=sypQ^(Zve#!OHY0rPo+ojVT8k*`FsIp&w>%Mu{_1Eg0whf)V z{`IZU+fzkmamZG5SDVQfJ=%ZU{8jxW>zy154Gc_ph!5>dv&7ne{wd6>KUVfA>is#b zC0Bgy$KdJe K=d#Wzp$Py=4TF*Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png deleted file mode 100644 index 15c0ed8d66f08c6af2988432a3b0ed3b8628feb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}W`laSW-L^Y)f~_8|v};~$s* z;CIY;=q22;XF-qVjwu#tr)Nxm_~P2tyBqaaDDZ}C5SaSweWAuhG2N%W*Zb#OUvs^m*SeBamE>pZWmoRIaWyygreB9}{PFePnP%F%Z`JG*D~_Ig z@NxIo|1m8SFNS5;m$`17wEW=>&D)g+=da(L{X_Ggl|00HAbH?_QBkm=U(Mc~>pbV_ zANl<1(tF$aTLWjNHBO71y#47>t4sEJuY~%Qy%JOSW*Zb#OUvs^m*SeBamE>pZWmoRIaWyygreB9}{PFePnP%F%Z`JG*D~_Ig z@NxIo|1m8SFNS5;m$`17wEW=>&D)g+=da(L{X_Ggl|00HAbH?_QBkm=U(Mc~>pbV_ zANl<1(tF$aTLWjNHBO71y#47>t4sEJuY~%Qy%JOS2BR01_q{N zPZ!6KinzD4V*4B&1zM}~be#4GaDO<^>{^keDVC&JH|=4gDhK}&IS%9HlP7PnW(&aOXRKMEq`t`ftPp##1RAc%->p;8u?~fHVdcS$un8VlDFYkXM-hEVZTHbock1FNo z+kf4DYxb)6^;P|MoXf5&2CcvDy!$TS>8D0tj7Sb&!zW@b*MCt|Kua`SqW_EQC7*c)HjHO= z{j23WnOV+PN+o=~`TqOG)|1Kd%8k$0emoP*@LBh5slx%o=S#OTUi-ap@;8g+2UmZ2 z+?;1M_tTbsZx0mupPAs;Ac9vi@(x){{a%i=HXzrvA;VXAN=eW=<_@>KM6yC!WP8=M8!!JxDl;^0FkrMj7?)ijJ?o oH}8udBjE6bJCXgk>2cu!{o%J42}!;d}-gy47UzkTH-CkvU^NN1$T^o{GB_+#yTI=*>+D zj)_33Z4kk>jMYK8tJKp_cRCrL07Cw2n#@V9b|wC?t=kEtuJyO$ z3!l_#S7OV`!M5}8yahjo;c_QMVDZg@hWRY!N7?wgOmLPo0A2*k%B>xl=afz!0Bk!C z05A)hbbO%#u%Ik?$8-UFFTyUcIOURo$uvT_WMtY!2^ZkjI7RPb$dh+W7rl!iZjDo^ z4v0!8ojy*ck<|5s3s4-Mqj|Cq0H{@00D$JnK8nM0sSb#m&*GnwolGOlXL5I+Z~@GM z2FG-H^0n#;j_LCIa@)*;mKkw2BV^+X6`*W8dYhY~lclJG?+X=KVT=FTe@(2VZzX$=zBk9GwzSHChA%qY@ z2qA9J5Djvmfoj( zu0pWH*|u2PVDP9^1f`7;$0=^yl`WSHc-}&}2uH_uY}@%?#!)Fk?)M-0bAcbN{aZyC zF8Oq4DtpF;Pm2@Y8%$%P68I4UKZ0fDpu1BjE6bJCXgk>2cu!{o%J42}!;d}-gy47UzkTH-CkvU^NN1$T^o{GB_+#yTI=*>+D zj)_33Z4kk>jMYK8tJKp_cRCrL07Cw2n#@V9b|wC?t=kEtuJyO$ z3!l_#S7OV`!M5}8yahjo;c_QMVDZg@hWRY!N7?wgOmLPo0A2*k%B>xl=afz!0Bk!C z05A)hbbO%#u%Ik?$8-UFFTyUcIOURo$uvT_WMtY!2^ZkjI7RPb$dh+W7rl!iZjDo^ z4v0!8ojy*ck<|5s3s4-Mqj|Cq0H{@00D$JnK8nM0sSb#m&*GnwolGOlXL5I+Z~@GM z2FG-H^0n#;j_LCIa@)*;mKkw2BV^+X6`*W8dYhY~lclJG?+X=KVT=FTe@(2VZzX$=zBk9GwzSHChA%qY@ z2qA9J5Djvmfoj( zu0pWH*|u2PVDP9^1f`7;$0=^yl`WSHc-}&}2uH_uY}@%?#!)Fk?)M-0bAcbN{aZyC zF8Oq4DtpF;Pm2@Y8%$%P68I4UKZ0fDpu12_3X zVmiG^hI<3YMo#}E{we_$?|_1zEw*p<&b&Bn@WMX*bIniHiq3O}0uBs}EO4UHAvAQh z!n5#}r@u~3`<6S)E$)g~-r-G4Q)^p#AMX&a4}ClB{n7fL4jz}UxUZS+qtDiyeb=Ch2QP;v(i&H=6M$Ef@=v6^!V(Gl9 zy-ySy7??N|un`~J7_Ztsk=D+RPo1v5-ED*P%V_12*zK~e6XN^wviQFjXBNuXe}5qF z&)S||ci~9ptZ!z4B719e>pO)Fc$!adI>UPK_3uhfhTDIYyZUbI_>}5 tcO2o=IQ>bm?crk?<;{Xf{(j)cbYFTd=h@O1TaS?83{1OR`UofrTB delta 359 zcmV-t0hs=e1AzmOBYy!%Nkl$m@Oi!b%-G7O2z_cpn&jHiI#AfyfGynlTAk=^M5Px0)Tx9ZPCb+-klGi z@{vfE%10Q6S0Y*8Igt*mvH>!y0LXm?GNaHhh5$BVnFr!4AX%oJwW%^DC3sOl@%HXq zf)@ppJL_D67hnbS`tHYu;-|xZq1^3X`kB3k$}ND^ug7|^0=C-^=-v%3FRG)*dQkuX zr^y4JY=PqS7Fne5{9^HxuG({tKw8}k8AL=xL`3v|d;*79SS2xb6Wjm*002ovPDHLk FV1oOms)+yq diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_foot.png index d12c19cf0cbbc77e752beccc45fcb5421bec4c56..3b81ae705959d40f4b51a0dd96921574978bd437 100644 GIT binary patch literal 9030 zcmaJ{RZtuZjK*CSDeh9dKq;a;yT6w}f44&Ct1eLBwo;>mhrEBH2M?8o3&`+DW@WdbV%MRe z!Qn;+W6ZuHY@0I_NvLih4s_bHe01Zlrz3OF+E#~_>c z_X0$TZ8~^>=ej=UwG;NcW&4$%Qj#ec%w=IfXt});`bw~kU?GW!@Fp|nPeUbuz+-}D z0fz`aHH;V8Lm+(k;|)L!4FSn6W+Mi(qpgv@Tc5rYE13LZc;O+J8vOMq0ws!Jl5p>X z#xL8CewH&3{K6uVFEJL8LH;%fk|{(#k^n_4OvE3^2GA^!2DwSD-r}PVEtY~0Wd%9N z=%+cqNTl3Ppbowhl)iUW6pc(nBqeriiKM0Le>NZHPj)!mQ_)Kxl6<|27t=G-prKFL zm*I&ue`E~*$ZaD%m7F~F_3BGlczCnwdw=-kAv0+Spi3Z99Bd;H24!GVSt0&FK$%fZ z{O#3=D61b7@#jL5>~cdF;Z2E-oRXORVMBjlx&p()WIuJOr_T zfQg_NkZ7_r9P<+#*6K^*L>ES|LKNJlKT#4%#%)#NQI{tomly(}7$R2pSq^>gx*Q$i z@VbIkH-Zj4xd|#H7}FV%svGk$1TG(5oCXUV%nU%p55{2#nWa*w6~h_2_*#sV8iJvU zcr1o!gTRrG=pI5fxv?{WMuM0kfj7`*^;R=4dWmYx`!4dPioA_Orf zAJYJCEg$tZRCE#-rJK>2)Bs*`la&O8-h|Kq)qL|K2`a%RQ8VIssNbgOPbAzPLT@Ci zZu3i|(NMulEFkL5CZi5qRk!^mN;~pJw_i1aRuAeWx<86>xArCW3mm8iWf7^Xo9Gd- zu?J@{f(9)z34qZnrh|ryM}rTJWCrknBXnr_q7k>ln`x<{aq)v~k^l@?F%o7;NZ_bn zG^DabKcWa}7-dP-B4%l^Wih8C-Dv}c;68^c(x?wn)P}=o$cJ!hqbO*tZK!uKS|q8G zh<6dsqF(ahqT!JxX;n!G;ibf{*(CCm!TmAsimxFypIT^ApjWWB}vhZPXgDGti_I3%t|evR-nf$QVK z|I;n-6E4LBLoq_v)bl67e&mx0ybgdUQpyxv2R}X1(iB+-T`OeHR7rei4Z; zio?`?5yvw)$Aowh`#!kC)OZmWCp>IZRe&NP+z zv9H(}*#LQ=_s*Gq6^XyE;!^jK!k_9qlC$^qk_L!m9452H?M=~%y%9m(jk{(0hz`UA zMH%XmtSJ(3FvIL#f3j(dhdD z?%`h~hzf#LrAukQ;0d9LgwysSnI=?AEYeW`#?gqwg?ll#;x1*l0JPE0U_v^gH_Gn7j~iD&kPu0E|WRiN2Cf8eksn(ofkR z&@b8lWgFcL=L(@F+B?iUN=Muu45RI&pU3M01ObF)N&cIdWF!V;IjLG&!Q^&X_+J1u zLOB_E`n@E1SjS{75_(1Is~vl`bSvZOl1I11BMM@kb*IZN|OjZ3?1f~5;6n4;`aF-Q;|06^^D6zXW^bweuV*3@P`0*Bq5ZXU}Y)me78yD!@fg&ca~NR z!zf2Ef6>ZR&LNdM=-+2w5|PMUu?)lI`KfQ2qO zP;Ktbg+PKAk0gy!6#R9-#_X0$n#3(0`w#q1=vDWl83GsWPgzCwkLW3pe|vY$W4UCw zi+{2zQtlH%k==;gsNC?}(A_?`QSyYe#Q8+~#QQ}0#Q22i{_*ei?}M2)a<%C&5JfSX zmg(TIb7}$DBGY<@P19<~bPQp5^Az@B9{sIm9o2!0G~WdHP_m;%g2#II&Eu*W7e9aF zZG`tDTZugDzc)dxmR$ULDscblp7x&mp41cXnW!z+u@PqI z5l|*830Cj3-NAB(3fMys$B_?WZu*e7dR=Oo84Soip?U$d%hGc4|ypW>tRM0kmKY%zEJGyR_1$YvmyXaVVVB?yBkZ6{6V z$4bCL^hrO6Av&BfS?(JH)ejoEPzD7xTH9nSxqSxVY0)3VfAa|CV?Qz`Ps{oIqMLS6 zV=N1qRXnD-OZt=?DYx^>@0aZ~&oteU$PvL2s%;!rGPlL&%%w@?< zX~Ak*ZenL*XC*Y~o_vHcLo!1NWq}GprJ$BjUMM!y!HSS4IWsLYO82Mk58Y(lu%+N7 z$Wrc7+ERw#Pr+Eh7{RcX;3sA`K{pXMo*TjaxKYVb^HHzNlFU5rE-NF;x8avKj8Yxe zh+**$`LXJjW#t-%e>I4~;M8_X1T1+#_uz+`kr zbWe2kb=q`Lb)s~cbf{~`Ydg&hO<(`~%f>eAtNXg-y%@gqYbkZfeNl1o+mgYO|B}R_ z*`nH#>mp8FTFqPyZ=FZ&T^)9vQniRhwz=Ox5hMX(1i>0-9=8~$81I8vLhc|H5MlvT!9jrw7twu#O@sZH;g*4jO*+>a zH+1Kz7Q&YLX2s@jEvwBh&Al!7&7WIvTyi$c_w4qMw_E#phdnavBTpC?{3@#q^jFaw z@%e@Mzw7_dkI|1>NnOcZ2@?(${vn(x9QDlQCHNqB&Ua3APJ8ZhE_W_?&cB-1ywKw1 z;|yd6`UAIt*T5{`A7CTU5%>ng1I7S#fl@$AAU4neC<2rO?f`LpaXBepO2TwIB68SWbHz5Z?Mi`px? zzPgUNVY#%u%Dh~<@wr64mbxjv-n&Y>)V#^rKiO{U_sY2t-B9mb@TY#7e}V_)=6yE~ zHvVCpX`HbUx)HMx1quh{g2K9zy5hS+x^lWQ-pSrM-fZ7|-YnlPUV@Oh5H#S8;9cOQ z;2q$3;AP-BLrg*hLfk_n5sDG85gZUY5EhUeF%>b}33c!uX{#msrgdyyz6dF0LS^cH z3C{T2n%0B$_$q#C$=MfrOn;jCV}ons_TR}PJ8Pm*OQIX%U}k0JEM>G|J)}8gBw;6E z`pKfhpz~>wd69OJQ-Iam*jelH`=)h|v4kvbETAc=G^stQF)1^tC@E33R5esJUA0EF zST#j8V={jdyC6zpB4QmgfZ!in{0A#MB0xH!79Jmiaw9U>lf$` zAK2}$?;q`l^!pF=4*VFn9!Q9ri))Cxi}@bAMx0IH$9AvzO`n2k{NpF)|M(THBkMWy zIX%_KT!vhxK*e_DcBOU|e~p*UN1iLM?T!8>#!LKD{9b%ld_DYq{BiteMmk0{MjZK6 zc}S`NlZ)Iov_G|9Ax1L>TS&2F(&s<=VA%@47I`j?3mu%PJCZr%z18yN3) zd6(WuW{`E2kCkPWJ(ky#Z5;HRF4>r zfJZyiOvMv&xble#DhizPLFwy1dWNcp(T0cq+KlK7H4h;T_YYeP6OPOd)ejq_wtV7Y zxskBaw2~xZ8DSscWaIcvYya_t{e+2}Bm0w|PNRIIRHL@1#(l^s=F*2HY{77fI*Kkx zJp>BLTon}zY9VP+Y%yygYvF4VZQ*WVX~}S<-U}Ql+SA>O*xlRp*sa)I+Y8$x*mc`W z9LY<)NbO<|Qh1Ab`SHU4WQhC&p(!*xv^=yXw5T^Qf;qxHq7P#ZqXHuU!yH2$0}~^U zu#vDP_B56*Ha7NOY-6lZtZ8gnY!o3I;RN$Na{{xdDn$Dw|4{+GqQ9I0_ACEaiAB+F zF(EXy&|S4m;wWA%ak_N+*L3@|O!3AriKV9{o+YCtqNT7U^&Z;Zmp!^YyFIPFz&-Ne znc=F`E@r3S0L^C2LsmOhDC;;YJgW=q66>G_nTC*Nq{eyaXc_x&*l#*bT@7T-Jl!&<11kP$dT4)#{VDla0WG#F*oP9q(tl~?YgKwmS7@KL zE~hRRE@v$_3VqFyF;p{@Tr*hH6pm~J1$=e-)&zzUn}2A-yUBU-w5A1 z-!tDZ-=@3Vql)9#`N1Q%BZXu8WBp^l!>E&zBjS^V6R%_AxuE=awfDNW1o)-k4Y6^t ziSBWeF7bHrgdX&;8I%qbek?1jb+VT)VA5LBSkiK`EYeo8ND?Rs5$QacCkYPeIuC^Z zc)eQFx=}Z%p+=_%pnWr@~J+mRRNjFuuaS6R{#wx&S$4X^PYcw!> zXUu2Ja`bNWZ0vP(XY6K-ZER(fGkb$KkN^E!r+tqFtwn)_so9npo|#K`;bLLWcKbl- zK>dFkt(9^4$Bf#v+Q{^u>4pC)U#MNJoxA?AM>#^Ap2y);@e>vfORZ3>ScOScOv4iN zc=hgd)~bEY8ou4FkU5RnbJ$lno!L;@ z@o^p64ISQxjcI1fWoz?oI3zbxG`j0^=#%RkuL!L8ugI^|HA*((ej|41TA@8#JUjH% z^KA5dKHEOUI4wUFI;~t*TJC6kHcf0isL!ZfsA+0?Xi}*MSs2@ISc1$z4)61UGw=u9 zCo~5po13SA)1+hP{(`B3!7XSXtgpP!SSGe8si?Lnvna~^mwBUknR(n!{*K5X@}QHl zER!cwYf58EPD+=0p?ZOO&WumViE?62dQKxmZv2ZiqqVxV*8$oA`+?d4(Si7Z-#F&@ z#zVoq%X!LjN!x@ewYl+d=XL$T|MB%$a$w>4_ z{D@x$hxQM)G0mm9(YYDkVcvy?-aFWd<^szCI(l}?WXp6`66vo^HB3*?#yGx ze*7ebe|KzO>0$oL^U}(j`tsA2=$Xi7z=Yq_a}@4;)Pl_V;NsvK(=^jU$#hAdb-(o= z>!pJ#&XlUss>rH}sxGHmr_9CC;V|@2-`%q1TpYwuihGQ0@EG z+uZ9)pa#eV!~yaHMQ*@%;dk)_h6Uoj7(F{Y61>>HvAz+#iN0OEMZ96Zb-Xpb7(WJK ziy=Fs4k44EHlu=(cab$v-I3#wM^XGS!V#7bixKV+ACM!Ft&p{lJdqNRL~#tTS52$A z4zUa)3FyOhq6)!&JU-B|STf8IkOcGs+B|fg76@?Y=cTtroME$owZhW^=UsPmZie)@z5MqjC+W$Du;K{TuZy>uWOUD?)V9O}@F@kZAL6gZ)wl%FjsXkXx zkw|V{-cu1rVO*|K`CPd(tv#tdSwbF9X-e5e8C~VCQkl|`TuaI|>z+0%qb5+3e~yut zwSlIAwt@35@L26Q50M>}0hfg8QUKtWe<(H+(u1gusx>V}CX;25rJLoXr=};TXTR*c zJX7D`t|4UHD&MLkL@z?$LD#_+01Oa)wMOBVWRMi@6Qrl32Nj7Haqfu!X^THoY*frt zOi{cT?H?`5ywMhgy?c_*o2EQjd$K zh@`#>Jgeh;j^dPI9OPqSW@0O0EfGHO96y0so#@X~*)qE|aYUy5C7S_&%FDa9hi6g&Q5ja`p<893^$b6q`UdeJ8r zl}IV-=Y4wlvUO)BUjwc&t+947bCGlLyVALe+rFdUrN@`SO7y0Z1G=8dJ}1}E-^k1- zswGS(l2P3WWx3xzPSwdcQ3Uw7*M+x$%ln)AOBjlO)&HuqDBRWjJI|eN{&{dT;fYc~ zSj*+Kw?=p{J;8zcK%mlj^;lrXd;V&9Ct#2%u?iBba+#|tVj4vE0`7_VLy(~|3ejO3 zNXJOC%V%K54*%~F&>n(>rcoSK&Ak+$~9PyN0LQe;rD+6pWMmb6#; z=lhqxm?M{mY87bKRMA1Vouw28YzA&(@8so+EsEueo%TY8V~5X&+tMz|#XhK{$)^Qq zde8NgL(2=wOEfpiW9GK!BInlU{>~N88O}BR&M5b?Yqm?ZKeg+%!?07H!y&20Y6=6cekbNiM-AGj|&@+`%GDNSWL4-4dTxOiES8%VyLL zW=~-QaWoK)5N7lp-b`I6OI6=1X;oPhZdeVs!MB7_u5B7)}|= zw2pf!xpU;89z2cP=X#0cId|T^MBF?~R2hjG13L4AdJZI(BaSg&iLE~QpMCUD@XYq& zX?1HOZ>#bEU96v)o_sy6xrjLxT%B3xS+ASL^nLPc@Llsu@g4E=^QFEIY>n<>4xHL8 zd>=TCW8%ay^!IcrN^DT6nW*Hft!l37a4NiT0IhOPR?S>2pP%WEfU8Re5B1)0rMvalX7~@3z1fxfGceNf~7xm57~39mw_Kf&`MF z<|aocV|`!H`Cl_K@k2o{_ef;Y=L=?r3D)R_VWXI<$r^&@b|-}$=dGAsgBI0YfaH>ER0 zH|2W@eM($P8?G(x9rbz8&)3V@z7t$y6>;@Y^+@$M^%nJ#5=TW25eXo^kHt&$Rq5u} zk)jxxixTdc?HQ{X+L?$M>yit_pr1VxvST_E;8BX4qpVDbuAib0`}^XX%jwSaU`L`g z)w_T1Kk#16NXjmgrV2_P(69C`^|@?by{d#%MMad-r&R#c3fUUl8qw;;THlJvD&wHq z?N)H4<+6p|&Co5y%{Z4^MBRJ;k^N2gsqW2MCGXXD{LbK}<>2P_fGIB#7<7l=OMBb< zh`ck?j88b_^fc3an3noG~Y!L*wPHgfyP0?$wh?2 zQO~(*_*gHim#SZH9IwxAd}<6ae0hz1PP=Ez)7GuZGFtP#JLmn^&~HDofLE2+*?IYI z>V(>9alN#|CCF`4={0+czbbu`F`03uIH|Z#Ax9xa!FWS$gSE@UC;Phb{%o!Z^CI7? z_d;wGQD%XmY5gRRTUC+}b9`D?>N+{k6^Q0eEu#ir5r>mukjnj?4|sng8ziov6(Zat@e$+q|JYki3bC!Tn8*PHhPi@{fPldAhnD zd`c9~LjsWoVf@p$ExVcNQ`rF31!_H?UJ35pluhu9cIo$3%2g~?4pgR98S43UHoivO z4;(5?W)yPf7*hp4y``P~{--@rm1&&anGj_7B>njDd2CC+x9QkPa)YQ-azm;!I|%pP z=(^+JIpv}&@bYEydF#Dsb8w0JA;|yr@3s0}$>2nMo)XCE%|Mq4Hc}y6$yBibGu97k z2w4SeR4+%bGp~^>dNX}nKk`1EtT;7pkacwg z9lSU`1spt-a6mcsIGQSME7bM*o3!2l??dk{ZzvU8{}ic0e!>206i!Y`8C)r068b-7AWU!o delta 228 zcmX@+_MdTray`Q_PZ!6KiaBp@ZR9;O|)1cP~p{LBO%_PMasPY%@0&xyLmT~i2(*0>;o!VTGVb;g=XwGmhEfyeztwy z?YmRf+1W02_n7AP@{0TCGiUs2x4b=Oe?67qr`fsbv5uKjRCe+$%wD`Su*#;p-wtLJ z1H*wJC*if(^_zv}FUnrrn)b^w=Gx=Z&@8{5(=WKJ*1o=;?=ruF=KdB{_K)x8{1%FT XzuDrpqSeLYAOk#I{an^LB{Ts5FQ8w4 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_hand.png index 0d1048e090b6e59e3c03f2d8182feba8b8dd5348..d321880c7b8c9203af0e9e214cf0b3602b87a610 100644 GIT binary patch literal 9080 zcmV-;BZu6HP)oHvf+#9EiYQ401q4J9j3o4W@M zvj_+P4~T#Y)cpeDVMtj;E02(p) ze`x>zp#wtVA^{L~-div7Zw>!tyzzTYkYPkbFl1a5W#Z$4{S)E>WJ3c2{zuJxARagZ zGhhg000TtqU5q{D0u=Ygcn}AIfj>ytn*)F>2;Ce1XYBtMOJJlV{4*Ox$E3!E28Sfj z6y+6Eq-iF5Wz(DzqN5lziDZU0d$BSHfhQSppGT4Gcn zBaY@rGm2yQC4?q1XhzYIk|p$?YYOi(mx%MFd0#GU&4Z z^x_|G|Lx9yc#IEHQv5F$L^K2dwXnPULlgi^835bIcX$6Z?e1=$-s52&fYGS`#7Cb3 zKz)7BfBZi_kwyS0`2Y;u{EyGS3V=(80N{KUkQkTruaD`!b^|a#0u(?448ZN3Bf{QE zA_L0aOJ=|VSOFVg2b_Qla04E|3;2NmpaDT33`Bq^5Cal`4kUrp9!s)74#@9Or393L z3Qz;;Km%w3EuaH*fgaG`Kr3hi?Vtmk z1D&7?Tmapm2lRqI&<_T{C2$#B0Yl&_7zQI?6kG>m;3gOc6W|uO1MY%*;69iH55W|8 z1ZKcv@C3|)Iq(cT2lL=1SOBlUYw!lV1@FLnumV=W2k;4e24BEe@D2O`Kfwmr1i!!* z_ye}V4%met2!@al3c^5G2oDh;5=4e55Hm!DSRpou1LB0ZAs&bi5`bus5F`wVLSm2v zM2Dmx8AukAhZG3(|&kA$`aIGJ;GXQ^*{$gsdPN$PTiH93f|DALI(T zLmrS9eMM2R}EEEqVLP<~xbO1_+GNCLe2g-vAphHj*bQn4U zl|aX#Qm7oNgsPw#s19m?8lfiW4AcU(L1&?JP$zUA>V|ruK4<_MgswnWp!C&C-@H)H+Z^7H}E&@iN5Lg5rK|(MgSP*OoP6Q8vA3;M1 zBg7DNgfv1Hp@2|Es39~FItV?4A;JVJTRpO^9Yh8=?czh3H0HL<}GPn+kpv_KNky_DIgz|b z0i+O86iG))Bju1vNL8c;QU|GzG(wsoEs-`z2c$F773qoeLHZ*Z$Pi=%G8!3=OhTq2 zGmzQHeB>cyF|q_%imX7^AnTE*kY|u>$PVOrWDl|*If%T996{bdP9X0hCy|ekPmpuS zdE_hP5^@>&0l9|!j$B9nMsA}33W>s^2q+4Q1;viyM)9MBP@*V0N(QBXQbwtxv{Cvf zBa|7+3T20KM7f|mP(CPsR1hi@6^V*PC8APM8K@joKB^FP1a%x$j;co0qfVikQSGQs z)CJT<)FspqY6NuybqjS5^$<0Knnk@pEuxlC%czg2FQ}iWU#P!mfJUORXd;>k&5Gtk z^P&aOqG&o=2CaZrL2ICO(S~SKv?baW?Sytkd!l{O0q78P1Ud$tfKEkcpmWd#=)>p| zbSb(DU59Q&H>2Cpo#-BPKl(Cy7(IrbK;J_@L_bE)q36-B(eKb7&}-=L=uPw=48R~U zI1C9x#js;|Faj76j08poqkvJxXkzp*Mi_I94aNcEg7LukVgfKBm`F@4CJB><$-?Ag ziZDkprI;#A9p)6K1#=d29&-_M33C;59W#Nsi+PB7jCqE6iFt!r#(ctj!>nVrFuPbJ z7KbHasaOsyFIEsMhLys~VU@8OSY50U)*Netb;P=2y|8}RAZ$1`2AhaIfX%|@V~emQ z*fMN2wgGz@+lKAL_FxCFL)cO5IQA~~A@(u$8Fmr-7Q2dF!~Vej!fxXbI4q8YqvAMl zd^jPTI8GX;fK$V1;|y@7IBT2(&IRX*^TP$pTD~a{Q)5Lb-1!6yOh&V>PO`Ie? zA-*8KCaw_Ii0i~ZB#4A1kx6VM9+DtQf+R~)A!(5eN#-Ow(ms+G$)6NTiY6tI(n)!w zBGPeEC8>ebOzI%@kS>viN#mq@q-oMK(jw_S=@aP(X^RYzF=R5Cjm$$9BGbuoWL2^b z*_doeb|AZveaS)O2y#6606B+TNG>5)kn723$Q|S!@*sJbJWjq(o*_Rczb3DczmPY` z+Y}^)K%r8&C^U*VMV6vM(WV$tEGZ5YH;OMMh!ROjprlc9DMggylxj*NrIpe}>7xu$ z#wd3wk0^7LMap~1XUaO|FB5_Z&qQV7VxlpLGs!WjGU+fGGg&h^F?lfgGleq6Fr_eM zF&$(oVX9ziU}|PM$8?eD3eyTm6?ZGm|2opky(S; zfZ3ecp4pYzmpPa@iaCingSmkDD04Y;J##bjIp&MZL(F5$cbTV|pE18?USP=-(BdLkh3~E002(_GAPi>}lQv0Y^sW++jsgJ2I zs7ut3)F0G8EC?0?3kwSmi!h56ixP_#i!qBei!+NCOCU=GO9D$eOFqjHmU5N`mKK&S zmVTCNEaNN>Se~*hu)JqkW7%NYWyP>kSUFf}tP-s9tm>==tQM>etRAfXtYNJ2tZA%y ztVdYOS?gI_Si4vUSch3BSRb;^vc6(nVg1JXn+;;avr*Z2*o4`n*_7FI*i6`L*<9It z*+ST2*izYY*bcLmvDL9PvvsodvkkLNusvj(V|&H6%J!XYiygsEWM^gPV;5tWV^?F> zXSZN?WcOeXV2@x=WY1(j$bO8yn!Sm=gZ(1=5c^H`2kcMT7ui?Xzp-y|AUKE|tQ>qC zVjOZD>Kq0fmK;tTUK|XLD2`-~Y>pz1QjU6#7LM~AmpDc_?r=Wt{b#t(+G)2RX+$?{PlnT;N>h{K~n- zh2SD`v2zJ<(YX}4w75*TY`NUH{J6ro61XzC4so5}s^x0t>f*Y@HOh6DYliD3*L$w7 zTwB}-ZW1>;H;r48TZvnT+mzd$+k-oRJCZw@JBRx)cRBY-?l$fo?ji1R?n&-B?l;_@ zxYxONd2l=|JbXOjJn}r6JjOh>JZ?PxJP|yJJXt(NJY_r$JZ(HZJVQL=JP&!E@htIt z=Go+hcnQ30yaK#*UL{@~UNc??UQb>IZw&7N-hAE?-fG^{yq&xQyw`c}@jl^Q{)@M-ax@Y(Zu@CEWk^QH3T@s;pZ^PT4F;=9Cmo$o&1Q@+=HANkh# z0Y9FfjbDIYl3$r$m*0ZliQk7mgg>4?gTIi!jK6`uoxhj=8viZ+Y5sZsW&ZE{e+4iC zQ~_QAaREgEZ2>a@M*%N^V1YP+bb&(xr2-8CZ34Xl*92}0ObfgeSP}RkutUSrSZMq- zI!&3TN3*0k(|l=Rv_x7qt(aCxYoc}1F44wl4`_3=CE6P8w;)oGBFHT$Dkv|gC1@(> zAm}9+EEp%4DOe;}F4!p8A=ocCDtKRTR`8ABXTe`WNFj<4w~(liypXn#nUJH9k5H&k zf>4%Fu~4N@lTeq?pwJDWheFSV-V1#b`YVhTW)T(;mK0VIHW0QJb`uT|jut*3d{Fp= zaD#BWaG&sq@IB$D!f%Avgnx^mM3_W)MI=O&MD#?gL|jDtMWRGfMG8bth}4U;i}Z<% zh};vI6Bi?xgOiH(Zg7n>7%EA~}vTO23OCN3y0 zBd#HCD()!mBOWH6B%UXJOuSCKO}tNhRQ$g9Gx2xg-^8~i@Dl72!V+>4S`y|G&Jz12 zA|+BK4oZ|toRl~xaY^E)#FWHKiB*XWI!vd~dFT>!Wx4^~hVDTRrpME>=||`_^j3N= zeT06WK1Y8?|3=@DBuH{fibyI*>PlKlx=IF0#!6;L9+s?WEa0REt!v)QHr5sb^B}rG7|5(qw5KX$ff+X+vo{ zX)oze=_Khq>EqHTrO!zZN{>rVOD{@)mfn)V$gs)?%E-xR%UH;`$OOv7%4EtE%hbrU z%3PGWE;A|fLS|KFLl!B^EXyw|Evq4GChIKgCmSuBE_+zEO14F|S9VnPf$R&}71<3r zgdDRRznrw3rkt7FJ~@B67`aTjV!0Z*Hn~2zF}W$ZmvSHFe#@ifS>=V~<>Ynbt>oS1 zgXI(CbLEfApOo*Ezbt=C{)zmO{5Sbs1(E`{f`o#qg0X_5!hVG)g>;3(3e^g&3VjM= z3R4OT3ZE3V6tRlziXw`Niu#JSie8Fgim8f+6e|?ZDE26hC_Ye}SNx#(O9`#SswAwW zprof{qvWL&rj(*|P^m)cj8c!%sM4g;ywXRd-^v(ec4ZM|C1nF;J7pi`2<0^8BIRo3 zR^@)>8_Ltluav(iZ>tbhxK-#XYAU8G&ME;aaVps=$5a|rI#q^L?x@VEEUT=mB2`&b z1y$u$^;B(Dy;Q?h52zNYR;jkC_N(4hol$+Q`c-vTjjYC}CatEWW})V$7Oa+}R-jg{ zc1EpN?Yi2O+M?Q;+O|4Tokv|#T|?bm-BmqEJyAVhy-fYIdXM^b^(pm5^)>Zv4Wb5* zhLnb;hJ}WkMzBV*#zBn=jb@ELjT;)%8m~3JX#!1(rhulbrjDkKrk7^8W}4<<&05W~ znuD6RHD@)KH8-@-T5MXPTFP3+T25L4T5(#rS|_xcw7RuMwWhQdwZ3TWXp^=1wPmz* zv~9G#v?H|BwTrduw9jc@(Y~wwT>FFeZylTtmkwP=L&sdlO(#SrMW;}wTBl9tlFlui zS)FB_OD&02SOS-poXLXl#H}x=j9D3q{C z8QwFTH~eh4ZA3N_Fp@LUH*zrYGm10HGb%S~HtIK;Fq$=5Hu`0ZGv+pyGS)J-Hug4- zGR`tSZro(tYdmH=WBk^5-2`pIVIpCoVPa|GX%bgUg%9O)Y z!c@c5($v#5!ZgG5nCU6g9@88)g_YPBXfhmYKDgw^@`~w%G}@(`J2U<7Q9I zR?L2zq%q!(T^=qmZMrqnV?JW29rYW2s|{i@J-Ii?2(ZOMy#` zOQ*|-%Z$r=mn~P4E6r8e)y&n?HOe*DwZiqR>s8k&*Cp3YH@q9an}VB(o10sNTee%7 zTbtVzw@J4*ZtLzicRqJ{cVl-q_i*TJa8U-9ts{N9_}6y9@!q{ z9_=1iJ*GU~di?SvcnWwbd7628dPaNZc~*Iz^BnP<@m%)&<3;fj_EPh*^4jl};8o~V z@73*f(`(M_lQ-ne=1uq3@pkZLcpvaC@jmT6;C;_~(ffxF)`!9YsIP{vt*^gtvTw2PDc?TdJH9V{zwbxy=h-i}-*~^<{>c5g`z!aK z+ds1Z@&48Q+kR9(aX&3Tdq0NX0lyNzGk$}95By&HZTJ)XY5pqy7XCi|@&1MW4gS6U zxBOrDe+@tda0kc*7zelqLh6QE?Rs?ngjs!jq zTn*e|urTNhU4|1Qgpt80W3)4_F{T+SjO`$5ka&@Y&$u;K#wM!Mh=>A(A0_A^SqYLb5|DL(YX<4|y8$DHIOn2$cyn z3Uv#O3e69#3B3?H9{M8mYZy9=H%u|iJj^>RKCCFLF|0rAZrH1^jc{VPP`G-yZFpe# zf$-zut>IV0r^8pmcOqCLBqQ`ATp}VOawDoE&PUvgcpmXJ5*^7KsT64u=^L3CSsd9E zIT$$^`8IMZiaAO=N+-%GDl95Hsxqo8>PFPFsISrJXx?b0Xp89m(Mi!qqR&KMj-HBs zAH5yJ5+fO-ALAMm8IvDV8`BeWD`p|)XDlIBC{{hzE;cAOJ+>^iBX%@)Hg+uz8OIZ+ z7-t^m8yh_+iBqxd`>LfZRh9~AG)+BZ(-b!3Z+(;rNi6m(yIVOcA zw2-u(OiUI@)=G9v4ol8Su1@YwzLmU?ypcjm5lzufaZU+O$xW$E=}Ebh@+#$5DkW7s zRX5coH7d0rwIQ`H^?vG7>YoEF2P6*|9`HC2d!Xn*(}BSQQwLVkKpIDyT$)*$Z(34X zNm^^#aN5(fwRBWEU%E=VO*$hzBfTQMD}6kDKK*9~F+(InJHt66A|pSeKBF(=LB_j` z?M${znM{*R@65!^qnRz4!qkvK%QD9Ku zQ4m*9T+m!_t>9_FmxI`Yf(JDZIvtESSa9&`42O zu_Nu|md2JAm$sIUmOd~2Sw<D&l%Qk#;?;)L-qp#~rPW>4x2u<`cWSt5lxys2!fFa?PSp(6 zJgxawORN>IHLUfiO|31jy-<6%_FWyQMxbF7Q3E39j-8>xF661JpPyWBWNwsh zG;a)O%xbJ_9B7l-H@0Q{|_+Pu)AU+=OTnXwqzQX^LwqY3gX2XnNhW zeVXgE%4vtwk*AAJx17Fy`sL~0XV}gtoUu6*dZyq^)0t~$o}F25W^R^gwrFNF=QN*e zzS8`(`FjhwMY6@LC7>m%rLJYL<#Ef`R$?o?)uh$0HM6z0b)a>o^-CL}O`^@XZGT%v zTTRe&WhK?&8vmHOqF`bh+XL&C8T;91;=dPW5er~gqwNt*+rZcSbP-k=J_0EOPKV6(% zDqW6U(OpNn&UQ_7Eu9DF`Oa&ecRinQzV!Ts^Y_oMUO-=R(?r>I?lBW-ff~ zCUr}8n|Cw1bGsY6uXR7~-t1xPQS7nriR?Mt)7~@Qv(yWE`Fpi`-FuUI%X@ozANGE_ zh`%U)(d454#q5hGFAiONc5$PRwNJ6nt}n8$xUao$qVH`#+%M3t)9=}z+F#k<*FW9= zb$~n|Jzy~qJWw!jX5jk3;=uMLo=X~+TrVYFD!bHk>EWf%gM>l)pxGc}FmJGFaAff1 z;GfG}m(?%3Tu!)Ldb#`Z?%IKBFE89anLz+WwLrFswLl=i0 z4Sl^zzAAIo>T1~4!mF)U$FDA3gRjx9>0R@_mVT}7+U09=*EWXPhLwgLhhvA24WA!= zF#K@@KSCcd8wnaI7-=3E8+knnMg>N7N4-YVMr%hekIs#5UT3?meBJ4K-1QUJyRSdI zzBWc0lOD4g3mYpMYahEc_WlOyhR6-08~!(PZk)O?dSmg%&P~3X+BZFKrroT)dHLqt z&CPL+anau5VB+&F;w|Z0R=2`$9lq6Z>&~s! z+t}L@x6N(`-#&P|_4fGfcXv>CMD7^h3A~ec=ggfOci!BE?+V>Dxa)T}=Wf&8(Yvqi zfqS%j`uBYAW!-DMH*#=_&msbaPq zlLC`^lfIK#lZ}%jlZ%tP4`~neAMSsc{qWSo>knT~K~sWLhEx7ixl^a7ZcHsbLOc?A zWc-NnsNhk{qlriFr!mvw(`M5l(}mM#r|(REn8D9T%~;Pw%p9HRnwgwgdrWyO|JeR< z?BmkMy^m)e|9rywMCFOgljJ8=PX?bnd$RSE`>EDbucsMLPd*)ax;P7F1!oOs17`DQ zTV^L_m*=o^^f}A9@VO&%U2~IjU!E~NQ+Ve1EdE*fv;JpKpZ$8y^<4A0=kxUEC!dcz zfAs=-A@sud1>?oR7ws?Zy!bFrn3tKiosXVBG2c7?cz*pQ`%Cqg?l03`*1sHnxwrr= z2rU>dFcuCiv@hIU__Rn`lv}i4j9V;U>|dN+{QZjimGS6Q!`Ufp>0?ltmP5}-l)BCe{{e||$=u6O-qA#6a9)9`$mF=tgSI@7RUz@&;e_i=T_$K?!;akGD>Tg5e7QRE@ zMZTMV5C2~Bz32Or@4tTV{LuU1|D)i?*&p|ReErGtQ}w6E&y1fArY+?yx2^Q8Q(HH;R{jwG$p3Nvlk%tj&*-1Gf3bh1|Jwge z{9E()+TYjPsBQYT&34>&<@S~Bg&lZDe8*}hdZ&D6aA$rO?27JM>_+aE?hfp}*xmj2 zzmh#e{4<=H1;9BS0P6<;)YJkX77PHz>;D0*qMc)+baiY1000SaNLh0L01FZT01FZU z(%pXi0003GNklShtuSz*yA|Dx~^7w#m5+}9MgiAWx0=SewJ>;jW4a&?R^)Z z+r~(Y00IagfB*srAbb;@5QX8fNgpW^LfSn56)urntli@qP;&^X zTq1X%PD2jB7H+7ZN|h$z7#<3mq==%dy(>%npJdsMpJqqX&58g30000002sn{Q)}ZY z?UT{CO1GQ3SH@rR7@_NxQ)@a|%rgmXLgOl3%rmj3ll96)YkxwN2JGH^)*eNy>4G!% z{vg(L(jISl1D5y0L#*JB&)f6#7@o0v6=_d?u$q#Z&L;Z(o%;XL=-U7Q0000000000 zj8$30+vLU&WjmZ&SvY-p4r~124QNk3OF0E);j~`n@^#6B?jl5)fO?sBu&n9i{I0V1 zhiLZ*{w3uEOfY8?Eeofk+9szgW~}!JQWm4XeBYJ3JvacMk1NvxPm!JR6#D=G002ov JPDHLkV1j0ZkzxP< diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_leg.png index 20eebad86061c49b8cd4d911b86d021768152ef9..918b343f98cbd48568efa1ffcf7065f5ca337965 100644 GIT binary patch delta 520 zcmcb@vVdiRayBW9fl<+4XyM<;yu&bVOe-jTULm6rWMT&~+$l z*0F46A2s2b=btBaKHynU{-?r*i|fnIbI&)oBx;;~y6H7Xcg#74%{P7YrhA7^dC$ku zwBYvVyzRnIwnm&|=sub><#}Z|w^f2o8Q;&6_zvmg8$&`>PqgomXI$Va!`J>Uds?bk zY5m`>#vPuMI-YIx`jjfl!TMx3(^)9XFyUp1)-BdR zk*}}X?!6bXnf&|jz1#nr=ZUt>`4O}Jy54p<_WL%IvKedVAHMf#JNLxTa)|{DDlUxg rZ|pgwdFa9H@}0$drZLS|{J=Z!!|%;aQZ+RUK;Y@>=d#Wzfw2hy!+PT! delta 572 zcmV-C0>k~F1k?nOBYy%LNklU<8IhqhDHIPF03bAtq z!3JE8Iu@6Vnf+%9E(HU22)ZR53Zje9DLfA344it9V!4t=^Bm%VjVP(_T}b8o*>3s0 z_kQntxBLzuA|fIpA|fIpBAQb>yIHBbrm4H&O{28|^+rL)aeqs|`1Z56E!3Qx*7^w@ zMQTn?+V%qaXG0z3{wR~S01Q!ca`MIVPlk?~$_a>Wyw@B2++cis{}QiWeuix?X!{;0 zHz1Wt;Ns#tW|4q={uTg0h!Climhh@K;PAjV`l5nzvV=_9!t$V^V_&~n9#rt|bqUX& z-a}thaCqR)$A2pjIe80|lO?#Gu8LQ=9^gD0ucMQm9AUgc*8@)8A8WapN#nXzd1p0_ z>O@3DL_|bHL_|bHQ>ix!@^8=cPI)dMM2Nlp6`4s}=${QCM5tq5GoxiP6dgY9;pn7# zqagS8SCkT`Wik{UKJMXYWM?-k*Vd9+ntr1b5Uu<8Nq=5G+`j)$Nzl@OStnp}T@}g= zXf*>P_%fV%0(}4SO4FAXC888;ZC0mFgSPSb=;Jzs2+?W=u}p`5)oKRD`S~{p5n@%A zVFh+54{nJwh7l8 zU8|0A0ySK3eE8F@#8JBw`|VFUYIls&u0+u`(S9?E?f(R#|I`n0;KVcuXV|p>0000< KMNUMnLSTYrhYC3W diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json index 1070da1203..4ab06e2172 100644 --- a/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json +++ b/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json @@ -1,26 +1,25 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb, by Bhijn, Errant and Flareguy", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "groin_f", + "name": "eyes", "directions": 4 }, { - "name": "groin_m", + "name": "full" + }, + { + "name": "groin", "directions": 4 }, { - "name": "head_f", - "directions": 4 - }, - { - "name": "head_m", + "name": "head", "directions": 4 }, { @@ -60,11 +59,7 @@ "directions": 4 }, { - "name": "torso_f", - "directions": 4 - }, - { - "name": "torso_m", + "name": "torso", "directions": 4 }, { diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_arm.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_arm.png index 0c1f703efdfb13c67b3bca21caa9bb6cd41ba72a..766cd378ea81ab4444dc9c61355d932edac80ebc 100644 GIT binary patch delta 361 zcmZo?Zf2gKT+hH+;1OBOz`!j8!i<;h*8O2%U^Mk~aSW-5dwcUBXS0Jq>qFlQaz`eM zM)bHw^eyf1tq`id(5w*Aahe87bjQHTVVBPEX z_YSK*s+VeI-rjbPd4=22g&ftNFPl{IFW@Y7t>1CGr*vAX*>S(hXW9o0c+`9^Up8I7 zEBBFh!=#+sX}i{KKKcE-@##%_UfHUwT2*DM<$HO~qu=*uhwbIMTF-Grl94ZSjta7k z2)n_of?USjZqex>H)da7wdehB1%Wlw7QfH4_MD{9rcm_KNjoV$H|}|5+0U8R)90!y zbSX`KzEkq}#n;Djx{KKYk`zT;3pf9ryx?5s^L^`HFV;D&Am_N;JYoMyi@x=hza4vx f&La7>Ah%I{a(i=ylm8M=1|aZs^>bP0l+XkKasZX{ delta 365 zcmV-z0h0cM1BU~UBYy!-Nkl)C##!a|C2&)kO~z#v?w_z!Kul`m^ShInUC;$@9wzaMFao<007nqLQiix zLy{o$v}sN|?S~zwmMv9*9H%C}?;34ZVgtU5cXv|tYNPH(uYZ(}WD zFd9#+sfuOL*D~z(@_D(gF1lO)1pZXEyZ`_I000000ANc6p{H+d4=OWwFdF*?p{IS{ zmHGRJTwd>0qGk!1=ic>3DMp2fj2d9iI-P)oHvf+#9EiYQ401q4J9j3o4W@M zvj_+P4~T#Y)cpeDVMtj;E02(p) ze`x>zp#wtVA^{L~-div7Zw>!tyzzTYkYPkbFl1a5W#Z$4{S)E>WJ3c2{zuJxARagZ zGhhg000TtqU5q{D0u=Ygcn}AIfj>ytn*)F>2;Ce1XYBtMOJJlV{4*Ox$E3!E28Sfj z6y+6Eq-iF5Wz(DzqN5lziDZU0d$BSHfhQSppGT4Gcn zBaY@rGm2yQC4?q1XhzYIk|p$?YYOi(mx%MFd0#GU&4Z z^x_|G|Lx9yc#IEHQv5F$L^K2dwXnPULlgi^835bIcX$6Z?e1=$-s52&fYGS`#7Cb3 zKz)7BfBZi_kwyS0`2Y;u{EyGS3V=(80N{KUkQkTruaD`!b^|a#0u(?448ZN3Bf{QE zA_L0aOJ=|VSOFVg2b_Qla04E|3;2NmpaDT33`Bq^5Cal`4kUrp9!s)74#@9Or393L z3Qz;;Km%w3EuaH*fgaG`Kr3hi?Vtmk z1D&7?Tmapm2lRqI&<_T{C2$#B0Yl&_7zQI?6kG>m;3gOc6W|uO1MY%*;69iH55W|8 z1ZKcv@C3|)Iq(cT2lL=1SOBlUYw!lV1@FLnumV=W2k;4e24BEe@D2O`Kfwmr1i!!* z_ye}V4%met2!@al3c^5G2oDh;5=4e55Hm!DSRpou1LB0ZAs&bi5`bus5F`wVLSm2v zM2Dmx8AukAhZG3(|&kA$`aIGJ;GXQ^*{$gsdPN$PTiH93f|DALI(T zLmrS9eMM2R}EEEqVLP<~xbO1_+GNCLe2g-vAphHj*bQn4U zl|aX#Qm7oNgsPw#s19m?8lfiW4AcU(L1&?JP$zUA>V|ruK4<_MgswnWp!C&C-@H)H+Z^7H}E&@iN5Lg5rK|(MgSP*OoP6Q8vA3;M1 zBg7DNgfv1Hp@2|Es39~FItV?4A;JVJTRpO^9Yh8=?czh3H0HL<}GPn+kpv_KNky_DIgz|b z0i+O86iG))Bju1vNL8c;QU|GzG(wsoEs-`z2c$F773qoeLHZ*Z$Pi=%G8!3=OhTq2 zGmzQHeB>cyF|q_%imX7^AnTE*kY|u>$PVOrWDl|*If%T996{bdP9X0hCy|ekPmpuS zdE_hP5^@>&0l9|!j$B9nMsA}33W>s^2q+4Q1;viyM)9MBP@*V0N(QBXQbwtxv{Cvf zBa|7+3T20KM7f|mP(CPsR1hi@6^V*PC8APM8K@joKB^FP1a%x$j;co0qfVikQSGQs z)CJT<)FspqY6NuybqjS5^$<0Knnk@pEuxlC%czg2FQ}iWU#P!mfJUORXd;>k&5Gtk z^P&aOqG&o=2CaZrL2ICO(S~SKv?baW?Sytkd!l{O0q78P1Ud$tfKEkcpmWd#=)>p| zbSb(DU59Q&H>2Cpo#-BPKl(Cy7(IrbK;J_@L_bE)q36-B(eKb7&}-=L=uPw=48R~U zI1C9x#js;|Faj76j08poqkvJxXkzp*Mi_I94aNcEg7LukVgfKBm`F@4CJB><$-?Ag ziZDkprI;#A9p)6K1#=d29&-_M33C;59W#Nsi+PB7jCqE6iFt!r#(ctj!>nVrFuPbJ z7KbHasaOsyFIEsMhLys~VU@8OSY50U)*Netb;P=2y|8}RAZ$1`2AhaIfX%|@V~emQ z*fMN2wgGz@+lKAL_FxCFL)cO5IQA~~A@(u$8Fmr-7Q2dF!~Vej!fxXbI4q8YqvAMl zd^jPTI8GX;fK$V1;|y@7IBT2(&IRX*^TP$pTD~a{Q)5Lb-1!6yOh&V>PO`Ie? zA-*8KCaw_Ii0i~ZB#4A1kx6VM9+DtQf+R~)A!(5eN#-Ow(ms+G$)6NTiY6tI(n)!w zBGPeEC8>ebOzI%@kS>viN#mq@q-oMK(jw_S=@aP(X^RYzF=R5Cjm$$9BGbuoWL2^b z*_doeb|AZveaS)O2y#6606B+TNG>5)kn723$Q|S!@*sJbJWjq(o*_Rczb3DczmPY` z+Y}^)K%r8&C^U*VMV6vM(WV$tEGZ5YH;OMMh!ROjprlc9DMggylxj*NrIpe}>7xu$ z#wd3wk0^7LMap~1XUaO|FB5_Z&qQV7VxlpLGs!WjGU+fGGg&h^F?lfgGleq6Fr_eM zF&$(oVX9ziU}|PM$8?eD3eyTm6?ZGm|2opky(S; zfZ3ecp4pYzmpPa@iaCingSmkDD04Y;J##bjIp&MZL(F5$cbTV|pE18?USP=-(BdLkh3~E002(_GAPi>}lQv0Y^sW++jsgJ2I zs7ut3)F0G8EC?0?3kwSmi!h56ixP_#i!qBei!+NCOCU=GO9D$eOFqjHmU5N`mKK&S zmVTCNEaNN>Se~*hu)JqkW7%NYWyP>kSUFf}tP-s9tm>==tQM>etRAfXtYNJ2tZA%y ztVdYOS?gI_Si4vUSch3BSRb;^vc6(nVg1JXn+;;avr*Z2*o4`n*_7FI*i6`L*<9It z*+ST2*izYY*bcLmvDL9PvvsodvkkLNusvj(V|&H6%J!XYiygsEWM^gPV;5tWV^?F> zXSZN?WcOeXV2@x=WY1(j$bO8yn!Sm=gZ(1=5c^H`2kcMT7ui?Xzp-y|AUKE|tQ>qC zVjOZD>Kq0fmK;tTUK|XLD2`-~Y>pz1QjU6#7LM~AmpDc_?r=Wt{b#t(+G)2RX+$?{PlnT;N>h{K~n- zh2SD`v2zJ<(YX}4w75*TY`NUH{J6ro61XzC4so5}s^x0t>f*Y@HOh6DYliD3*L$w7 zTwB}-ZW1>;H;r48TZvnT+mzd$+k-oRJCZw@JBRx)cRBY-?l$fo?ji1R?n&-B?l;_@ zxYxONd2l=|JbXOjJn}r6JjOh>JZ?PxJP|yJJXt(NJY_r$JZ(HZJVQL=JP&!E@htIt z=Go+hcnQ30yaK#*UL{@~UNc??UQb>IZw&7N-hAE?-fG^{yq&xQyw`c}@jl^Q{)@M-ax@Y(Zu@CEWk^QH3T@s;pZ^PT4F;=9Cmo$o&1Q@+=HANkh# z0Y9FfjbDIYl3$r$m*0ZliQk7mgg>4?gTIi!jK6`uoxhj=8viZ+Y5sZsW&ZE{e+4iC zQ~_QAaREgEZ2>a@M*%N^V1YP+bb&(xr2-8CZ34Xl*92}0ObfgeSP}RkutUSrSZMq- zI!&3TN3*0k(|l=Rv_x7qt(aCxYoc}1F44wl4`_3=CE6P8w;)oGBFHT$Dkv|gC1@(> zAm}9+EEp%4DOe;}F4!p8A=ocCDtKRTR`8ABXTe`WNFj<4w~(liypXn#nUJH9k5H&k zf>4%Fu~4N@lTeq?pwJDWheFSV-V1#b`YVhTW)T(;mK0VIHW0QJb`uT|jut*3d{Fp= zaD#BWaG&sq@IB$D!f%Avgnx^mM3_W)MI=O&MD#?gL|jDtMWRGfMG8bth}4U;i}Z<% zh};vI6Bi?xgOiH(Zg7n>7%EA~}vTO23OCN3y0 zBd#HCD()!mBOWH6B%UXJOuSCKO}tNhRQ$g9Gx2xg-^8~i@Dl72!V+>4S`y|G&Jz12 zA|+BK4oZ|toRl~xaY^E)#FWHKiB*XWI!vd~dFT>!Wx4^~hVDTRrpME>=||`_^j3N= zeT06WK1Y8?|3=@DBuH{fibyI*>PlKlx=IF0#!6;L9+s?WEa0REt!v)QHr5sb^B}rG7|5(qw5KX$ff+X+vo{ zX)oze=_Khq>EqHTrO!zZN{>rVOD{@)mfn)V$gs)?%E-xR%UH;`$OOv7%4EtE%hbrU z%3PGWE;A|fLS|KFLl!B^EXyw|Evq4GChIKgCmSuBE_+zEO14F|S9VnPf$R&}71<3r zgdDRRznrw3rkt7FJ~@B67`aTjV!0Z*Hn~2zF}W$ZmvSHFe#@ifS>=V~<>Ynbt>oS1 zgXI(CbLEfApOo*Ezbt=C{)zmO{5Sbs1(E`{f`o#qg0X_5!hVG)g>;3(3e^g&3VjM= z3R4OT3ZE3V6tRlziXw`Niu#JSie8Fgim8f+6e|?ZDE26hC_Ye}SNx#(O9`#SswAwW zprof{qvWL&rj(*|P^m)cj8c!%sM4g;ywXRd-^v(ec4ZM|C1nF;J7pi`2<0^8BIRo3 zR^@)>8_Ltluav(iZ>tbhxK-#XYAU8G&ME;aaVps=$5a|rI#q^L?x@VEEUT=mB2`&b z1y$u$^;B(Dy;Q?h52zNYR;jkC_N(4hol$+Q`c-vTjjYC}CatEWW})V$7Oa+}R-jg{ zc1EpN?Yi2O+M?Q;+O|4Tokv|#T|?bm-BmqEJyAVhy-fYIdXM^b^(pm5^)>Zv4Wb5* zhLnb;hJ}WkMzBV*#zBn=jb@ELjT;)%8m~3JX#!1(rhulbrjDkKrk7^8W}4<<&05W~ znuD6RHD@)KH8-@-T5MXPTFP3+T25L4T5(#rS|_xcw7RuMwWhQdwZ3TWXp^=1wPmz* zv~9G#v?H|BwTrduw9jc@(Y~wwT>FFeZylTtmkwP=L&sdlO(#SrMW;}wTBl9tlFlui zS)FB_OD&02SOS-poXLXl#H}x=j9D3q{C z8QwFTH~eh4ZA3N_Fp@LUH*zrYGm10HGb%S~HtIK;Fq$=5Hu`0ZGv+pyGS)J-Hug4- zGR`tSZro(tYdmH=WBk^5-2`pIVIpCoVPa|GX%bgUg%9O)Y z!c@c5($v#5!ZgG5nCU6g9@88)g_YPBXfhmYKDgw^@`~w%G}@(`J2U<7Q9I zR?L2zq%q!(T^=qmZMrqnV?JW29rYW2s|{i@J-Ii?2(ZOMy#` zOQ*|-%Z$r=mn~P4E6r8e)y&n?HOe*DwZiqR>s8k&*Cp3YH@q9an}VB(o10sNTee%7 zTbtVzw@J4*ZtLzicRqJ{cVl-q_i*TJa8U-9ts{N9_}6y9@!q{ z9_=1iJ*GU~di?SvcnWwbd7628dPaNZc~*Iz^BnP<@m%)&<3;fj_EPh*^4jl};8o~V z@73*f(`(M_lQ-ne=1uq3@pkZLcpvaC@jmT6;C;_~(ffxF)`!9YsIP{vt*^gtvTw2PDc?TdJH9V{zwbxy=h-i}-*~^<{>c5g`z!aK z+ds1Z@&48Q+kR9(aX&3Tdq0NX0lyNzGk$}95By&HZTJ)XY5pqy7XCi|@&1MW4gS6U zxBOrDe+@tda0kc*7zelqLh6QE?Rs?ngjs!jq zTn*e|urTNhU4|1Qgpt80W3)4_F{T+SjO`$5ka&@Y&$u;K#wM!Mh=>A(A0_A^SqYLb5|DL(YX<4|y8$DHIOn2$cyn z3Uv#O3e69#3B3?H9{M8mYZy9=H%u|iJj^>RKCCFLF|0rAZrH1^jc{VPP`G-yZFpe# zf$-zut>IV0r^8pmcOqCLBqQ`ATp}VOawDoE&PUvgcpmXJ5*^7KsT64u=^L3CSsd9E zIT$$^`8IMZiaAO=N+-%GDl95Hsxqo8>PFPFsISrJXx?b0Xp89m(Mi!qqR&KMj-HBs zAH5yJ5+fO-ALAMm8IvDV8`BeWD`p|)XDlIBC{{hzE;cAOJ+>^iBX%@)Hg+uz8OIZ+ z7-t^m8yh_+iBqxd`>LfZRh9~AG)+BZ(-b!3Z+(;rNi6m(yIVOcA zw2-u(OiUI@)=G9v4ol8Su1@YwzLmU?ypcjm5lzufaZU+O$xW$E=}Ebh@+#$5DkW7s zRX5coH7d0rwIQ`H^?vG7>YoEF2P6*|9`HC2d!Xn*(}BSQQwLVkKpIDyT$)*$Z(34X zNm^^#aN5(fwRBWEU%E=VO*$hzBfTQMD}6kDKK*9~F+(InJHt66A|pSeKBF(=LB_j` z?M${znM{*R@65!^qnRz4!qkvK%QD9Ku zQ4m*9T+m!_t>9_FmxI`Yf(JDZIvtESSa9&`42O zu_Nu|md2JAm$sIUmOd~2Sw<D&l%Qk#;?;)L-qp#~rPW>4x2u<`cWSt5lxys2!fFa?PSp(6 zJgxawORN>IHLUfiO|31jy-<6%_FWyQMxbF7Q3E39j-8>xF661JpPyWBWNwsh zG;a)O%xbJ_9B7l-H@0Q{|_+Pu)AU+=OTnXwqzQX^LwqY3gX2XnNhW zeVXgE%4vtwk*AAJx17Fy`sL~0XV}gtoUu6*dZyq^)0t~$o}F25W^R^gwrFNF=QN*e zzS8`(`FjhwMY6@LC7>m%rLJYL<#Ef`R$?o?)uh$0HM6z0b)a>o^-CL}O`^@XZGT%v zTTRe&WhK?&8vmHOqF`bh+XL&C8T;91;=dPW5er~gqwNt*+rZcSbP-k=J_0EOPKV6(% zDqW6U(OpNn&UQ_7Eu9DF`Oa&ecRinQzV!Ts^Y_oMUO-=R(?r>I?lBW-ff~ zCUr}8n|Cw1bGsY6uXR7~-t1xPQS7nriR?Mt)7~@Qv(yWE`Fpi`-FuUI%X@ozANGE_ zh`%U)(d454#q5hGFAiONc5$PRwNJ6nt}n8$xUao$qVH`#+%M3t)9=}z+F#k<*FW9= zb$~n|Jzy~qJWw!jX5jk3;=uMLo=X~+TrVYFD!bHk>EWf%gM>l)pxGc}FmJGFaAff1 z;GfG}m(?%3Tu!)Ldb#`Z?%IKBFE89anLz+WwLrFswLl=i0 z4Sl^zzAAIo>T1~4!mF)U$FDA3gRjx9>0R@_mVT}7+U09=*EWXPhLwgLhhvA24WA!= zF#K@@KSCcd8wnaI7-=3E8+knnMg>N7N4-YVMr%hekIs#5UT3?meBJ4K-1QUJyRSdI zzBWc0lOD4g3mYpMYahEc_WlOyhR6-08~!(PZk)O?dSmg%&P~3X+BZFKrroT)dHLqt z&CPL+anau5VB+&F;w|Z0R=2`$9lq6Z>&~s! z+t}L@x6N(`-#&P|_4fGfcXv>CMD7^h3A~ec=ggfOci!BE?+V>Dxa)T}=Wf&8(Yvqi zfqS%j`uBYAW!-DMH*#=_&msbaPq zlLC`^lfIK#lZ}%jlZ%tP4`~neAMSsc{qWSo>knT~K~sWLhEx7ixl^a7ZcHsbLOc?A zWc-NnsNhk{qlriFr!mvw(`M5l(}mM#r|(REn8D9T%~;Pw%p9HRnwgwgdrWyO|JeR< z?BmkMy^m)e|9rywMCFOgljJ8=PX?bnd$RSE`>EDbucsMLPd*)ax;P7F1!oOs17`DQ zTV^L_m*=o^^f}A9@VO&%U2~IjU!E~NQ+Ve1EdE*fv;JpKpZ$8y^<4A0=kxUEC!dcz zfAs=-A@sud1>?oR7ws?Zy!bFrn3tKiosXVBG2c7?cz*pQ`%Cqg?l03`*1sHnxwrr= z2rU>dFcuCiv@hIU__Rn`lv}i4j9V;U>|dN+{QZjimGS6Q!`Ufp>0?ltmP5}-l)BCe{{e||$=u6O-qA#6a9)9`$mF=tgSI@7RUz@&;e_i=T_$K?!;akGD>Tg5e7QRE@ zMZTMV5C2~Bz32Or@4tTV{LuU1|D)i?*&p|ReErGtQ}w6E&y1fArY+?yx2^Q8Q(HH;R{jwG$p3Nvlk%tj&*-1Gf3bh1|Jwge z{9E()+TYjPsBQYT&34>&<@S~Bg&lZDe8*}hdZ&D6aA$rO?27JM>_+aE?hfp}*xmj2 zzmh#e{4<=H1;9BS0P6<;)YJkX77PHz>;D0*qMc)+baiY1000SaNLh0L01FZT01FZU z(%pXi0002lNklST5Cu>ti@_e$jN=KYVK%lPIV7Uc83chy?`q5U{f_QP zNf97GfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z*=B>SI&8A+jhE>P2|~|>sk7c zc>FL7rN=KhSJ!oloLicg0?dzZnr6Pc>$=C5CTE{r@{Hq{B4^+Cn-I><=Y9eN2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF{GUMV;_tA1jSNTpr%<{cUrnm2s&qv2z2lGG ok>Qg1l3%`rU+&^RJ&zi|3+YWt@vudkR{#J207*qoM6N<$f@FMAj{pDw delta 225 zcmX@)_J?tTay`RgPZ!6KiaBp@ZR9;U;JI~5I%3|tVKTq?y;WU?0E6`YoC9m!p~%m?0z1?UBSS|Vsm?0 Ri9-rVyQiz4%Q~loCIFI+U8Dd2 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_hand.png index d794c608bdafba81341f53d123f98b8e720e4c6d..98f8b376a81311c39e02b9cb18118f5529ffd35e 100644 GIT binary patch literal 9085 zcmV-@BZAzCP)oHvf+#9EiYQ401q4J9j3o4W@M zvj_+P4~T#Y)cpeDVMtj;E02(p) ze`x>zp#wtVA^{L~-div7Zw>!tyzzTYkYPkbFl1a5W#Z$4{S)E>WJ3c2{zuJxARagZ zGhhg000TtqU5q{D0u=Ygcn}AIfj>ytn*)F>2;Ce1XYBtMOJJlV{4*Ox$E3!E28Sfj z6y+6Eq-iF5Wz(DzqN5lziDZU0d$BSHfhQSppGT4Gcn zBaY@rGm2yQC4?q1XhzYIk|p$?YYOi(mx%MFd0#GU&4Z z^x_|G|Lx9yc#IEHQv5F$L^K2dwXnPULlgi^835bIcX$6Z?e1=$-s52&fYGS`#7Cb3 zKz)7BfBZi_kwyS0`2Y;u{EyGS3V=(80N{KUkQkTruaD`!b^|a#0u(?448ZN3Bf{QE zA_L0aOJ=|VSOFVg2b_Qla04E|3;2NmpaDT33`Bq^5Cal`4kUrp9!s)74#@9Or393L z3Qz;;Km%w3EuaH*fgaG`Kr3hi?Vtmk z1D&7?Tmapm2lRqI&<_T{C2$#B0Yl&_7zQI?6kG>m;3gOc6W|uO1MY%*;69iH55W|8 z1ZKcv@C3|)Iq(cT2lL=1SOBlUYw!lV1@FLnumV=W2k;4e24BEe@D2O`Kfwmr1i!!* z_ye}V4%met2!@al3c^5G2oDh;5=4e55Hm!DSRpou1LB0ZAs&bi5`bus5F`wVLSm2v zM2Dmx8AukAhZG3(|&kA$`aIGJ;GXQ^*{$gsdPN$PTiH93f|DALI(T zLmrS9eMM2R}EEEqVLP<~xbO1_+GNCLe2g-vAphHj*bQn4U zl|aX#Qm7oNgsPw#s19m?8lfiW4AcU(L1&?JP$zUA>V|ruK4<_MgswnWp!C&C-@H)H+Z^7H}E&@iN5Lg5rK|(MgSP*OoP6Q8vA3;M1 zBg7DNgfv1Hp@2|Es39~FItV?4A;JVJTRpO^9Yh8=?czh3H0HL<}GPn+kpv_KNky_DIgz|b z0i+O86iG))Bju1vNL8c;QU|GzG(wsoEs-`z2c$F773qoeLHZ*Z$Pi=%G8!3=OhTq2 zGmzQHeB>cyF|q_%imX7^AnTE*kY|u>$PVOrWDl|*If%T996{bdP9X0hCy|ekPmpuS zdE_hP5^@>&0l9|!j$B9nMsA}33W>s^2q+4Q1;viyM)9MBP@*V0N(QBXQbwtxv{Cvf zBa|7+3T20KM7f|mP(CPsR1hi@6^V*PC8APM8K@joKB^FP1a%x$j;co0qfVikQSGQs z)CJT<)FspqY6NuybqjS5^$<0Knnk@pEuxlC%czg2FQ}iWU#P!mfJUORXd;>k&5Gtk z^P&aOqG&o=2CaZrL2ICO(S~SKv?baW?Sytkd!l{O0q78P1Ud$tfKEkcpmWd#=)>p| zbSb(DU59Q&H>2Cpo#-BPKl(Cy7(IrbK;J_@L_bE)q36-B(eKb7&}-=L=uPw=48R~U zI1C9x#js;|Faj76j08poqkvJxXkzp*Mi_I94aNcEg7LukVgfKBm`F@4CJB><$-?Ag ziZDkprI;#A9p)6K1#=d29&-_M33C;59W#Nsi+PB7jCqE6iFt!r#(ctj!>nVrFuPbJ z7KbHasaOsyFIEsMhLys~VU@8OSY50U)*Netb;P=2y|8}RAZ$1`2AhaIfX%|@V~emQ z*fMN2wgGz@+lKAL_FxCFL)cO5IQA~~A@(u$8Fmr-7Q2dF!~Vej!fxXbI4q8YqvAMl zd^jPTI8GX;fK$V1;|y@7IBT2(&IRX*^TP$pTD~a{Q)5Lb-1!6yOh&V>PO`Ie? zA-*8KCaw_Ii0i~ZB#4A1kx6VM9+DtQf+R~)A!(5eN#-Ow(ms+G$)6NTiY6tI(n)!w zBGPeEC8>ebOzI%@kS>viN#mq@q-oMK(jw_S=@aP(X^RYzF=R5Cjm$$9BGbuoWL2^b z*_doeb|AZveaS)O2y#6606B+TNG>5)kn723$Q|S!@*sJbJWjq(o*_Rczb3DczmPY` z+Y}^)K%r8&C^U*VMV6vM(WV$tEGZ5YH;OMMh!ROjprlc9DMggylxj*NrIpe}>7xu$ z#wd3wk0^7LMap~1XUaO|FB5_Z&qQV7VxlpLGs!WjGU+fGGg&h^F?lfgGleq6Fr_eM zF&$(oVX9ziU}|PM$8?eD3eyTm6?ZGm|2opky(S; zfZ3ecp4pYzmpPa@iaCingSmkDD04Y;J##bjIp&MZL(F5$cbTV|pE18?USP=-(BdLkh3~E002(_GAPi>}lQv0Y^sW++jsgJ2I zs7ut3)F0G8EC?0?3kwSmi!h56ixP_#i!qBei!+NCOCU=GO9D$eOFqjHmU5N`mKK&S zmVTCNEaNN>Se~*hu)JqkW7%NYWyP>kSUFf}tP-s9tm>==tQM>etRAfXtYNJ2tZA%y ztVdYOS?gI_Si4vUSch3BSRb;^vc6(nVg1JXn+;;avr*Z2*o4`n*_7FI*i6`L*<9It z*+ST2*izYY*bcLmvDL9PvvsodvkkLNusvj(V|&H6%J!XYiygsEWM^gPV;5tWV^?F> zXSZN?WcOeXV2@x=WY1(j$bO8yn!Sm=gZ(1=5c^H`2kcMT7ui?Xzp-y|AUKE|tQ>qC zVjOZD>Kq0fmK;tTUK|XLD2`-~Y>pz1QjU6#7LM~AmpDc_?r=Wt{b#t(+G)2RX+$?{PlnT;N>h{K~n- zh2SD`v2zJ<(YX}4w75*TY`NUH{J6ro61XzC4so5}s^x0t>f*Y@HOh6DYliD3*L$w7 zTwB}-ZW1>;H;r48TZvnT+mzd$+k-oRJCZw@JBRx)cRBY-?l$fo?ji1R?n&-B?l;_@ zxYxONd2l=|JbXOjJn}r6JjOh>JZ?PxJP|yJJXt(NJY_r$JZ(HZJVQL=JP&!E@htIt z=Go+hcnQ30yaK#*UL{@~UNc??UQb>IZw&7N-hAE?-fG^{yq&xQyw`c}@jl^Q{)@M-ax@Y(Zu@CEWk^QH3T@s;pZ^PT4F;=9Cmo$o&1Q@+=HANkh# z0Y9FfjbDIYl3$r$m*0ZliQk7mgg>4?gTIi!jK6`uoxhj=8viZ+Y5sZsW&ZE{e+4iC zQ~_QAaREgEZ2>a@M*%N^V1YP+bb&(xr2-8CZ34Xl*92}0ObfgeSP}RkutUSrSZMq- zI!&3TN3*0k(|l=Rv_x7qt(aCxYoc}1F44wl4`_3=CE6P8w;)oGBFHT$Dkv|gC1@(> zAm}9+EEp%4DOe;}F4!p8A=ocCDtKRTR`8ABXTe`WNFj<4w~(liypXn#nUJH9k5H&k zf>4%Fu~4N@lTeq?pwJDWheFSV-V1#b`YVhTW)T(;mK0VIHW0QJb`uT|jut*3d{Fp= zaD#BWaG&sq@IB$D!f%Avgnx^mM3_W)MI=O&MD#?gL|jDtMWRGfMG8bth}4U;i}Z<% zh};vI6Bi?xgOiH(Zg7n>7%EA~}vTO23OCN3y0 zBd#HCD()!mBOWH6B%UXJOuSCKO}tNhRQ$g9Gx2xg-^8~i@Dl72!V+>4S`y|G&Jz12 zA|+BK4oZ|toRl~xaY^E)#FWHKiB*XWI!vd~dFT>!Wx4^~hVDTRrpME>=||`_^j3N= zeT06WK1Y8?|3=@DBuH{fibyI*>PlKlx=IF0#!6;L9+s?WEa0REt!v)QHr5sb^B}rG7|5(qw5KX$ff+X+vo{ zX)oze=_Khq>EqHTrO!zZN{>rVOD{@)mfn)V$gs)?%E-xR%UH;`$OOv7%4EtE%hbrU z%3PGWE;A|fLS|KFLl!B^EXyw|Evq4GChIKgCmSuBE_+zEO14F|S9VnPf$R&}71<3r zgdDRRznrw3rkt7FJ~@B67`aTjV!0Z*Hn~2zF}W$ZmvSHFe#@ifS>=V~<>Ynbt>oS1 zgXI(CbLEfApOo*Ezbt=C{)zmO{5Sbs1(E`{f`o#qg0X_5!hVG)g>;3(3e^g&3VjM= z3R4OT3ZE3V6tRlziXw`Niu#JSie8Fgim8f+6e|?ZDE26hC_Ye}SNx#(O9`#SswAwW zprof{qvWL&rj(*|P^m)cj8c!%sM4g;ywXRd-^v(ec4ZM|C1nF;J7pi`2<0^8BIRo3 zR^@)>8_Ltluav(iZ>tbhxK-#XYAU8G&ME;aaVps=$5a|rI#q^L?x@VEEUT=mB2`&b z1y$u$^;B(Dy;Q?h52zNYR;jkC_N(4hol$+Q`c-vTjjYC}CatEWW})V$7Oa+}R-jg{ zc1EpN?Yi2O+M?Q;+O|4Tokv|#T|?bm-BmqEJyAVhy-fYIdXM^b^(pm5^)>Zv4Wb5* zhLnb;hJ}WkMzBV*#zBn=jb@ELjT;)%8m~3JX#!1(rhulbrjDkKrk7^8W}4<<&05W~ znuD6RHD@)KH8-@-T5MXPTFP3+T25L4T5(#rS|_xcw7RuMwWhQdwZ3TWXp^=1wPmz* zv~9G#v?H|BwTrduw9jc@(Y~wwT>FFeZylTtmkwP=L&sdlO(#SrMW;}wTBl9tlFlui zS)FB_OD&02SOS-poXLXl#H}x=j9D3q{C z8QwFTH~eh4ZA3N_Fp@LUH*zrYGm10HGb%S~HtIK;Fq$=5Hu`0ZGv+pyGS)J-Hug4- zGR`tSZro(tYdmH=WBk^5-2`pIVIpCoVPa|GX%bgUg%9O)Y z!c@c5($v#5!ZgG5nCU6g9@88)g_YPBXfhmYKDgw^@`~w%G}@(`J2U<7Q9I zR?L2zq%q!(T^=qmZMrqnV?JW29rYW2s|{i@J-Ii?2(ZOMy#` zOQ*|-%Z$r=mn~P4E6r8e)y&n?HOe*DwZiqR>s8k&*Cp3YH@q9an}VB(o10sNTee%7 zTbtVzw@J4*ZtLzicRqJ{cVl-q_i*TJa8U-9ts{N9_}6y9@!q{ z9_=1iJ*GU~di?SvcnWwbd7628dPaNZc~*Iz^BnP<@m%)&<3;fj_EPh*^4jl};8o~V z@73*f(`(M_lQ-ne=1uq3@pkZLcpvaC@jmT6;C;_~(ffxF)`!9YsIP{vt*^gtvTw2PDc?TdJH9V{zwbxy=h-i}-*~^<{>c5g`z!aK z+ds1Z@&48Q+kR9(aX&3Tdq0NX0lyNzGk$}95By&HZTJ)XY5pqy7XCi|@&1MW4gS6U zxBOrDe+@tda0kc*7zelqLh6QE?Rs?ngjs!jq zTn*e|urTNhU4|1Qgpt80W3)4_F{T+SjO`$5ka&@Y&$u;K#wM!Mh=>A(A0_A^SqYLb5|DL(YX<4|y8$DHIOn2$cyn z3Uv#O3e69#3B3?H9{M8mYZy9=H%u|iJj^>RKCCFLF|0rAZrH1^jc{VPP`G-yZFpe# zf$-zut>IV0r^8pmcOqCLBqQ`ATp}VOawDoE&PUvgcpmXJ5*^7KsT64u=^L3CSsd9E zIT$$^`8IMZiaAO=N+-%GDl95Hsxqo8>PFPFsISrJXx?b0Xp89m(Mi!qqR&KMj-HBs zAH5yJ5+fO-ALAMm8IvDV8`BeWD`p|)XDlIBC{{hzE;cAOJ+>^iBX%@)Hg+uz8OIZ+ z7-t^m8yh_+iBqxd`>LfZRh9~AG)+BZ(-b!3Z+(;rNi6m(yIVOcA zw2-u(OiUI@)=G9v4ol8Su1@YwzLmU?ypcjm5lzufaZU+O$xW$E=}Ebh@+#$5DkW7s zRX5coH7d0rwIQ`H^?vG7>YoEF2P6*|9`HC2d!Xn*(}BSQQwLVkKpIDyT$)*$Z(34X zNm^^#aN5(fwRBWEU%E=VO*$hzBfTQMD}6kDKK*9~F+(InJHt66A|pSeKBF(=LB_j` z?M${znM{*R@65!^qnRz4!qkvK%QD9Ku zQ4m*9T+m!_t>9_FmxI`Yf(JDZIvtESSa9&`42O zu_Nu|md2JAm$sIUmOd~2Sw<D&l%Qk#;?;)L-qp#~rPW>4x2u<`cWSt5lxys2!fFa?PSp(6 zJgxawORN>IHLUfiO|31jy-<6%_FWyQMxbF7Q3E39j-8>xF661JpPyWBWNwsh zG;a)O%xbJ_9B7l-H@0Q{|_+Pu)AU+=OTnXwqzQX^LwqY3gX2XnNhW zeVXgE%4vtwk*AAJx17Fy`sL~0XV}gtoUu6*dZyq^)0t~$o}F25W^R^gwrFNF=QN*e zzS8`(`FjhwMY6@LC7>m%rLJYL<#Ef`R$?o?)uh$0HM6z0b)a>o^-CL}O`^@XZGT%v zTTRe&WhK?&8vmHOqF`bh+XL&C8T;91;=dPW5er~gqwNt*+rZcSbP-k=J_0EOPKV6(% zDqW6U(OpNn&UQ_7Eu9DF`Oa&ecRinQzV!Ts^Y_oMUO-=R(?r>I?lBW-ff~ zCUr}8n|Cw1bGsY6uXR7~-t1xPQS7nriR?Mt)7~@Qv(yWE`Fpi`-FuUI%X@ozANGE_ zh`%U)(d454#q5hGFAiONc5$PRwNJ6nt}n8$xUao$qVH`#+%M3t)9=}z+F#k<*FW9= zb$~n|Jzy~qJWw!jX5jk3;=uMLo=X~+TrVYFD!bHk>EWf%gM>l)pxGc}FmJGFaAff1 z;GfG}m(?%3Tu!)Ldb#`Z?%IKBFE89anLz+WwLrFswLl=i0 z4Sl^zzAAIo>T1~4!mF)U$FDA3gRjx9>0R@_mVT}7+U09=*EWXPhLwgLhhvA24WA!= zF#K@@KSCcd8wnaI7-=3E8+knnMg>N7N4-YVMr%hekIs#5UT3?meBJ4K-1QUJyRSdI zzBWc0lOD4g3mYpMYahEc_WlOyhR6-08~!(PZk)O?dSmg%&P~3X+BZFKrroT)dHLqt z&CPL+anau5VB+&F;w|Z0R=2`$9lq6Z>&~s! z+t}L@x6N(`-#&P|_4fGfcXv>CMD7^h3A~ec=ggfOci!BE?+V>Dxa)T}=Wf&8(Yvqi zfqS%j`uBYAW!-DMH*#=_&msbaPq zlLC`^lfIK#lZ}%jlZ%tP4`~neAMSsc{qWSo>knT~K~sWLhEx7ixl^a7ZcHsbLOc?A zWc-NnsNhk{qlriFr!mvw(`M5l(}mM#r|(REn8D9T%~;Pw%p9HRnwgwgdrWyO|JeR< z?BmkMy^m)e|9rywMCFOgljJ8=PX?bnd$RSE`>EDbucsMLPd*)ax;P7F1!oOs17`DQ zTV^L_m*=o^^f}A9@VO&%U2~IjU!E~NQ+Ve1EdE*fv;JpKpZ$8y^<4A0=kxUEC!dcz zfAs=-A@sud1>?oR7ws?Zy!bFrn3tKiosXVBG2c7?cz*pQ`%Cqg?l03`*1sHnxwrr= z2rU>dFcuCiv@hIU__Rn`lv}i4j9V;U>|dN+{QZjimGS6Q!`Ufp>0?ltmP5}-l)BCe{{e||$=u6O-qA#6a9)9`$mF=tgSI@7RUz@&;e_i=T_$K?!;akGD>Tg5e7QRE@ zMZTMV5C2~Bz32Or@4tTV{LuU1|D)i?*&p|ReErGtQ}w6E&y1fArY+?yx2^Q8Q(HH;R{jwG$p3Nvlk%tj&*-1Gf3bh1|Jwge z{9E()+TYjPsBQYT&34>&<@S~Bg&lZDe8*}hdZ&D6aA$rO?27JM>_+aE?hfp}*xmj2 zzmh#e{4<=H1;9BS0P6<;)YJkX77PHz>;D0*qMc)+baiY1000SaNLh0L01FZT01FZU z(%pXi0003LNklLi~NWc+Vr}d7kylPEDn`V_{PO)eevcd9cpJAbc* ze{$cYjykUqPelL$1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R(CZOw)9Em-?Y8M!LrT z2&2hTe9nH~fcO6L75P?BQ{ZXuKuLh6cB)9nRaT^A=e4OfAiMXj_;5>NpT*mM_r?AL vVyKeOIy2bLHy7xq)LeuB0tg_0z+2!2u3~xWDJ$sA00000NkvXXu0mjf_*-k2 delta 328 zcmV-O0k{7BM&bgHBYy!YNkl9J)&saSjc|ZYWi%n_2YVUZJ89B0 zm`+~8J21PH1C)WKlbt%bRA;>auY)l$CeVODq5gjhB#@8idjivo2mk;80001hZ=vyZ zwG8ysIjUGK0}YLTH2Wa$LTG%QPAqZkOcry~s}dG-qmG@)bbn&Wu@Z6%5D{_gOwz4L z6em`_5t|joiIr}@@~@Lk;k_4y3q92tt6fo?$jiZ0UtlyI>d#}}{5gMLH~!nX>;nJ* z00000007{B@!a~S)P>XGJdY1XJ$H5%Bd5{@gvQs`w}IT>e#qU;Rcj@9uF>?l{xN;& z0@lgK+U->i??IP!XDJk1S9)2SF&Yomb7$J-(DoY4uXcM#k^w=d3EF6WFNYDV1B|UvK^JeqVduyysaDS00$~wra20t>^{27*}6CWfFh> zj=}`?n>F{tt5-7wEYRrM))5vp*T;g<@{oZ^pvcVIZ`I~}HTGd`VA2S?zBN*B`m3a5 zABR2@-`h*w_cG3VUdp;j$JkMzre~w#+gT?XZKj_-nzKE+dCn|%n_neXTVKodyPy44 zKe^X+-QB$O9KXzm{x1*wt?L(_|8_saw?^p?bAxy3_ASP6I+BOZgfi5ge4ev^|M!!+ zc|Bhu?|hZna^M2vv1b3fwqI4K38?O&3=EG zvy4sPcwv39-F)fk>WX_gH}7G*^g-{~-nVQyX0yMEODx|Xp>u2R4TI3ooi}D@@K!UQ z+GO(jYt=0=TLHdy=i>eMcl+=89lZCyfRk>@j7@3fMhq4AZ1S34+>qgO@}12nz&CxG uZmQtDjg_-6DBZXoG;Pje4TnZ?CjJBSzZ|oAQD)2l1fH&JelF{r5}E*Mw&2nL delta 567 zcmV-70?7TP1kVJJBYy%GNklJZQ4&q7EPtJFTAEf_lr1%4{*HV;BmJ->m^j=YD$-9&z~TN-@f;J+pFPIe zn<`c&rquet0e`&z2-LDw*r(Dproui2tf#X&Wd!bHyWdlQ&AB-De{=A{uak&~h=_=Y zh=_=YXyLWm74fg@Fy>>v6_DeMvAee_iUkecX!>&`7Dc5019taTMI3KIhQIkRbHKYq z3cxR>)vk!Nrp5l|!%Twj66y%-Y;TEs#=BVGL{PUoz<<4r9zrY~kfyjhAaDR1>$Ab= z&i0mA&WYcO84kb3QcMv3=H1IFI!A8gL1^Fr?0!$#Sl<-OIRQggp}7z7K-AzkV_aQ* zi=~+V=^VL=2BR01_ovk zPZ!6KinzD49Q%|Ed0bb!7qbiKJmA{k_(-gP*MjePLvX{9ChG%CEanNv&vZXiHh(3S zS{{6vJKD)L$Zy}@$4eF+37tBLM}_&MgV6*8RVs1gZQ1tzFLtZfUtaE>zB8t-V1PHDeQuikX; z!V(LaX=xVyE6)55Kb5p`$Jw;ayFX7@pfSToP4xZVAL}?Q=K7^hsVuXaYb}=Q;=f)n zt~T-Z%7nKczdToRkY!GryENzU#bgH;@tm{Ox7_FUCrmepUVq*E8pB@=_e1(g3>F+W z9-Nw{u`iof;C6rU+@j#c2beOH8%!B;UMW9PW0-I;qoiD-;FRyl3LCu}zqm491CfoI!8Io5uQ|G^*jCsl9r zWt-HPq9EykjruX4r{?rTiRX=Tgw0A#mR-&?Pz}uazH$Sf>Q1%eh4b$4nd>G*NzbyF zq;JRMV#KoiaMdUI&N%u+FFvZy?{L;ux8q{#3FijitDAoaeEt@0 zQ@c=l7E@7NWYR3Qo-?aid6piD{G*YV!BxP!F7WyOOHY)PADG5SBs8r(x?$z&%Jq9! k&PSwLU>g1qEct_ZTF}FT4+8|I0W%GQr>mdKI;Vst0Hoi6_W%F@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png deleted file mode 100644 index 75bb51ed37878ba7f48261aa3929dd750f6d3a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1038 zcmV+p1o8WcP)Px&$Vo&&RCt{2n!j(`I26afaxGht1=zKWbI{_tXbkd4crrYC=$4MzI`+@#cw5G1 zyCGw6Q~!v=jb3uF5dl`40J3CTmf1liO({wp5|NPt@3SPLNxdI>d?fe?5ClOG1VIo4 z@f6;F=rfh}=Vml^OXWP)z7IoHxZ~8(vVh5(PE|ZDlP8r6A=MizAnm1 zV=(M8J_k9`VvFy=24DaAR%rs{@=s1%!U;eY0n?kcmVD(1uxtZyoaP)5$0;nka@zp_ zuibiS1Vrw3&&YDLrhwZs#WdjI7tE7Aqn?L1Z<;^<+eJX9Ew`(ov{=P){1VIo4K@bE%5ClOG#P7

N!ouCx~0EFORo`@>Z$!V)nC&+cdPCJ_d+zGlUJK*{% zFv4(?6I?8pSB+eq<{v`$cFKd=VA&TetGeZI$t22Mf#JyrfQW#}B&vKbFdDne^K2;svWWQa--YO7+1aY(`|Hx& zAlth4en8VQ;QMQMo}Fvw-j(|t3U0he!pK&jvOdMBQKa~_Sh0=oy5uWy@?T(=5IxVv zU!VW4Gy*<;`jbs25%^w&%P-UIk=<#|#^N&gK>6#dzzF6E!f;b6=&xVYvC#*4%jXVIRev)=Mc%zf`>lf*=TjAYL>-005OFzJkMrT>t<807*qo IM6N<$g7{$bMgRZ+ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png deleted file mode 100644 index 75bb51ed37878ba7f48261aa3929dd750f6d3a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1038 zcmV+p1o8WcP)Px&$Vo&&RCt{2n!j(`I26afaxGht1=zKWbI{_tXbkd4crrYC=$4MzI`+@#cw5G1 zyCGw6Q~!v=jb3uF5dl`40J3CTmf1liO({wp5|NPt@3SPLNxdI>d?fe?5ClOG1VIo4 z@f6;F=rfh}=Vml^OXWP)z7IoHxZ~8(vVh5(PE|ZDlP8r6A=MizAnm1 zV=(M8J_k9`VvFy=24DaAR%rs{@=s1%!U;eY0n?kcmVD(1uxtZyoaP)5$0;nka@zp_ zuibiS1Vrw3&&YDLrhwZs#WdjI7tE7Aqn?L1Z<;^<+eJX9Ew`(ov{=P){1VIo4K@bE%5ClOG#P7

N!ouCx~0EFORo`@>Z$!V)nC&+cdPCJ_d+zGlUJK*{% zFv4(?6I?8pSB+eq<{v`$cFKd=VA&TetGeZI$t22Mf#JyrfQW#}B&vKbFdDne^K2;svWWQa--YO7+1aY(`|Hx& zAlth4en8VQ;QMQMo}Fvw-j(|t3U0he!pK&jvOdMBQKa~_Sh0=oy5uWy@?T(=5IxVv zU!VW4Gy*<;`jbs25%^w&%P-UIk=<#|#^N&gK>6#dzzF6E!f;b6=&xVYvC#*4%jXVIRev)=Mc%zf`>lf*=TjAYL>-005OFzJkMrT>t<807*qo IM6N<$g7{$bMgRZ+ From 92f14648acb016fff3fe2a8b72e459566ef66f0c Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 27 Apr 2024 16:07:26 +1000 Subject: [PATCH 60/66] Update submodule to 220.2.0 (#27385) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 6e0205d1a8..3330d96177 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 6e0205d1a80a97122ce66bf09e0feeb3cb034c3d +Subproject commit 3330d9617728534bfef313201de0327c4e7f0627 From 6eb681958be3bec1bf7798866237c0f2f79d98d2 Mon Sep 17 00:00:00 2001 From: ShadowCommander Date: Fri, 26 Apr 2024 23:28:17 -0700 Subject: [PATCH 61/66] Fix prying error when opening locked airlocks (#27386) It would try to pry the door and fail to resolve a prying component on the entity trying to open the door. --- Content.Shared/Prying/Systems/PryingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Prying/Systems/PryingSystem.cs b/Content.Shared/Prying/Systems/PryingSystem.cs index 5a15057f1e..ab87585c70 100644 --- a/Content.Shared/Prying/Systems/PryingSystem.cs +++ b/Content.Shared/Prying/Systems/PryingSystem.cs @@ -107,7 +107,7 @@ public sealed class PryingSystem : EntitySystem { BeforePryEvent canev; - if (comp != null || Resolve(user, ref comp)) + if (comp != null || Resolve(user, ref comp, false)) { canev = new BeforePryEvent(user, comp.PryPowered, comp.Force); } From 5ec5e5ab898ef7688dfa2ff66df7ed78bedb32be Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 27 Apr 2024 16:30:13 +1000 Subject: [PATCH 62/66] Fix lint (#27388) --- Resources/Prototypes/NPCs/Combat/melee.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/NPCs/Combat/melee.yml b/Resources/Prototypes/NPCs/Combat/melee.yml index e4b207d16e..b0746e5679 100644 --- a/Resources/Prototypes/NPCs/Combat/melee.yml +++ b/Resources/Prototypes/NPCs/Combat/melee.yml @@ -22,8 +22,8 @@ isBuckled: true tasks: - !type:HTNPrimitiveTask - shutdownState: TaskFinished operator: !type:UnbuckleOperator + shutdownState: TaskFinished - preconditions: - !type:InContainerPrecondition @@ -37,8 +37,8 @@ isPulled: true tasks: - !type:HTNPrimitiveTask - shutdownState: TaskFinished operator: !type:UnPullOperator + shutdownState: TaskFinished # Melee combat (unarmed or otherwise) - tasks: @@ -129,9 +129,9 @@ branches: - tasks: - !type:HTNPrimitiveTask - shutdownState: TaskFinished operator: !type:ContainerOperator targetKey: Target + shutdownState: TaskFinished - !type:HTNPrimitiveTask operator: !type:EscapeOperator targetKey: Target From 8442a9142c28917553fb35c6e63695fcbfc62fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20M=C4=99drek?= Date: Sat, 27 Apr 2024 06:30:29 +0000 Subject: [PATCH 63/66] fix: deconstruct verb on undeconstructables (#27387) Some of prototypes don't specify their deconstructTarget node, which made them show the deconstruct verb as deconstructTarget is set to "start" node by default. This patch makes attempt to check if is it even possible from current construction node to reach specified deconstructTarget. Fixes #27330 --- .../Construction/ConstructionSystem.Guided.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Content.Server/Construction/ConstructionSystem.Guided.cs b/Content.Server/Construction/ConstructionSystem.Guided.cs index fe7f9152c0..e096bc02c3 100644 --- a/Content.Server/Construction/ConstructionSystem.Guided.cs +++ b/Content.Server/Construction/ConstructionSystem.Guided.cs @@ -41,6 +41,18 @@ namespace Content.Server.Construction component.Node == component.DeconstructionNode) return; + if (!_prototypeManager.TryIndex(component.Graph, out ConstructionGraphPrototype? graph)) + return; + + if (component.DeconstructionNode == null) + return; + + if (GetCurrentNode(uid, component) is not {} currentNode) + return; + + if (graph.Path(currentNode.Name, component.DeconstructionNode) is not {} path || path.Length == 0) + return; + Verb verb = new(); //verb.Category = VerbCategories.Construction; //TODO VERBS add more construction verbs? Until then, removing construction category From de85e6d518505148b4d812df51d7830e5a840f09 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 27 Apr 2024 06:31:35 +0000 Subject: [PATCH 64/66] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d3e2467904..4ffc67a483 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,4 @@ Entries: -- author: PolterTzi - changes: - - message: Seeds from sampled plants now inherit the sampled plant's health to discourage - excessive sampling. - type: Tweak - - message: Plants need to grow a bit before being sampled. - type: Tweak - id: 5955 - time: '2024-02-17T05:02:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25326 - author: Dygon changes: - message: Diona nymphs aren't deleted immediately after spawning anymore. @@ -3850,3 +3840,10 @@ id: 6454 time: '2024-04-27T05:58:10.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/26868 +- author: Lukasz825700516 + changes: + - message: Fixed undeconstructable objects showing deconstruct verb. + type: Fix + id: 6455 + time: '2024-04-27T06:30:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27387 From 1c38d46cd3972351ba6ac6fe6fb3aecbd2ec1112 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sat, 27 Apr 2024 14:48:55 +0300 Subject: [PATCH 65/66] fixes --- .../Prototypes/Entities/Mobs/Species/base.yml | 11 +- .../_CP14/Entities/Mobs/Species/base.yml | 354 +++--------------- 2 files changed, 59 insertions(+), 306 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index e72b015298..808f9fa327 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -28,8 +28,6 @@ state: unisex_full visible: false - map: ["jumpsuit"] - - map: [ "pants" ] - - map: [ "shirt" ] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] - map: ["enum.HumanoidVisualLayers.LHand"] @@ -42,7 +40,6 @@ - map: [ "belt" ] - map: [ "id" ] - map: [ "neck" ] - - map: [ "cloak" ] - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.Hair" ] @@ -350,16 +347,12 @@ state: body-overlay-2 visible: false - map: [ "gloves" ] - - map: [ "ring1" ] - - map: [ "ring2" ] - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] - - map: [ "belt1" ] - - map: [ "belt2" ] + - map: [ "belt" ] - map: [ "id" ] - - map: [ "keys" ] - map: [ "neck" ] - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] @@ -380,4 +373,4 @@ - type: UserInterface interfaces: enum.HumanoidMarkingModifierKey.Key: # sure, this can go here too - type: HumanoidMarkingModifierBoundUserInterface + type: HumanoidMarkingModifierBoundUserInterface \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml index d00ce10362..98aebf0cc3 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml @@ -1,8 +1,5 @@ - type: entity - parent: - - BaseMob - - MobDamageable - - MobCombat + parent: BaseMobSpecies id: CP14BaseMobSpecies save: false abstract: true @@ -62,323 +59,86 @@ sprite: "Effects/creampie.rsi" state: "creampie_human" visible: false - - type: DamageVisuals - thresholds: [ 10, 20, 30, 50, 70, 100 ] - targetLayers: - - "enum.HumanoidVisualLayers.Chest" - - "enum.HumanoidVisualLayers.Head" - - "enum.HumanoidVisualLayers.LArm" - - "enum.HumanoidVisualLayers.LLeg" - - "enum.HumanoidVisualLayers.RArm" - - "enum.HumanoidVisualLayers.RLeg" - damageOverlayGroups: - Brute: - sprite: Mobs/Effects/brute_damage.rsi - color: "#FF0000" - Burn: - sprite: Mobs/Effects/burn_damage.rsi - - type: GenericVisualizer - visuals: - enum.CreamPiedVisuals.Creamed: - clownedon: # Not 'creampied' bc I can already see Skyrat complaining about conflicts. - True: { visible: true } - False: { visible: false } - - type: StatusIcon - bounds: -0.5,-0.5,0.5,0.5 - - type: RotationVisuals - defaultRotation: 90 - horizontalRotation: 90 - type: HumanoidAppearance species: CP14Human - - type: SlowOnDamage - speedModifierThresholds: - 60: 0.7 - 80: 0.5 - - type: Fixtures - fixtures: # TODO: This needs a second fixture just for mob collisions. - fix1: - shape: - !type:PhysShapeCircle - radius: 0.35 - density: 185 - restitution: 0.0 - mask: - - MobMask - layer: - - MobLayer - - type: FloorOcclusion - - type: RangedDamageSound - soundGroups: - Brute: - collection: - MeatBulletImpact - soundTypes: - Heat: - collection: - MeatLaserImpact - - type: Reactive - groups: - Flammable: [ Touch ] - Extinguish: [ Touch ] - Acidic: [ Touch, Ingestion ] - reactions: - - reagents: [ Water, SpaceCleaner ] - methods: [ Touch ] - effects: - - !type:WashCreamPieReaction - - type: StatusEffects - allowed: - - Stun - - KnockedDown - - SlowedDown - - Stutter - - SeeingRainbows - - Electrocution - - Drunk - - SlurredSpeech - - RatvarianLanguage - - PressureImmunity - - Muted - - ForcedSleep - - TemporaryBlindness - - Pacified - - StaminaModifier - - type: Reflect - enabled: false - reflectProb: 0 - type: Body prototype: CP14Human requiredLegs: 2 - - type: Identity - - type: IdExaminable - - type: Hands - - type: Internals - - type: Inventory - - type: InventorySlots - - type: FloatingVisuals - - type: Climbing - - type: Cuffable - - type: Ensnareable - sprite: Objects/Misc/ensnare.rsi - state: icon - - type: AnimationPlayer - - type: Buckle - - type: CombatMode - canDisarm: true - - type: MeleeWeapon - soundHit: - collection: Punch - angle: 30 - animation: WeaponArcFist - attackRate: 1 - damage: - types: - Blunt: 5 - - type: SleepEmitSound - - type: SSDIndicator - - type: StandingState - - type: Fingerprint - - type: Dna - - type: MindContainer - showExamineInfo: true - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - - type: CanHostGuardian - - type: NpcFactionMember - factions: - - NanoTrasen - - type: CreamPied - - type: Stripping - - type: Strippable - - type: UserInterface - interfaces: - - key: enum.VoiceMaskUIKey.Key - type: VoiceMaskBoundUserInterface - - key: enum.HumanoidMarkingModifierKey.Key - type: HumanoidMarkingModifierBoundUserInterface - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface - - type: Puller - - type: Speech - speechSounds: Alto - - type: DamageForceSay - - type: Vocal - sounds: - Male: MaleHuman - Female: FemaleHuman - Unsexed: MaleHuman - - type: Emoting - - type: BodyEmotes - soundsId: GeneralBodyEmotes - - type: Grammar - attributes: - proper: true - - type: MobPrice - price: 1500 # Kidnapping a living person and selling them for cred is a good move. - deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - - type: Tag - tags: - - CanPilot - - FootstepSound - - DoorBumpOpener - type: entity - parent: - - MobBloodstream - - MobRespirator - - MobAtmosStandard - - MobFlammable - - CP14BaseMobSpecies + parent: BaseMobSpeciesOrganic id: CP14BaseMobSpeciesOrganic save: false abstract: true - components: - - type: Flashable - - type: Barotrauma - damage: - types: - Blunt: 0.50 #per second, scales with pressure and other constants. - Heat: 0.1 - - type: PassiveDamage # Slight passive regen. Assuming one damage type, comes out to about 4 damage a minute. - allowedStates: - - Alive - damageCap: 20 - damage: - types: - Heat: -0.07 - groups: - Brute: -0.07 - # Organs - - type: StatusEffects - allowed: - - Stun - - KnockedDown - - SlowedDown - - Stutter - - SeeingRainbows - - Electrocution - - ForcedSleep - - TemporaryBlindness - - Drunk - - SlurredSpeech - - RatvarianLanguage - - PressureImmunity - - Muted - - Pacified - - StaminaModifier - - type: Blindable - # Other - - type: Temperature - heatDamageThreshold: 325 - coldDamageThreshold: 260 - currentTemperature: 310.15 - specificHeat: 42 - coldDamage: - types: - Cold: 0.1 #per second, scales with temperature & other constants - heatDamage: - types: - Heat: 1.5 #per second, scales with temperature & other constants - - type: ThermalRegulator - metabolismHeat: 800 - radiatedHeat: 100 - implicitHeatRegulation: 500 - sweatHeatRegulation: 2000 - shiveringHeatRegulation: 2000 - normalBodyTemperature: 310.15 - thermalRegulationTemperatureThreshold: 25 - - type: Perishable - - type: Butcherable - butcheringType: Spike # TODO human. - spawned: - - id: FoodMeat - amount: 5 - - type: Respirator - damage: - types: - Asphyxiation: 1.0 - damageRecovery: - types: - Asphyxiation: -1.0 - - type: FireVisuals - alternateState: Standing + #components: + # - type: FireVisuals + # alternateState: Standing #TO DO - custom visual - type: entity save: false + parent: BaseSpeciesDummy id: CP14BaseSpeciesDummy abstract: true components: - - type: Hands - type: Inventory templateId: CP14Human - - type: InventorySlots - - type: ContainerContainer - type: Icon sprite: _CP14/Mobs/Species/Human/parts.rsi state: full - type: Sprite + drawdepth: Mobs + noRot: true layers: - - map: [ "enum.HumanoidVisualLayers.Chest" ] - - map: [ "enum.HumanoidVisualLayers.Head" ] - - map: [ "enum.HumanoidVisualLayers.Snout" ] - - map: [ "enum.HumanoidVisualLayers.Eyes" ] - - map: [ "enum.HumanoidVisualLayers.RArm" ] - - map: [ "enum.HumanoidVisualLayers.LArm" ] - - map: [ "enum.HumanoidVisualLayers.RLeg" ] - - map: [ "enum.HumanoidVisualLayers.LLeg" ] - - shader: StencilClear - sprite: Mobs/Species/Human/parts.rsi - state: l_leg - - shader: StencilMask - map: [ "enum.HumanoidVisualLayers.StencilMask" ] - sprite: Mobs/Customization/masking_helpers.rsi - state: unisex_full - visible: false - - map: [ "jumpsuit" ] - - map: [ "pants" ] - - map: [ "shirt" ] - - map: [ "enum.HumanoidVisualLayers.LFoot" ] - - map: [ "enum.HumanoidVisualLayers.RFoot" ] - - map: [ "enum.HumanoidVisualLayers.LHand" ] - - map: [ "enum.HumanoidVisualLayers.RHand" ] - - map: [ "gloves" ] - - map: [ "shoes" ] - - map: [ "ears" ] - - map: [ "outerClothing" ] - - map: [ "eyes" ] - - map: [ "belt" ] - - map: [ "id" ] - - map: [ "neck" ] - - map: [ "cloak" ] - - map: [ "back" ] - - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - - map: [ "enum.HumanoidVisualLayers.Hair" ] - - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "mask" ] - - map: [ "head" ] - - map: [ "pocket1" ] - - map: [ "pocket2" ] - - map: ["enum.HumanoidVisualLayers.Handcuffs"] - color: "#ffffff" - sprite: Objects/Misc/handcuffs.rsi - state: body-overlay-2 - visible: false - - map: [ "clownedon" ] # Dynamically generated - sprite: "Effects/creampie.rsi" - state: "creampie_human" - visible: false - - type: Appearance + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: ["enum.HumanoidVisualLayers.StencilMask"] + sprite: Mobs/Customization/masking_helpers.rsi + state: unisex_full + visible: false + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "gloves" ] + - map: [ "ring1" ] + - map: [ "ring2" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt1" ] + - map: [ "belt2" ] + - map: [ "id" ] + - map: [ "keys" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] - type: HumanoidAppearance species: CP14Human - type: Body prototype: CP14Human - requiredLegs: 2 - - type: UserInterface - interfaces: - - key: enum.HumanoidMarkingModifierKey.Key # sure, this can go here too - type: HumanoidMarkingModifierBoundUserInterface \ No newline at end of file + requiredLegs: 2 \ No newline at end of file From 3f508c899df62ce20390b852fcb071da2f29eb36 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sat, 27 Apr 2024 15:08:25 +0300 Subject: [PATCH 66/66] ui fixes --- .../Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml | 4 ++-- Resources/Prototypes/_CP14/Entities/keyrings.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml index 64370a0f18..8e1c0798d9 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml @@ -89,8 +89,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: entity id: CP14BarrelWater diff --git a/Resources/Prototypes/_CP14/Entities/keyrings.yml b/Resources/Prototypes/_CP14/Entities/keyrings.yml index 6afee4c2ff..5dbd2a3546 100644 --- a/Resources/Prototypes/_CP14/Entities/keyrings.yml +++ b/Resources/Prototypes/_CP14/Entities/keyrings.yml @@ -25,8 +25,8 @@ - CP14Key - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container