From 00a2c6a234d7b4bae7895161c9ce0c6892d5514c Mon Sep 17 00:00:00 2001 From: Jonathan Argo Date: Fri, 12 Jul 2024 05:16:21 -0400 Subject: [PATCH 001/118] Made musket wieldable. (#29910) * Made musket wieldable. * Updated musket rsi meta.json copyright. * Copyright adjustment again. --- .../Objects/Weapons/Guns/Snipers/snipers.yml | 2 +- .../Weapons/Guns/Snipers/musket.rsi/meta.json | 10 +++++++++- .../Snipers/musket.rsi/wielded-inhand-left.png | Bin 0 -> 701 bytes .../Snipers/musket.rsi/wielded-inhand-right.png | Bin 0 -> 707 bytes 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/wielded-inhand-right.png diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 252eecbd06..f69cb4fd2d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -66,7 +66,7 @@ - type: entity name: musket - parent: BaseWeaponSniper + parent: [BaseWeaponSniper, BaseGunWieldable] id: Musket description: This should've been in a museum long before you were born. Uses .60 anti-materiel ammo. components: diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/meta.json index 7609e516b3..b0f1b27c24 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Made by Pato Grone for SS14", + "copyright": "Made by Pato Grone for SS14, Wielded states by Jonathan Argo", "size": { "x": 32, "y": 32 @@ -15,6 +15,14 @@ "name": "inhand-left", "directions": 4 }, + { + "name": "wielded-inhand-left", + "directions": 4 + }, + { + "name": "wielded-inhand-right", + "directions": 4 + }, { "name": "base" } diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/wielded-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/wielded-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..bf76836959c016316c0389f2e0933ec0eaaba42b GIT binary patch literal 701 zcmV;u0z&jSET2#*GVO zqN&C$E2Av@EiTab4~!BQ#)WHCRw!YbkXRH48rlhM)AErrw2|wgbV6wEVgD(zW?yialnE8%NJYQn$o4imI_poDzu#X2K2TR z%I>Y_J1`7G^Z9(L-Xh$+bK5@0;NTTzUcS;0LI@#*5JCtcgb+dqA%qY@lxgHQ|9>H- zR_hR^87GlQGd>=~G~;x4x$Ry6DE0}s+B-3q<_O-pM>3VZ{^srMxAP?KH0F6fbe_1_ z>-E_G!p#8}QOk|rwQY}^hdlyN>=TGuZUFR%u1$sf>MZ>Lr^Q^#v~jg(AKlnx%-2~p zrXJDD_IJ{c0LL060IKy16ng~>ty-TzV92Z3%F#`Z#6b_G;7-(vxl+29Oab7()T;ox zw08D>?^o>QH1>(rIodDaq*q{McvST_Wq{NB0jk9Wh{e{<9CKuNRIU8@t^tH^_|(z2 j#A$pXgb+dq@jv+k*L*-4>{EP300000NkvXXu0mjfUV%$0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/wielded-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Snipers/musket.rsi/wielded-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a6bbe8b4d7a2d0eee849a0868fb5884c89389a GIT binary patch literal 707 zcmV;!0zCbRP)JXG=2Ytf=09z^icfF4AO4HVrLObkgw5{*rQ$tK`GrN15KR`r8L_|bHL_|lscQ+#c#eKu(wC-K7+gBNM@Wt!bq^bsx&1Nv^c3J*& zj!yspve^ubKB^i30Bmo^;rDw009&!QO1}&MP}KmQJlz~>j{P!vZouq?pq%wOaK-sNG z=HTo1K__+l)=hJf)6?g%_ULg(c6513rcz1s_luXWlwmeN2q6=Rgd&8H#=|lc8V<`F zKtx1DL_|bHL_|bHL_{a+IOqL;GxOMogwf?C8GrK}>ii;V)rzG?VAAcvkHZpFHDJ~U z414C^wx|W4*Yn||GW$-%PQ5_LSu$$`fM%V*PNIUan83&4Da=pl1Jwug%3qIZicz1? zE%VR11Us3db|=!SUZ7glq1VTeEmi;kTE1WgY54*Gpwg-jXw?P)t@?n~m8ddkezmH@ zKT{@^LIHq_GneGv{%2*c&;19*Z%QhaG{47gwE=eW p?dG*-rc%kC^$0{nL`3vI`wipvC&AsBCZ7NR002ovPDHLkV1l>>PsjiO literal 0 HcmV?d00001 From cd90b414dfded2a67012f9a8a0cc05420e3d415f Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 12 Jul 2024 09:17:29 +0000 Subject: [PATCH 002/118] 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 10835194f2..2812e562b0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: MilenVolf - changes: - - message: Most crates can now go through plastic flaps. - type: Fix - id: 6405 - time: '2024-04-20T06:23:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27137 - author: MilenVolf changes: - message: Electronics inside windoors now has proper accesses. @@ -3824,3 +3817,10 @@ id: 6904 time: '2024-07-11T14:03:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29909 +- author: jonathanargo + changes: + - message: Muskets are now wieldable. + type: Tweak + id: 6905 + time: '2024-07-12T09:16:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29910 From 3a9b1eaa16023d9435ac99c34227aee0e054b300 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Fri, 12 Jul 2024 05:18:32 -0400 Subject: [PATCH 003/118] Allow notice boards to be built on walls (#29851) --- Resources/Prototypes/Recipes/Construction/furniture.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index ea11a09b96..80e65fdac3 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -899,9 +899,9 @@ objectType: Structure placementMode: SnapgridCenter canRotate: true - canBuildInImpassable: false + canBuildInImpassable: true conditions: - - !type:TileNotBlocked + - !type:WallmountCondition - type: construction id: Mannequin From f125dda6774331be50741e91304ac794a797a1ae Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:19:24 +0200 Subject: [PATCH 004/118] Make stun batons be thrown like a throwing weapon (#29883) * make stun batons be thrown like a throwing weapon * stun prods too * pies too --- .../Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml | 1 + .../Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml | 1 + Resources/Prototypes/Entities/Objects/Weapons/security.yml | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml index f97d87a9c5..cb04869c2c 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml @@ -148,6 +148,7 @@ - state: tin - state: plain - type: CreamPie + - type: LandAtCursor - type: ContainerContainer containers: payloadSlot: !type:ContainerSlot diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml index 9e187651ec..437cd8994e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml @@ -41,6 +41,7 @@ - type: StaminaDamageOnCollide damage: 35 sound: /Audio/Weapons/egloves.ogg + - type: LandAtCursor # it deals stamina damage when thrown - type: Battery maxCharge: 360 startingCharge: 360 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 24bc21c436..307584e116 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -43,6 +43,7 @@ - type: StaminaDamageOnCollide damage: 35 sound: /Audio/Weapons/egloves.ogg + - type: LandAtCursor # it deals stamina damage when thrown - type: Battery maxCharge: 1000 startingCharge: 1000 @@ -107,7 +108,7 @@ - type: Item size: Normal - type: Tag - tags: + tags: - Truncheon - type: Clothing sprite: Objects/Weapons/Melee/truncheon.rsi From 00ec83af0f60a6c6bf819bd7788f4fb2a58ce175 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 12 Jul 2024 09:20:31 +0000 Subject: [PATCH 005/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 33 ++++++++++++++----------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2812e562b0..62cebbe492 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,22 +1,4 @@ Entries: -- author: MilenVolf - changes: - - message: Electronics inside windoors now has proper accesses. - type: Fix - id: 6406 - time: '2024-04-20T06:26:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27133 -- author: Bhijn and Myr - changes: - - message: An option to tie your viewport's scaling to your vertical screenspace - has been added, enabled by default! In laymen's terms, this means that manual - configuration is no longer necessary to avoid letterboxing on aspect ratios - tighter than 16:9, as the viewport will now default to cutting off any excess - horizontal width instead of letterboxing vertically when the screen is too tight. - type: Add - id: 6407 - time: '2024-04-20T06:46:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27061 - author: Whisper changes: - message: All mobs should now properly burn to ash. @@ -3824,3 +3806,18 @@ id: 6905 time: '2024-07-12T09:16:21.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29910 +- author: themias + changes: + - message: Notice boards can now be built on walls + type: Fix + id: 6906 + time: '2024-07-12T09:18:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29851 +- author: slarticodefast + changes: + - message: Stun batons, stun prods and banana cream pies now fly like other throwing + weapons when thrown. + type: Fix + id: 6907 + time: '2024-07-12T09:19:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29883 From 65ccd6e033c056c2b46f70be3e459be402344713 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:20:41 -0700 Subject: [PATCH 006/118] Update RCDSystem.cs to not use Component.Owner (#29940) Update RCDSystem.cs Co-authored-by: plykiya --- Content.Shared/RCD/Systems/RCDSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index 974755f000..62ad2f3be0 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -572,8 +572,6 @@ public bool TryGetMapGridData(EntityCoordinates location, [NotNullWhen(true)] ou return false; } - gridUid = mapGrid.Owner; - var tile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); var position = _mapSystem.TileIndicesFor(gridUid.Value, mapGrid, location); mapGridData = new MapGridData(gridUid.Value, mapGrid, location, tile, position); From b6672f087f8acaea3229eec7fbd91f6b56fd38f5 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:21:54 -0700 Subject: [PATCH 007/118] Update MapScreen.xaml.cs to not use Component.Owner (#29938) Update MapScreen.xaml.cs Co-authored-by: plykiya --- Content.Client/Shuttles/UI/MapScreen.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Shuttles/UI/MapScreen.xaml.cs b/Content.Client/Shuttles/UI/MapScreen.xaml.cs index 489dbc8c90..0d7df38b91 100644 --- a/Content.Client/Shuttles/UI/MapScreen.xaml.cs +++ b/Content.Client/Shuttles/UI/MapScreen.xaml.cs @@ -311,7 +311,7 @@ private void RebuildMapObjects() }; _mapHeadings.Add(mapComp.MapId, gridContents); - foreach (var grid in _mapManager.GetAllMapGrids(mapComp.MapId)) + foreach (var grid in _mapManager.GetAllGrids(mapComp.MapId)) { _entManager.TryGetComponent(grid.Owner, out IFFComponent? iffComp); From 160364e10050f4db26ce510e13482e8245b3931d Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:22:24 -0700 Subject: [PATCH 008/118] Update BiomeSystem.cs to not use Component.Owner (#29939) Update BiomeSystem.cs Co-authored-by: plykiya --- Content.Server/Parallax/BiomeSystem.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Content.Server/Parallax/BiomeSystem.cs b/Content.Server/Parallax/BiomeSystem.cs index 7e854e8bbf..d3919347f7 100644 --- a/Content.Server/Parallax/BiomeSystem.cs +++ b/Content.Server/Parallax/BiomeSystem.cs @@ -126,20 +126,18 @@ private void OnBiomeMapInit(EntityUid uid, BiomeComponent component, MapInitEven var xform = Transform(uid); var mapId = xform.MapID; - if (mapId != MapId.Nullspace && TryComp(uid, out MapGridComponent? mapGrid)) + if (mapId != MapId.Nullspace && HasComp(uid)) { var setTiles = new List<(Vector2i Index, Tile tile)>(); - foreach (var grid in _mapManager.GetAllMapGrids(mapId)) + foreach (var grid in _mapManager.GetAllGrids(mapId)) { - var gridUid = grid.Owner; - - if (!_fixturesQuery.TryGetComponent(gridUid, out var fixtures)) + if (!_fixturesQuery.TryGetComponent(grid.Owner, out var fixtures)) continue; // Don't want shuttles flying around now do we. - _shuttles.Disable(gridUid); - var pTransform = _physics.GetPhysicsTransform(gridUid); + _shuttles.Disable(grid.Owner); + var pTransform = _physics.GetPhysicsTransform(grid.Owner); foreach (var fixture in fixtures.Fixtures.Values) { From a8cae6f3e6fcb70dbaa48f56c7fbb41acb50062c Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:24:08 -0700 Subject: [PATCH 009/118] Fixes dropping item in container (#29900) * Items droped in containers will end up in containers * Adds integration test for dropping entity while inside container * comment * comment * trim the diff --------- Co-authored-by: plykiya --- .../Tests/Hands/HandTests.cs | 80 +++++++++++++++++++ .../EntitySystems/SharedHandsSystem.Drop.cs | 11 ++- 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/Content.IntegrationTests/Tests/Hands/HandTests.cs b/Content.IntegrationTests/Tests/Hands/HandTests.cs index 9ecabbeebf..5e96015feb 100644 --- a/Content.IntegrationTests/Tests/Hands/HandTests.cs +++ b/Content.IntegrationTests/Tests/Hands/HandTests.cs @@ -1,8 +1,10 @@ using System.Linq; +using Content.Server.Storage.EntitySystems; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Robust.Server.GameObjects; using Robust.Server.Player; +using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.Map; @@ -11,6 +13,19 @@ namespace Content.IntegrationTests.Tests.Hands; [TestFixture] public sealed class HandTests { + [TestPrototypes] + private const string Prototypes = @" +- type: entity + id: TestPickUpThenDropInContainerTestBox + name: box + components: + - type: EntityStorage + - type: ContainerContainer + containers: + entity_storage: !type:Container +"; + + [Test] public async Task TestPickupDrop() { @@ -57,4 +72,69 @@ await server.WaitPost(() => await server.WaitPost(() => mapMan.DeleteMap(data.MapId)); await pair.CleanReturnAsync(); } + + [Test] + public async Task TestPickUpThenDropInContainer() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + Connected = true, + DummyTicker = false + }); + var server = pair.Server; + var map = await pair.CreateTestMap(); + await pair.RunTicksSync(5); + + var entMan = server.ResolveDependency(); + var playerMan = server.ResolveDependency(); + var mapMan = server.ResolveDependency(); + var sys = entMan.System(); + var tSys = entMan.System(); + var containerSystem = server.System(); + + EntityUid item = default; + EntityUid box = default; + EntityUid player = default; + HandsComponent hands = default!; + + // spawn the elusive box and crowbar at the coordinates + await server.WaitPost(() => box = server.EntMan.SpawnEntity("TestPickUpThenDropInContainerTestBox", map.GridCoords)); + await server.WaitPost(() => item = server.EntMan.SpawnEntity("Crowbar", map.GridCoords)); + // place the player at the exact same coordinates and have them grab the crowbar + await server.WaitPost(() => + { + player = playerMan.Sessions.First().AttachedEntity!.Value; + tSys.PlaceNextTo(player, item); + hands = entMan.GetComponent(player); + sys.TryPickup(player, item, hands.ActiveHand!); + }); + await pair.RunTicksSync(5); + Assert.That(hands.ActiveHandEntity, Is.EqualTo(item)); + + // Open then close the box to place the player, who is holding the crowbar, inside of it + var storage = server.System(); + await server.WaitPost(() => + { + storage.OpenStorage(box); + storage.CloseStorage(box); + }); + await pair.RunTicksSync(5); + Assert.That(containerSystem.IsEntityInContainer(player), Is.True); + + // Dropping the item while the player is inside the box should cause the item + // to also be inside the same container the player is in now, + // with the item not being in the player's hands + await server.WaitPost(() => + { + sys.TryDrop(player, item, null!); + }); + await pair.RunTicksSync(5); + var xform = entMan.GetComponent(player); + var itemXform = entMan.GetComponent(item); + Assert.That(hands.ActiveHandEntity, Is.Not.EqualTo(item)); + Assert.That(containerSystem.IsInSameOrNoContainer((player, xform), (item, itemXform))); + + await server.WaitPost(() => mapMan.DeleteMap(map.MapId)); + await pair.CleanReturnAsync(); + } } diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs index 4d21e40a98..2e3c6f6203 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs @@ -110,7 +110,10 @@ public bool TryDrop(EntityUid uid, Hand hand, EntityCoordinates? targetDropLocat return false; var entity = hand.HeldEntity!.Value; - DoDrop(uid, hand, doDropInteraction: doDropInteraction, handsComp); + + // if item is a fake item (like with pulling), just delete it rather than bothering with trying to drop it into the world + if (TryComp(entity, out VirtualItemComponent? @virtual)) + _virtualSystem.DeleteVirtualItem((entity, @virtual), uid); if (TerminatingOrDeleted(entity)) return true; @@ -122,16 +125,18 @@ public bool TryDrop(EntityUid uid, Hand hand, EntityCoordinates? targetDropLocat var userXform = Transform(uid); var isInContainer = ContainerSystem.IsEntityOrParentInContainer(uid, xform: userXform); + // drop the item inside the container if the user is in a container if (targetDropLocation == null || isInContainer) { - // If user is in a container, drop item into that container. Otherwise, attach to grid or map. TransformSystem.DropNextTo((entity, itemXform), (uid, userXform)); return true; } + // otherwise, remove the item from their hands and place it at the calculated interaction range position + DoDrop(uid, hand, doDropInteraction: doDropInteraction, handsComp); var (itemPos, itemRot) = TransformSystem.GetWorldPositionRotation(entity); var origin = new MapCoordinates(itemPos, itemXform.MapID); - var target = targetDropLocation.Value.ToMap(EntityManager, TransformSystem); + var target = TransformSystem.ToMapCoordinates(targetDropLocation.Value); TransformSystem.SetWorldPositionRotation(entity, GetFinalDropCoordinates(uid, origin, target), itemRot); return true; } From f53d0143aec58a1076522adba6ebbb380e404d1c Mon Sep 17 00:00:00 2001 From: chavonadelal <156101927+chavonadelal@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:24:37 +0300 Subject: [PATCH 010/118] Localization of dungeon direction (#29911) --- Content.Server/Salvage/SalvageSystem.Runner.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Server/Salvage/SalvageSystem.Runner.cs b/Content.Server/Salvage/SalvageSystem.Runner.cs index 161b791084..23a575413e 100644 --- a/Content.Server/Salvage/SalvageSystem.Runner.cs +++ b/Content.Server/Salvage/SalvageSystem.Runner.cs @@ -9,6 +9,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Salvage.Expeditions; using Content.Shared.Shuttles.Components; +using Content.Shared.Localizations; using Robust.Shared.Map.Components; using Robust.Shared.Player; @@ -103,8 +104,10 @@ private void OnFTLCompleted(ref FTLCompletedEvent args) Announce(args.MapUid, Loc.GetString("salvage-expedition-announcement-countdown-minutes", ("duration", (component.EndTime - _timing.CurTime).Minutes))); + var directionLocalization = ContentLocalizationManager.FormatDirection(component.DungeonLocation.GetDir()).ToLower(); + if (component.DungeonLocation != Vector2.Zero) - Announce(args.MapUid, Loc.GetString("salvage-expedition-announcement-dungeon", ("direction", component.DungeonLocation.GetDir()))); + Announce(args.MapUid, Loc.GetString("salvage-expedition-announcement-dungeon", ("direction", directionLocalization))); component.Stage = ExpeditionStage.Running; Dirty(args.MapUid, component); From b5e49c9c07ed4d93260aefb04ca028a5af6df328 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 12 Jul 2024 09:25:44 +0000 Subject: [PATCH 011/118] 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 62cebbe492..90c0216946 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Whisper - changes: - - message: All mobs should now properly burn to ash. - type: Fix - id: 6408 - time: '2024-04-20T14:44:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27158 - author: IProduceWidgets changes: - message: New map Oasis. @@ -3821,3 +3814,10 @@ id: 6907 time: '2024-07-12T09:19:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29883 +- author: Plykiya + changes: + - message: Dropping an item while in a container now places the item in the container. + type: Fix + id: 6908 + time: '2024-07-12T09:24:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29900 From 560df6ed97b5d42a4d737d661b71aa319c337f0a Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:32:47 +0200 Subject: [PATCH 012/118] Throwing system hotfix (#29935) throwing system hotfix --- Content.Shared/Hands/Components/HandsComponent.cs | 2 +- Content.Shared/Throwing/ThrowingSystem.cs | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Content.Shared/Hands/Components/HandsComponent.cs b/Content.Shared/Hands/Components/HandsComponent.cs index 84a389a39c..01579cccdb 100644 --- a/Content.Shared/Hands/Components/HandsComponent.cs +++ b/Content.Shared/Hands/Components/HandsComponent.cs @@ -42,7 +42,7 @@ public sealed partial class HandsComponent : Component /// [DataField] [ViewVariables(VVAccess.ReadWrite)] - public float BaseThrowspeed { get; set; } = 10f; + public float BaseThrowspeed { get; set; } = 11f; /// /// Distance after which longer throw targets stop increasing throw impulse. diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 56bbf4c2bf..549473278e 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -26,11 +26,6 @@ public sealed class ThrowingSystem : EntitySystem public const float PushbackDefault = 2f; - /// - /// The minimum amount of time an entity needs to be thrown before the timer can be run. - /// Anything below this threshold never enters the air. - /// - public const float MinFlyTime = 0.15f; public const float FlyTimePercentage = 0.8f; private float _frictionModifier; @@ -168,9 +163,6 @@ public void TryThrow(EntityUid uid, var flyTime = direction.Length() / baseThrowSpeed; if (compensateFriction) flyTime *= FlyTimePercentage; - - if (flyTime < MinFlyTime) - flyTime = 0f; comp.ThrownTime = _gameTiming.CurTime; comp.LandTime = comp.ThrownTime + TimeSpan.FromSeconds(flyTime); comp.PlayLandSound = playSound; From caf8776d071027bdefdd0003fb2e99a981040fa6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 12 Jul 2024 10:33:53 +0000 Subject: [PATCH 013/118] 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 90c0216946..5784e24871 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: New map Oasis. - type: Add - id: 6409 - time: '2024-04-21T05:59:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25736 - author: KittenColony changes: - message: Added a new lizard snout, featuring a split muzzle and snoot that can @@ -3821,3 +3814,14 @@ id: 6908 time: '2024-07-12T09:24:08.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29900 +- author: coffeeware, slarticodefast + changes: + - message: Fixed items thrown very fast not being in the air. In particular this + fixes the pneumatic cannon. + type: Fix + - message: Buffed base hand throwing speed by 10% to be more similar to before the + recent throwing changes. + type: Tweak + id: 6909 + time: '2024-07-12T10:32:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29935 From 7ce3a1f27ff5a1f4c4aa5898227bfca2a427202c Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Fri, 12 Jul 2024 13:36:40 +0200 Subject: [PATCH 014/118] Fix supplybot movement state (#29944) Fix supplybot movement sprite --- Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 172ed66cc3..d34b1b536b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -337,7 +337,8 @@ - type: Sprite sprite: Mobs/Silicon/Bots/supplybot.rsi layers: - - state: supplybot + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: supplybot - type: SpriteMovement movementLayers: movement: From 3ee7d7bc353dffccc0fee088d2480bb11cf78c3a Mon Sep 17 00:00:00 2001 From: osjarw <62134478+osjarw@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:37:47 +0300 Subject: [PATCH 015/118] Implement Health Consideration for NPCs (#29922) Implement TargetHealthCon --- .../NPC/Queries/Considerations/TargetHealthCon.cs | 10 ++++++++++ Content.Server/NPC/Systems/NPCUtilitySystem.cs | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Content.Server/NPC/Queries/Considerations/TargetHealthCon.cs b/Content.Server/NPC/Queries/Considerations/TargetHealthCon.cs index d4e8a277ea..cc9c6df83f 100644 --- a/Content.Server/NPC/Queries/Considerations/TargetHealthCon.cs +++ b/Content.Server/NPC/Queries/Considerations/TargetHealthCon.cs @@ -1,6 +1,16 @@ +using Content.Shared.Mobs; + namespace Content.Server.NPC.Queries.Considerations; +/// +/// Goes linearly from 1f to 0f, with 0 damage returning 1f and damage returning 0f +/// public sealed partial class TargetHealthCon : UtilityConsideration { + /// + /// Which MobState the consideration returns 0f at, defaults to choosing earliest incapacitating MobState + /// + [DataField("targetState")] + public MobState TargetState = MobState.Invalid; } diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index ca74d71335..72833fc35e 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -7,10 +7,13 @@ using Content.Server.Nutrition.Components; using Content.Server.Nutrition.EntitySystems; using Content.Server.Storage.Components; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.Fluids.Components; using Content.Shared.Hands.Components; using Content.Shared.Inventory; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.NPC.Systems; using Content.Shared.Nutrition.Components; @@ -48,6 +51,7 @@ public sealed class NPCUtilitySystem : EntitySystem [Dependency] private readonly WeldableSystem _weldable = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly MobThresholdSystem _thresholdSystem = default!; private EntityQuery _puddleQuery; private EntityQuery _xformQuery; @@ -293,8 +297,14 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon return (float) ev.Count / ev.Capacity; } - case TargetHealthCon: + case TargetHealthCon con: { + if (!TryComp(targetUid, out DamageableComponent? damage)) + return 0f; + if (con.TargetState != MobState.Invalid && _thresholdSystem.TryGetPercentageForState(targetUid, con.TargetState, damage.TotalDamage, out var percentage)) + return Math.Clamp((float)(1 - percentage), 0f, 1f); + if (_thresholdSystem.TryGetIncapPercentage(targetUid, damage.TotalDamage, out var incapPercentage)) + return Math.Clamp((float)(1 - incapPercentage), 0f, 1f); return 0f; } case TargetInLOSCon: From a314a967c29f7f2b2322e1213cd894bb76b6ccc4 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Fri, 12 Jul 2024 07:38:58 -0400 Subject: [PATCH 016/118] Fix timer deconstruction (#29917) Fix deconstruction for timers --- .../Entities/Structures/Wallmounts/timer.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml index dd7eb5bea8..271a9a65cd 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml @@ -44,6 +44,14 @@ - type: Construction graph: Timer node: signal + containers: + - board + - type: ContainerContainer + containers: + board: !type:Container + - type: ContainerFill + containers: + board: [ SignalTimerElectronics ] - type: entity id: ScreenTimer @@ -67,6 +75,11 @@ - type: Construction graph: Timer node: screen + containers: + - board + - type: ContainerFill + containers: + board: [ ScreenTimerElectronics ] - type: entity id: BrigTimer @@ -79,6 +92,11 @@ - type: Construction graph: Timer node: brig + containers: + - board + - type: ContainerFill + containers: + board: [ BrigTimerElectronics ] # Construction Frame From e3697c6fdafc72ebb55aaeecfe5fa52da61c70d7 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 12 Jul 2024 11:40:04 +0000 Subject: [PATCH 017/118] 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 5784e24871..e51638b71e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: KittenColony - changes: - - message: Added a new lizard snout, featuring a split muzzle and snoot that can - be coloured independently - type: Add - id: 6410 - time: '2024-04-21T06:18:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27143 - author: SpeltIncorrectyl changes: - message: Security Officers, Head of Security, and Warden can now choose to start @@ -3825,3 +3817,10 @@ id: 6909 time: '2024-07-12T10:32:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29935 +- author: themias + changes: + - message: Timers can now be deconstructed + type: Fix + id: 6910 + time: '2024-07-12T11:38:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29917 From c94c72785df97e7a98097a0bc4733e998e4454a8 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 04:44:45 -0700 Subject: [PATCH 018/118] Updates GasTankSystem and InternalsSystem to not use Component.Owner (#29934) * blah, setup * Updates GasTankSystem and InternalsSystem to not use Component.Owner * squish the diff * Fixa the rest --------- Co-authored-by: plykiya --- .../Atmos/EntitySystems/GasTankSystem.cs | 72 +++++++++++++------ .../Body/Systems/InternalsSystem.cs | 21 +++--- 2 files changed, 60 insertions(+), 33 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index baad739804..2d703439c0 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -81,7 +81,7 @@ public void UpdateUserInterface(Entity ent, bool initialUpdate TankPressure = component.Air?.Pressure ?? 0, OutputPressure = initialUpdate ? component.OutputPressure : null, InternalsConnected = component.IsConnected, - CanConnectInternals = CanConnectToInternals(component) + CanConnectInternals = CanConnectToInternals(ent) }); } @@ -217,24 +217,24 @@ public GasMixture RemoveAirVolume(Entity gasTank, float volume return air; } - public bool CanConnectToInternals(GasTankComponent component) + public bool CanConnectToInternals(Entity ent) { - var internals = GetInternalsComponent(component, component.User); - return internals != null && internals.BreathTools.Count != 0 && !component.IsValveOpen; + TryGetInternalsComp(ent, out _, out var internalsComp, ent.Comp.User); + return internalsComp != null && internalsComp.BreathTools.Count != 0 && !ent.Comp.IsValveOpen; } public void ConnectToInternals(Entity ent) { var (owner, component) = ent; - if (component.IsConnected || !CanConnectToInternals(component)) + if (component.IsConnected || !CanConnectToInternals(ent)) return; - var internals = GetInternalsComponent(component); - if (internals == null) + TryGetInternalsComp(ent, out var internalsUid, out var internalsComp, ent.Comp.User); + if (internalsUid == null || internalsComp == null) return; - if (_internals.TryConnectTank((internals.Owner, internals), owner)) - component.User = internals.Owner; + if (_internals.TryConnectTank((internalsUid.Value, internalsComp), owner)) + component.User = internalsUid.Value; _actions.SetToggled(component.ToggleActionEntity, component.IsConnected); @@ -243,7 +243,7 @@ public void ConnectToInternals(Entity ent) return; component.ConnectStream = _audioSys.Stop(component.ConnectStream); - component.ConnectStream = _audioSys.PlayPvs(component.ConnectSound, component.Owner)?.Entity; + component.ConnectStream = _audioSys.PlayPvs(component.ConnectSound, owner)?.Entity; UpdateUserInterface(ent); } @@ -251,29 +251,59 @@ public void ConnectToInternals(Entity ent) public void DisconnectFromInternals(Entity ent) { var (owner, component) = ent; + if (component.User == null) return; - var internals = GetInternalsComponent(component); + TryGetInternalsComp(ent, out var internalsUid, out var internalsComp, component.User); component.User = null; _actions.SetToggled(component.ToggleActionEntity, false); - _internals.DisconnectTank(internals); + if (internalsUid != null && internalsComp != null) + _internals.DisconnectTank((internalsUid.Value, internalsComp)); component.DisconnectStream = _audioSys.Stop(component.DisconnectStream); - component.DisconnectStream = _audioSys.PlayPvs(component.DisconnectSound, component.Owner)?.Entity; + component.DisconnectStream = _audioSys.PlayPvs(component.DisconnectSound, owner)?.Entity; UpdateUserInterface(ent); } - private InternalsComponent? GetInternalsComponent(GasTankComponent component, EntityUid? owner = null) + /// + /// Tries to retrieve the internals component of either the gas tank's user, + /// or the gas tank's... containing container + /// + /// The user of the gas tank + /// True if internals comp isn't null, false if it is null + private bool TryGetInternalsComp(Entity ent, out EntityUid? internalsUid, out InternalsComponent? internalsComp, EntityUid? user = null) { - owner ??= component.User; - if (Deleted(component.Owner))return null; - if (owner != null) return CompOrNull(owner.Value); - return _containers.TryGetContainingContainer(component.Owner, out var container) - ? CompOrNull(container.Owner) - : null; + internalsUid = default; + internalsComp = default; + + // If the gas tank doesn't exist for whatever reason, don't even bother + if (TerminatingOrDeleted(ent.Owner)) + return false; + + user ??= ent.Comp.User; + // Check if the gas tank's user actually has the component that allows them to use a gas tank and mask + if (TryComp(user, out var userInternalsComp) && userInternalsComp != null) + { + internalsUid = user; + internalsComp = userInternalsComp; + return true; + } + + // Yeah I have no clue what this actually does, I appreciate the lack of comments on the original function + if (_containers.TryGetContainingContainer((ent.Owner, Transform(ent.Owner)), out var container) && container != null) + { + if (TryComp(container.Owner, out var containerInternalsComp) && containerInternalsComp != null) + { + internalsUid = container.Owner; + internalsComp = containerInternalsComp; + return true; + } + } + + return false; } public void AssumeAir(Entity ent, GasMixture giver) @@ -321,7 +351,7 @@ public void CheckStatus(Entity ent) if(environment != null) _atmosphereSystem.Merge(environment, component.Air); - _audioSys.PlayPvs(component.RuptureSound, Transform(component.Owner).Coordinates, AudioParams.Default.WithVariation(0.125f)); + _audioSys.PlayPvs(component.RuptureSound, Transform(owner).Coordinates, AudioParams.Default.WithVariation(0.125f)); QueueDel(owner); return; diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs index d6ece39d59..10ebd934aa 100644 --- a/Content.Server/Body/Systems/InternalsSystem.cs +++ b/Content.Server/Body/Systems/InternalsSystem.cs @@ -102,7 +102,7 @@ public void ToggleInternals( { if (force) { - DisconnectTank(internals); + DisconnectTank((uid, internals)); return; } @@ -199,16 +199,13 @@ public void ConnectBreathTool(Entity ent, EntityUid toolEnti _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } - public void DisconnectTank(InternalsComponent? component) + public void DisconnectTank(Entity ent) { - if (component is null) - return; - - if (TryComp(component.GasTankEntity, out GasTankComponent? tank)) - _gasTank.DisconnectFromInternals((component.GasTankEntity.Value, tank)); + if (TryComp(ent.Comp.GasTankEntity, out GasTankComponent? tank)) + _gasTank.DisconnectFromInternals((ent.Comp.GasTankEntity.Value, tank)); - component.GasTankEntity = null; - _alerts.ShowAlert(component.Owner, component.InternalsAlert, GetSeverity(component)); + ent.Comp.GasTankEntity = null; + _alerts.ShowAlert(ent.Owner, ent.Comp.InternalsAlert, GetSeverity(ent.Comp)); } public bool TryConnectTank(Entity ent, EntityUid tankEntity) @@ -267,21 +264,21 @@ private short GetSeverity(InternalsComponent component) if (_inventory.TryGetSlotEntity(user, "back", out var backEntity, user.Comp2, user.Comp3) && TryComp(backEntity, out var backGasTank) && - _gasTank.CanConnectToInternals(backGasTank)) + _gasTank.CanConnectToInternals((backEntity.Value, backGasTank))) { return (backEntity.Value, backGasTank); } if (_inventory.TryGetSlotEntity(user, "suitstorage", out var entity, user.Comp2, user.Comp3) && TryComp(entity, out var gasTank) && - _gasTank.CanConnectToInternals(gasTank)) + _gasTank.CanConnectToInternals((entity.Value, gasTank))) { return (entity.Value, gasTank); } foreach (var item in _inventory.GetHandOrInventoryEntities((user.Owner, user.Comp1, user.Comp2))) { - if (TryComp(item, out gasTank) && _gasTank.CanConnectToInternals(gasTank)) + if (TryComp(item, out gasTank) && _gasTank.CanConnectToInternals((item, gasTank))) return (item, gasTank); } From 2e694f109d3eb998dc237a0fc8ef4a241469b4e9 Mon Sep 17 00:00:00 2001 From: Jonathan Argo Date: Fri, 12 Jul 2024 11:00:40 -0400 Subject: [PATCH 019/118] Centered hard hat sprites (#29953) --- .../Clothing/Head/Hardhats/armored.rsi/icon.png | Bin 326 -> 288 bytes .../Head/Hardhats/armored.rsi/light-icon.png | Bin 256 -> 202 bytes .../Clothing/Head/Hardhats/blue.rsi/icon.png | Bin 242 -> 193 bytes .../Head/Hardhats/blue.rsi/light-icon.png | Bin 256 -> 204 bytes .../Head/Hardhats/dark_yellow.rsi/icon.png | Bin 242 -> 193 bytes .../Hardhats/dark_yellow.rsi/light-icon.png | Bin 256 -> 204 bytes .../Clothing/Head/Hardhats/orange.rsi/icon.png | Bin 242 -> 192 bytes .../Head/Hardhats/orange.rsi/light-icon.png | Bin 243 -> 204 bytes .../Clothing/Head/Hardhats/red.rsi/icon.png | Bin 242 -> 192 bytes .../Head/Hardhats/red.rsi/light-icon.png | Bin 256 -> 204 bytes .../Clothing/Head/Hardhats/white.rsi/icon.png | Bin 242 -> 193 bytes .../Head/Hardhats/white.rsi/light-icon.png | Bin 243 -> 204 bytes .../Clothing/Head/Hardhats/yellow.rsi/icon.png | Bin 242 -> 192 bytes .../Head/Hardhats/yellow.rsi/light-icon.png | Bin 256 -> 204 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Clothing/Head/Hardhats/armored.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/armored.rsi/icon.png index 7adc2b1385919de3691bf660a7c812275c6f40da..fc2328e7d149e66e43586cab81345675bbee87ef 100644 GIT binary patch delta 247 zcmV%Q6F@FSSK}|sb0I`n?{9y$E000SaNLh0L01m60x&w?%HUJuEjTQbo6co zvf7vKRX8F0Z1-W#xX<=Wd@BBEaXAznQz_<9XkdtC0+CFcn7f|%=KCxO5iH-xyWjl5 zz0iJt^$XYLYcWhPF_bCiaOgQbuZr2Bih0%F1grREuYW9McpB};z{v81Z4b~5|Nk>H YTvV-`eDAP>9gxf5>FVdQ&MBb@0Q3h^A^-pY diff --git a/Resources/Textures/Clothing/Head/Hardhats/blue.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/blue.rsi/icon.png index fee14e7a8cd54b8eb6f24241f36bc1f00dad78cf..f3d81549e3d91dc7e42d2ee67330e0a7566ebec5 100644 GIT binary patch delta 98 zcmV-o0GJ5=02lFA*c0^Lt^BVlBP9JE_Ie% xI3l*>Y0#3(tbJd0=ub)zPGasqq-!q_!u~@|+WmgX7jdA`44$rjF6*2UngBnuI8Xop diff --git a/Resources/Textures/Clothing/Head/Hardhats/blue.rsi/light-icon.png b/Resources/Textures/Clothing/Head/Hardhats/blue.rsi/light-icon.png index 3a850ef0d89953c939f371809f8b31c012e41ea9..f385d0187d3475fbbaa1244ba2ba89f9f7a7b2ab 100644 GIT binary patch delta 176 zcmV;h08jsb0?YxBB!2;OQb$4nuFf3k0001nNkl60x&w?%HUJuEjTQbo6co zvf7vKRX8F0Z1-W#xX<=Wd@BBEaXAznQz_<9XkdtC0+CFcn7f|%=KCxO5iH-xyWjl5 zz0iJt^$XYLYcWhPF_bCiaOgQbuZr2Bih0%F1grREuYW9McpB};z{v81Z4b~5|Nk>H YTvV-`eDAP>9gxf5>FVdQ&MBb@0QJvOBme*a diff --git a/Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/icon.png index 3d3aa75958dcf9f5e581b13ba9b5e6ba5b8a3554..2728bf501bddd75eede1b8e20096a8d394ae189d 100644 GIT binary patch delta 98 zcmV-o0GDmi~u>Vk#cE4ZpMI2}}gQu&X%Q~loCIGw4HxmE= diff --git a/Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/light-icon.png b/Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/light-icon.png index 3a850ef0d89953c939f371809f8b31c012e41ea9..f385d0187d3475fbbaa1244ba2ba89f9f7a7b2ab 100644 GIT binary patch delta 176 zcmV;h08jsb0?YxBB!2;OQb$4nuFf3k0001nNkl60x&w?%HUJuEjTQbo6co zvf7vKRX8F0Z1-W#xX<=Wd@BBEaXAznQz_<9XkdtC0+CFcn7f|%=KCxO5iH-xyWjl5 zz0iJt^$XYLYcWhPF_bCiaOgQbuZr2Bih0%F1grREuYW9McpB};z{v81Z4b~5|Nk>H YTvV-`eDAP>9gxf5>FVdQ&MBb@0QJvOBme*a diff --git a/Resources/Textures/Clothing/Head/Hardhats/orange.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/orange.rsi/icon.png index ba88c23f723c7f37cf76336606234cd3f7fbf881..b4bbfa0e09e99dfd09969b8553c849e0cf91a31b 100644 GIT binary patch delta 97 zcmeywcz|(&;Y3G^a3@a}#}JF&w`UB67!){|4@wyR`+q#?rN*tG8IvOU{uzmvv4FO#s`A BA=Ur@ delta 145 zcmV;C0B--l0rCNmF%1M~K}|sb0I`n?{9y%=E<1S%a7bBm000id000id0mpBsWB>pF zPf0{UR5(xVjKL0oAPhsxgzo?U*pYFt3h`)6c$cNiYvC_!A=yImf$%8k1I5ZskqEQH ztd5ji1vJJ2o0i7yRH8$f5FsWQ1507b4+QrU09+eR<{agB00000NkvXXu0mjf)|oi) diff --git a/Resources/Textures/Clothing/Head/Hardhats/orange.rsi/light-icon.png b/Resources/Textures/Clothing/Head/Hardhats/orange.rsi/light-icon.png index 316cf7a9bccd9d0bf418f16fc955c0afc93e7888..f385d0187d3475fbbaa1244ba2ba89f9f7a7b2ab 100644 GIT binary patch delta 163 zcmV;U09^m`0n7oAF@J_hL_t(oh3(d%4Z|=H1<-$|qOK7Z+ATUtMky(YN`gbPMdv6i zj}$4g)%)Gy0vzzaWa#tLCubvxmhq;q3m||10tj#hz$JY%ZVp@xh=9M-8!g>H#L)fX zwUYNfI|BefGIeVC?xm2m&Y$cIlKBSA9#6Mvb6dtE1(-f00vre+Kx=@aD1Vswd55Cn R3Sj^M002ovPDHLkV1g#GMt}eS delta 202 zcmX@Z_?dBnVLeN_qpu?a!^VE@KZ&di3=EtF9+AZi4BWyX%*Zfnjs#G!!_&nvB*H!U z&;S4ShaH&IG;9+Rt}rgh;8jB)dyiGZ0a=H-$#3QxUicW(<8aKLZQ0_K z?XOSpHP-*%H0A%l+23CNuh-XIAyCO6!t~_9{r&U)|M=?s`v3p?`={SKuI8_!X3ZiY zx%<~liS+u^q!@EnEf+C~+-dz*5UUc{4Gb6FVdQ&MBb@02<9s AivR!s diff --git a/Resources/Textures/Clothing/Head/Hardhats/red.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/red.rsi/icon.png index 011962037d6b4ab8f8612210bb9a50553287e788..5a8fb92ef916f063c6df7be23c9d514812f9adee 100644 GIT binary patch delta 97 zcmeywcz|(&;Y3G^a3@a}#}JF&w`UB67!){|4@wyR`+q#?rN*tG8IvOU{uzmvv4FO#s`A BA=Ur@ delta 145 zcmV;C0B--l0rCNmF%1M~K}|sb0I`n?{9y%=E<1S%a7bBm000id000id0mpBsWB>pF zPf0{UR5(xVjKL0oAPhsxgzo?U*pYFt3h`)6c$cNiYvC_!A=yImf$%8k1I5ZskqEQH ztd5ji1vJJ2o0i7yRH8$f5FsWQ1507b4+QrU09+eR<{agB00000NkvXXu0mjf)|oi) diff --git a/Resources/Textures/Clothing/Head/Hardhats/red.rsi/light-icon.png b/Resources/Textures/Clothing/Head/Hardhats/red.rsi/light-icon.png index 3a850ef0d89953c939f371809f8b31c012e41ea9..f385d0187d3475fbbaa1244ba2ba89f9f7a7b2ab 100644 GIT binary patch delta 176 zcmV;h08jsb0?YxBB!2;OQb$4nuFf3k0001nNkl60x&w?%HUJuEjTQbo6co zvf7vKRX8F0Z1-W#xX<=Wd@BBEaXAznQz_<9XkdtC0+CFcn7f|%=KCxO5iH-xyWjl5 zz0iJt^$XYLYcWhPF_bCiaOgQbuZr2Bih0%F1grREuYW9McpB};z{v81Z4b~5|Nk>H YTvV-`eDAP>9gxf5>FVdQ&MBb@0QJvOBme*a diff --git a/Resources/Textures/Clothing/Head/Hardhats/white.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/white.rsi/icon.png index 2a5093d619ea4aa930175f15f39eb8e2cdea69f4..06af0dcd0aec9f5523f4f8eec947871f33b33df7 100644 GIT binary patch delta 98 zcmV-o0GJ5=02lFA*c0^Lt^BVlBP9JE_Ie% xI3l*>Y0#3(tbJd0=ub)zPGasqq-!q_!u~@|+WmgX7jdA`44$rjF6*2UngBnuI8Xop diff --git a/Resources/Textures/Clothing/Head/Hardhats/white.rsi/light-icon.png b/Resources/Textures/Clothing/Head/Hardhats/white.rsi/light-icon.png index 316cf7a9bccd9d0bf418f16fc955c0afc93e7888..f385d0187d3475fbbaa1244ba2ba89f9f7a7b2ab 100644 GIT binary patch delta 163 zcmV;U09^m`0n7oAF@J_hL_t(oh3(d%4Z|=H1<-$|qOK7Z+ATUtMky(YN`gbPMdv6i zj}$4g)%)Gy0vzzaWa#tLCubvxmhq;q3m||10tj#hz$JY%ZVp@xh=9M-8!g>H#L)fX zwUYNfI|BefGIeVC?xm2m&Y$cIlKBSA9#6Mvb6dtE1(-f00vre+Kx=@aD1Vswd55Cn R3Sj^M002ovPDHLkV1g#GMt}eS delta 202 zcmX@Z_?dBnVLeN_qpu?a!^VE@KZ&di3=EtF9+AZi4BWyX%*Zfnjs#G!!_&nvB*H!U z&;S4ShaH&IG;9+Rt}rgh;8jB)dyiGZ0a=H-$#3QxUicW(<8aKLZQ0_K z?XOSpHP-*%H0A%l+23CNuh-XIAyCO6!t~_9{r&U)|M=?s`v3p?`={SKuI8_!X3ZiY zx%<~liS+u^q!@EnEf+C~+-dz*5UUc{4Gb6FVdQ&MBb@02<9s AivR!s diff --git a/Resources/Textures/Clothing/Head/Hardhats/yellow.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardhats/yellow.rsi/icon.png index 1a3f49cc1b30f6b656b560d44aefbb4d3ecb4300..0978e7886c605a7a31808c54545265e113cd38e6 100644 GIT binary patch delta 97 zcmeywcz|(&;Y3G^a3@a}#}JF&w`UB67!){|4@wyR`+q#?rN*tG8IvOU{uzmvv4FO#s`A BA=Ur@ delta 145 zcmV;C0B--l0rCNmF%1M~K}|sb0I`n?{9y%=E<1S%a7bBm000id000id0mpBsWB>pF zPf0{UR5(xVjKL0oAPhsxgzo?U*pYFt3h`)6c$cNiYvC_!A=yImf$%8k1I5ZskqEQH ztd5ji1vJJ2o0i7yRH8$f5FsWQ1507b4+QrU09+eR<{agB00000NkvXXu0mjf)|oi) diff --git a/Resources/Textures/Clothing/Head/Hardhats/yellow.rsi/light-icon.png b/Resources/Textures/Clothing/Head/Hardhats/yellow.rsi/light-icon.png index 3a850ef0d89953c939f371809f8b31c012e41ea9..f385d0187d3475fbbaa1244ba2ba89f9f7a7b2ab 100644 GIT binary patch delta 176 zcmV;h08jsb0?YxBB!2;OQb$4nuFf3k0001nNkl60x&w?%HUJuEjTQbo6co zvf7vKRX8F0Z1-W#xX<=Wd@BBEaXAznQz_<9XkdtC0+CFcn7f|%=KCxO5iH-xyWjl5 zz0iJt^$XYLYcWhPF_bCiaOgQbuZr2Bih0%F1grREuYW9McpB};z{v81Z4b~5|Nk>H YTvV-`eDAP>9gxf5>FVdQ&MBb@0QJvOBme*a From a1000587cfc0293e045bff29835719e8c4767e4b Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 12 Jul 2024 15:01:46 +0000 Subject: [PATCH 020/118] 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 e51638b71e..1dfa17c2b0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: SpeltIncorrectyl - changes: - - message: Security Officers, Head of Security, and Warden can now choose to start - with a security webbing instead of a belt in their loadout menu. - type: Add - id: 6411 - time: '2024-04-21T06:19:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27189 - author: ElectroJr changes: - message: Fixed the nukie station not getting properly initialized. @@ -3824,3 +3816,10 @@ id: 6910 time: '2024-07-12T11:38:59.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29917 +- author: jonathanargo + changes: + - message: Hard hat icon sprites are now centered correctly. + type: Fix + id: 6911 + time: '2024-07-12T15:00:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29953 From 5fa0844f3ca073f0641c54aa6093b328fee10307 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 20:00:34 -0700 Subject: [PATCH 021/118] Update UtensilSystem.cs to not use Component.Owner (#29971) Update UtensilSystem.cs Co-authored-by: plykiya --- .../Nutrition/EntitySystems/UtensilSystem.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs index 43087214a4..d40288183f 100644 --- a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs @@ -31,24 +31,24 @@ public override void Initialize() /// /// Clicked with utensil /// - private void OnAfterInteract(EntityUid uid, UtensilComponent component, AfterInteractEvent ev) + private void OnAfterInteract(Entity entity, ref AfterInteractEvent ev) { if (ev.Handled || ev.Target == null || !ev.CanReach) return; - var result = TryUseUtensil(ev.User, ev.Target.Value, component); + var result = TryUseUtensil(ev.User, ev.Target.Value, entity); ev.Handled = result.Handled; } - public (bool Success, bool Handled) TryUseUtensil(EntityUid user, EntityUid target, UtensilComponent component) + public (bool Success, bool Handled) TryUseUtensil(EntityUid user, EntityUid target, Entity utensil) { if (!EntityManager.TryGetComponent(target, out FoodComponent? food)) return (false, true); //Prevents food usage with a wrong utensil - if ((food.Utensil & component.Types) == 0) + if ((food.Utensil & utensil.Comp.Types) == 0) { - _popupSystem.PopupEntity(Loc.GetString("food-system-wrong-utensil", ("food", target), ("utensil", component.Owner)), user, user); + _popupSystem.PopupEntity(Loc.GetString("food-system-wrong-utensil", ("food", target), ("utensil", utensil.Owner)), user, user); return (false, true); } From 8ed9ea1586563a3aed9ab4a4636ac03616e7eb7f Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 20:12:46 -0700 Subject: [PATCH 022/118] Update TriggerSystem.TimedCollide.cs to not use Component.Owner (#29970) Update TriggerSystem.TimedCollide.cs Co-authored-by: plykiya --- .../Explosion/EntitySystems/TriggerSystem.TimedCollide.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.TimedCollide.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.TimedCollide.cs index 29b81deb32..ea10b7c69b 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.TimedCollide.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.TimedCollide.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Server.Explosion.Components; using Content.Server.Explosion.EntitySystems; using Robust.Shared.Physics.Dynamics; @@ -42,14 +42,15 @@ private void OnComponentRemove(EntityUid uid, TriggerOnTimedCollideComponent com private void UpdateTimedCollide(float frameTime) { - foreach (var (activeTrigger, triggerOnTimedCollide) in EntityQuery()) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out _, out var triggerOnTimedCollide)) { foreach (var (collidingEntity, collidingTimer) in triggerOnTimedCollide.Colliding) { triggerOnTimedCollide.Colliding[collidingEntity] += frameTime; if (collidingTimer > triggerOnTimedCollide.Threshold) { - RaiseLocalEvent(activeTrigger.Owner, new TriggerEvent(activeTrigger.Owner, collidingEntity), true); + RaiseLocalEvent(uid, new TriggerEvent(uid, collidingEntity), true); triggerOnTimedCollide.Colliding[collidingEntity] -= triggerOnTimedCollide.Threshold; } } From 162348e02d958abddcd06f452262e923e0fab1d7 Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Fri, 12 Jul 2024 20:43:07 -0700 Subject: [PATCH 023/118] Change whitelist to pass when null (#29981) --- Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs b/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs index cfa082a9ee..eb20c65a11 100644 --- a/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs @@ -95,7 +95,8 @@ private bool TryGetLayers(EntityUid uid, var list = new List(); foreach (var mapLayerData in itemMapper.MapLayers.Values) { - var count = containedLayers.Count(ent => _whitelistSystem.IsWhitelistPass(mapLayerData.Whitelist, ent)); + var count = containedLayers.Count(ent => _whitelistSystem.IsWhitelistPassOrNull(mapLayerData.Whitelist, + ent)); if (count >= mapLayerData.MinCount && count <= mapLayerData.MaxCount) { list.Add(mapLayerData.Layer); From 55a50d04266916ac130d4c2b6729be51f3190af7 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 13 Jul 2024 06:03:16 +0200 Subject: [PATCH 024/118] Use reinforced glass damage modifier for secure windoors (#29941) * Use Rglass damage modifier for reinforced windoors * i actually can remove this line since inherited --- .../Structures/Doors/Windoors/base_structurewindoors.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index 1ec6c04ffe..d15294cc46 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -172,6 +172,8 @@ - state: panel_open map: [ "enum.WiresVisualLayers.MaintenancePanel" ] visible: false + - type: Damageable + damageModifierSet: RGlass - type: Destructible thresholds: - trigger: @@ -257,7 +259,7 @@ - type: entity id: BaseSecurePlasmaWindoor - parent: BaseWindoor + parent: BaseSecureWindoor abstract: true components: - type: Sprite @@ -367,7 +369,7 @@ - type: entity id: BaseSecureUraniumWindoor - parent: BaseWindoor + parent: BaseSecureWindoor abstract: true components: - type: Sprite From 1b360ac914edffd22d31e4a87c55a45419148517 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 13 Jul 2024 04:04:22 +0000 Subject: [PATCH 025/118] 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 1dfa17c2b0..4e0604242e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ElectroJr - changes: - - message: Fixed the nukie station not getting properly initialized. - type: Fix - id: 6412 - time: '2024-04-21T06:52:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27201 - author: Blackern5000 changes: - message: '"Experienced" passengers can now wear a rainbow jumpsuit using loadouts.' @@ -3823,3 +3816,10 @@ id: 6911 time: '2024-07-12T15:00:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29953 +- author: lzk228 + changes: + - message: Secure windoors now use reinforced glass damage modifier. + type: Fix + id: 6912 + time: '2024-07-13T04:03:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29941 From b94b52396e52e7627d80495f019a89a51751c6a8 Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Fri, 12 Jul 2024 21:04:53 -0700 Subject: [PATCH 026/118] Add doc comments to target action components (#29982) --- Content.Shared/Actions/EntityTargetActionComponent.cs | 10 ++++++++++ Content.Shared/Actions/WorldTargetActionComponent.cs | 3 +++ 2 files changed, 13 insertions(+) diff --git a/Content.Shared/Actions/EntityTargetActionComponent.cs b/Content.Shared/Actions/EntityTargetActionComponent.cs index 9024f42e0e..7217794b23 100644 --- a/Content.Shared/Actions/EntityTargetActionComponent.cs +++ b/Content.Shared/Actions/EntityTargetActionComponent.cs @@ -4,6 +4,9 @@ namespace Content.Shared.Actions; +/// +/// Used on action entities to define an action that triggers when targeting an entity. +/// [RegisterComponent, NetworkedComponent] public sealed partial class EntityTargetActionComponent : BaseTargetActionComponent { @@ -16,8 +19,15 @@ public sealed partial class EntityTargetActionComponent : BaseTargetActionCompon [NonSerialized] public EntityTargetActionEvent? Event; + /// + /// Determines which entities are valid targets for this action. + /// + /// No whitelist check when null. [DataField("whitelist")] public EntityWhitelist? Whitelist; + /// + /// Whether this action considers the user as a valid target entity when using this action. + /// [DataField("canTargetSelf")] public bool CanTargetSelf = true; } diff --git a/Content.Shared/Actions/WorldTargetActionComponent.cs b/Content.Shared/Actions/WorldTargetActionComponent.cs index 4974b4478d..8066a64034 100644 --- a/Content.Shared/Actions/WorldTargetActionComponent.cs +++ b/Content.Shared/Actions/WorldTargetActionComponent.cs @@ -3,6 +3,9 @@ namespace Content.Shared.Actions; +/// +/// Used on action entities to define an action that triggers when targeting an entity coordinate. +/// [RegisterComponent, NetworkedComponent] public sealed partial class WorldTargetActionComponent : BaseTargetActionComponent { From 3acc100ae54d56c31aad15a879728c3b67e1e49c Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 21:05:31 -0700 Subject: [PATCH 027/118] Update ShuttleDockControl.xaml.cs to not use Component.Owner (#29966) Update ShuttleDockControl.xaml.cs Co-authored-by: plykiya --- Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs b/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs index 31f0eecad7..61ae069926 100644 --- a/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs +++ b/Content.Client/Shuttles/UI/ShuttleDockControl.xaml.cs @@ -107,7 +107,7 @@ protected override void Draw(DrawingHandleScreen handle) DrawCircles(handle); var gridNent = EntManager.GetNetEntity(GridEntity); var mapPos = _xformSystem.ToMapCoordinates(_coordinates.Value); - var ourGridMatrix = _xformSystem.GetWorldMatrix(gridXform.Owner); + var ourGridMatrix = _xformSystem.GetWorldMatrix(GridEntity.Value); var dockMatrix = Matrix3Helpers.CreateTransform(_coordinates.Value.Position, Angle.Zero); var worldFromDock = Matrix3x2.Multiply(dockMatrix, ourGridMatrix); From e11f1e6cf64bda214f17e95e3eb1c58f46d4675b Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sat, 13 Jul 2024 07:05:51 +0300 Subject: [PATCH 028/118] Update ActionAlertTooltip.cs to use TryFromMarkup (#29975) --- .../Actions/UI/ActionAlertTooltip.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Content.Client/Actions/UI/ActionAlertTooltip.cs b/Content.Client/Actions/UI/ActionAlertTooltip.cs index ddc498b6e9..f805f6643d 100644 --- a/Content.Client/Actions/UI/ActionAlertTooltip.cs +++ b/Content.Client/Actions/UI/ActionAlertTooltip.cs @@ -1,4 +1,4 @@ -using Content.Client.Stylesheets; +using Content.Client.Stylesheets; using Robust.Client.UserInterface.Controls; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -77,9 +77,12 @@ public ActionAlertTooltip(FormattedMessage name, FormattedMessage? desc, string? MaxWidth = TooltipTextMaxWidth, StyleClasses = {StyleNano.StyleClassTooltipActionRequirements} }; - requiresLabel.SetMessage(FormattedMessage.FromMarkup("[color=#635c5c]" + - requires + - "[/color]")); + + if (!FormattedMessage.TryFromMarkup("[color=#635c5c]" + requires + "[/color]", out var markup)) + return; + + requiresLabel.SetMessage(markup); + vbox.AddChild(requiresLabel); } } @@ -97,8 +100,11 @@ protected override void FrameUpdate(FrameEventArgs args) if (timeLeft > TimeSpan.Zero) { var duration = Cooldown.Value.End - Cooldown.Value.Start; - _cooldownLabel.SetMessage(FormattedMessage.FromMarkup( - $"[color=#a10505]{(int) duration.TotalSeconds} sec cooldown ({(int) timeLeft.TotalSeconds + 1} sec remaining)[/color]")); + + if (!FormattedMessage.TryFromMarkup($"[color=#a10505]{(int) duration.TotalSeconds} sec cooldown ({(int) timeLeft.TotalSeconds + 1} sec remaining)[/color]", out var markup)) + return; + + _cooldownLabel.SetMessage(markup); _cooldownLabel.Visible = true; } else From de2ab29f349871797182d105918d3e9c013661e5 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 21:06:54 -0700 Subject: [PATCH 029/118] Update SmokingSystem.SmokingPipe.cs to not use Component.Owner (#29967) Update SmokingSystem.SmokingPipe.cs Co-authored-by: plykiya --- .../EntitySystems/SmokingSystem.SmokingPipe.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Content.Server/Nutrition/EntitySystems/SmokingSystem.SmokingPipe.cs b/Content.Server/Nutrition/EntitySystems/SmokingSystem.SmokingPipe.cs index 3950c73eb4..26d86acd54 100644 --- a/Content.Server/Nutrition/EntitySystems/SmokingSystem.SmokingPipe.cs +++ b/Content.Server/Nutrition/EntitySystems/SmokingSystem.SmokingPipe.cs @@ -42,7 +42,7 @@ private void OnPipeInteractUsingEvent(Entity entity, ref I if (!isHotEvent.IsHot) return; - if (TryTransferReagents(entity.Comp, smokable)) + if (TryTransferReagents(entity, (entity.Owner, smokable))) SetSmokableState(entity, SmokableState.Lit, smokable); args.Handled = true; } @@ -62,7 +62,7 @@ public void OnPipeAfterInteract(Entity entity, ref AfterIn if (!isHotEvent.IsHot) return; - if (TryTransferReagents(entity.Comp, smokable)) + if (TryTransferReagents(entity, (entity.Owner, smokable))) SetSmokableState(entity, SmokableState.Lit, smokable); args.Handled = true; } @@ -74,15 +74,15 @@ private void OnPipeSolutionEmptyEvent(Entity entity, ref S } // Convert smokable item into reagents to be smoked - private bool TryTransferReagents(SmokingPipeComponent component, SmokableComponent smokable) + private bool TryTransferReagents(Entity entity, Entity smokable) { - if (component.BowlSlot.Item == null) + if (entity.Comp.BowlSlot.Item == null) return false; - EntityUid contents = component.BowlSlot.Item.Value; + EntityUid contents = entity.Comp.BowlSlot.Item.Value; if (!TryComp(contents, out var reagents) || - !_solutionContainerSystem.TryGetSolution(smokable.Owner, smokable.Solution, out var pipeSolution, out _)) + !_solutionContainerSystem.TryGetSolution(smokable.Owner, smokable.Comp.Solution, out var pipeSolution, out _)) return false; foreach (var (_, soln) in _solutionContainerSystem.EnumerateSolutions((contents, reagents))) @@ -93,7 +93,7 @@ private bool TryTransferReagents(SmokingPipeComponent component, SmokableCompone EntityManager.DeleteEntity(contents); - _itemSlotsSystem.SetLock(component.Owner, component.BowlSlot, true); //no inserting more until current runs out + _itemSlotsSystem.SetLock(entity.Owner, entity.Comp.BowlSlot, true); //no inserting more until current runs out return true; } From 3388c0dcaa4bc1d459ce01bc9b1c1296011018a4 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sat, 13 Jul 2024 00:14:30 -0400 Subject: [PATCH 030/118] Fix antag objectives always overshooting MaxDifficulty (and kill tries20) (#29830) * The death of try20 * Add integration test for traitor gamerule * Fix max difficulty being overshot * Check at least one objective is assigned * EntProtoId --- .../Tests/GameRules/TraitorRuleTest.cs | 133 ++++++++++++++++++ .../Antag/AntagRandomObjectivesSystem.cs | 3 +- Content.Server/Objectives/ObjectivesSystem.cs | 28 ++-- .../Systems/SharedObjectivesSystem.cs | 17 ++- .../Random/Helpers/SharedRandomExtensions.cs | 21 +++ 5 files changed, 184 insertions(+), 18 deletions(-) create mode 100644 Content.IntegrationTests/Tests/GameRules/TraitorRuleTest.cs diff --git a/Content.IntegrationTests/Tests/GameRules/TraitorRuleTest.cs b/Content.IntegrationTests/Tests/GameRules/TraitorRuleTest.cs new file mode 100644 index 0000000000..31d33ba617 --- /dev/null +++ b/Content.IntegrationTests/Tests/GameRules/TraitorRuleTest.cs @@ -0,0 +1,133 @@ +using System.Linq; +using Content.Server.Antag.Components; +using Content.Server.GameTicking; +using Content.Server.GameTicking.Rules; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Mind; +using Content.Server.Roles; +using Content.Shared.GameTicking; +using Content.Shared.GameTicking.Components; +using Content.Shared.Mind; +using Content.Shared.NPC.Systems; +using Content.Shared.Objectives.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.Prototypes; + +namespace Content.IntegrationTests.Tests.GameRules; + +[TestFixture] +public sealed class TraitorRuleTest +{ + private const string TraitorGameRuleProtoId = "Traitor"; + private const string TraitorAntagRoleName = "Traitor"; + + [Test] + public async Task TestTraitorObjectives() + { + 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 protoMan = server.ProtoMan; + var compFact = server.ResolveDependency(); + var ticker = server.System(); + var mindSys = server.System(); + var roleSys = server.System(); + var factionSys = server.System(); + var traitorRuleSys = server.System(); + + // Look up the minimum player count and max total objective difficulty for the game rule + var minPlayers = 1; + var maxDifficulty = 0f; + await server.WaitAssertion(() => + { + Assert.That(protoMan.TryIndex(TraitorGameRuleProtoId, out var gameRuleEnt), + $"Failed to lookup traitor game rule entity prototype with ID \"{TraitorGameRuleProtoId}\"!"); + + Assert.That(gameRuleEnt.TryGetComponent(out var gameRule, compFact), + $"Game rule entity {TraitorGameRuleProtoId} does not have a GameRuleComponent!"); + + Assert.That(gameRuleEnt.TryGetComponent(out var randomObjectives, compFact), + $"Game rule entity {TraitorGameRuleProtoId} does not have an AntagRandomObjectivesComponent!"); + + minPlayers = gameRule.MinPlayers; + maxDifficulty = randomObjectives.MaxDifficulty; + }); + + // 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)); + + // Add enough dummy players for the game rule + var dummies = await pair.Server.AddDummySessions(minPlayers); + await pair.RunTicksSync(5); + + // Initially, the players have no attached entities + Assert.That(pair.Player?.AttachedEntity, Is.Null); + Assert.That(dummies.All(x => x.AttachedEntity == null)); + + // Opt-in the player for the traitor role + await pair.SetAntagPreference(TraitorAntagRoleName, true); + + // Add the game rule + var gameRuleEnt = ticker.AddGameRule(TraitorGameRuleProtoId); + Assert.That(entMan.TryGetComponent(gameRuleEnt, out var traitorRule)); + + // Ready up + ticker.ToggleReadyAll(true); + Assert.That(ticker.PlayerGameStatuses.Values.All(x => x == PlayerGameStatus.ReadyToPlay)); + + // Start the round + await server.WaitPost(() => + { + ticker.StartRound(); + // Force traitor mode to start (skip the delay) + ticker.StartGameRule(gameRuleEnt); + }); + await pair.RunTicksSync(10); + + // Game should have started + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); + Assert.That(ticker.PlayerGameStatuses.Values.All(x => x == PlayerGameStatus.JoinedGame)); + Assert.That(client.EntMan.EntityExists(client.AttachedEntity)); + + // Check the player and dummies are spawned + var dummyEnts = dummies.Select(x => x.AttachedEntity ?? default).ToArray(); + var player = pair.Player!.AttachedEntity!.Value; + Assert.That(entMan.EntityExists(player)); + Assert.That(dummyEnts.All(entMan.EntityExists)); + + // Make sure the player is a traitor. + var mind = mindSys.GetMind(player)!.Value; + Assert.That(roleSys.MindIsAntagonist(mind)); + Assert.That(factionSys.IsMember(player, "Syndicate"), Is.True); + Assert.That(factionSys.IsMember(player, "NanoTrasen"), Is.False); + Assert.That(traitorRule.TotalTraitors, Is.EqualTo(1)); + Assert.That(traitorRule.TraitorMinds[0], Is.EqualTo(mind)); + + // Check total objective difficulty + Assert.That(entMan.TryGetComponent(mind, out var mindComp)); + var totalDifficulty = mindComp.Objectives.Sum(o => entMan.GetComponent(o).Difficulty); + Assert.That(totalDifficulty, Is.AtMost(maxDifficulty), + $"MaxDifficulty exceeded! Objectives: {string.Join(", ", mindComp.Objectives.Select(o => FormatObjective(o, entMan)))}"); + Assert.That(mindComp.Objectives, Is.Not.Empty, + $"No objectives assigned!"); + + + await pair.CleanReturnAsync(); + } + + private static string FormatObjective(Entity entity, IEntityManager entMan) + { + var meta = entMan.GetComponent(entity); + var objective = entMan.GetComponent(entity); + return $"{meta.EntityName} ({objective.Difficulty})"; + } +} diff --git a/Content.Server/Antag/AntagRandomObjectivesSystem.cs b/Content.Server/Antag/AntagRandomObjectivesSystem.cs index c935b8c064..b60759a3d5 100644 --- a/Content.Server/Antag/AntagRandomObjectivesSystem.cs +++ b/Content.Server/Antag/AntagRandomObjectivesSystem.cs @@ -39,7 +39,8 @@ private void OnAntagSelected(Entity ent, ref Aft for (var pick = 0; pick < set.MaxPicks && ent.Comp.MaxDifficulty > difficulty; pick++) { - if (_objectives.GetRandomObjective(mindId, mind, set.Groups) is not {} objective) + var remainingDifficulty = ent.Comp.MaxDifficulty - difficulty; + if (_objectives.GetRandomObjective(mindId, mind, set.Groups, remainingDifficulty) is not { } objective) continue; _mind.AddObjective(mindId, mind, objective); diff --git a/Content.Server/Objectives/ObjectivesSystem.cs b/Content.Server/Objectives/ObjectivesSystem.cs index 18077b413a..c9cdf244e6 100644 --- a/Content.Server/Objectives/ObjectivesSystem.cs +++ b/Content.Server/Objectives/ObjectivesSystem.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Text; using Robust.Server.Player; +using Robust.Shared.Utility; namespace Content.Server.Objectives; @@ -180,33 +181,32 @@ private void AddSummary(StringBuilder result, string agent, List<(EntityUid, str } } - public EntityUid? GetRandomObjective(EntityUid mindId, MindComponent mind, string objectiveGroupProto) + public EntityUid? GetRandomObjective(EntityUid mindId, MindComponent mind, ProtoId objectiveGroupProto, float maxDifficulty) { - if (!_prototypeManager.TryIndex(objectiveGroupProto, out var groups)) + if (!_prototypeManager.TryIndex(objectiveGroupProto, out var groupsProto)) { Log.Error($"Tried to get a random objective, but can't index WeightedRandomPrototype {objectiveGroupProto}"); return null; } - // TODO replace whatever the fuck this is with a proper objective selection system - // yeah the old 'preventing infinite loops' thing wasn't super elegant either and it mislead people on what exactly it did - var tries = 0; - while (tries < 20) - { - var groupName = groups.Pick(_random); + // Make a copy of the weights so we don't trash the prototype by removing entries + var groups = groupsProto.Weights.ShallowClone(); + while (_random.TryPickAndTake(groups, out var groupName)) + { if (!_prototypeManager.TryIndex(groupName, out var group)) { Log.Error($"Couldn't index objective group prototype {groupName}"); return null; } - var proto = group.Pick(_random); - var objective = TryCreateObjective(mindId, mind, proto); - if (objective != null) - return objective; - - tries++; + var objectives = group.Weights.ShallowClone(); + while (_random.TryPickAndTake(objectives, out var objectiveProto)) + { + if (TryCreateObjective((mindId, mind), objectiveProto, out var objective) + && Comp(objective.Value).Difficulty <= maxDifficulty) + return objective; + } } return null; diff --git a/Content.Shared/Objectives/Systems/SharedObjectivesSystem.cs b/Content.Shared/Objectives/Systems/SharedObjectivesSystem.cs index 8d2c4dcfeb..35fa501398 100644 --- a/Content.Shared/Objectives/Systems/SharedObjectivesSystem.cs +++ b/Content.Shared/Objectives/Systems/SharedObjectivesSystem.cs @@ -1,5 +1,5 @@ +using System.Diagnostics.CodeAnalysis; using Content.Shared.Mind; -using Content.Shared.Objectives; using Content.Shared.Objectives.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -40,7 +40,7 @@ public bool CanBeAssigned(EntityUid uid, EntityUid mindId, MindComponent mind, O if (comp.Unique) { var proto = _metaQuery.GetComponent(uid).EntityPrototype?.ID; - foreach (var objective in mind.AllObjectives) + foreach (var objective in mind.Objectives) { if (_metaQuery.GetComponent(objective).EntityPrototype?.ID == proto) return false; @@ -92,7 +92,18 @@ public bool CanBeAssigned(EntityUid uid, EntityUid mindId, MindComponent mind, O } /// - /// Get the title, description, icon and progress of an objective using . + /// Spawns and assigns an objective for a mind. + /// The objective is not added to the mind's objectives, mind system does that in TryAddObjective. + /// If the objective could not be assigned the objective is deleted and false is returned. + /// + public bool TryCreateObjective(Entity mind, EntProtoId proto, [NotNullWhen(true)] out EntityUid? objective) + { + objective = TryCreateObjective(mind.Owner, mind.Comp, proto); + return objective != null; + } + + /// + /// Get the title, description, icon and progress of an objective using . /// If any of them are null it is logged and null is returned. /// /// ID of the condition entity diff --git a/Content.Shared/Random/Helpers/SharedRandomExtensions.cs b/Content.Shared/Random/Helpers/SharedRandomExtensions.cs index 0b618a262d..376e91743d 100644 --- a/Content.Shared/Random/Helpers/SharedRandomExtensions.cs +++ b/Content.Shared/Random/Helpers/SharedRandomExtensions.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.Dataset; using Content.Shared.FixedPoint; @@ -87,6 +88,26 @@ public static T Pick(this IRobustRandom random, Dictionary weights) throw new InvalidOperationException("Invalid weighted pick"); } + public static T PickAndTake(this IRobustRandom random, Dictionary weights) + where T : notnull + { + var pick = Pick(random, weights); + weights.Remove(pick); + return pick; + } + + public static bool TryPickAndTake(this IRobustRandom random, Dictionary weights, [NotNullWhen(true)] out T? pick) + where T : notnull + { + if (weights.Count == 0) + { + pick = default; + return false; + } + pick = PickAndTake(random, weights); + return true; + } + public static (string reagent, FixedPoint2 quantity) Pick(this WeightedRandomFillSolutionPrototype prototype, IRobustRandom? random = null) { var randomFill = prototype.PickRandomFill(random); From 87fa6075b64ba097d99cbb04421a0f7dfb2662b2 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 13 Jul 2024 04:15:36 +0000 Subject: [PATCH 031/118] 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 4e0604242e..eb495bc316 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Blackern5000 - changes: - - message: '"Experienced" passengers can now wear a rainbow jumpsuit using loadouts.' - type: Add - id: 6413 - time: '2024-04-21T11:53:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27211 - author: PJB3005 changes: - message: The item status menu has been moved to the side of the hands. There is @@ -3823,3 +3816,10 @@ id: 6912 time: '2024-07-13T04:03:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29941 +- author: Tayrtahn + changes: + - message: Antag objective total difficulty is now properly capped. + type: Fix + id: 6913 + time: '2024-07-13T04:14:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29830 From 7b590122b652096528ec69921924b3db22b27f6a Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 13 Jul 2024 04:17:10 +0000 Subject: [PATCH 032/118] fire extinguisher using item toggle (#29906) * move SprayAttemptEvent to shared * add SolutionTransferredEvent * replace FireExtinguisher with SpraySafety * update fire extinguisher yml * invert visuals * always handle event in solution transfer, it makes popups * instantly fill it * untroll --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Extinguisher/FireExtinguisherComponent.cs | 7 - .../Extinguisher/FireExtinguisherComponent.cs | 10 -- .../Extinguisher/FireExtinguisherSystem.cs | 139 ------------------ .../Fluids/EntitySystems/SpraySystem.cs | 16 +- .../EntitySystems/SolutionTransferSystem.cs | 16 +- .../SharedFireExtinguisherComponent.cs | 25 ---- .../Fluids/Components/SpraySafetyComponent.cs | 24 +++ Content.Shared/Fluids/Events.cs | 12 ++ Content.Shared/Fluids/SpraySafetySystem.cs | 44 ++++++ .../Objects/Misc/fire_extinguisher.yml | 34 +++-- 10 files changed, 118 insertions(+), 209 deletions(-) delete mode 100644 Content.Client/Extinguisher/FireExtinguisherComponent.cs delete mode 100644 Content.Server/Extinguisher/FireExtinguisherComponent.cs delete mode 100644 Content.Server/Extinguisher/FireExtinguisherSystem.cs delete mode 100644 Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs create mode 100644 Content.Shared/Fluids/Components/SpraySafetyComponent.cs create mode 100644 Content.Shared/Fluids/SpraySafetySystem.cs diff --git a/Content.Client/Extinguisher/FireExtinguisherComponent.cs b/Content.Client/Extinguisher/FireExtinguisherComponent.cs deleted file mode 100644 index 324b05a93d..0000000000 --- a/Content.Client/Extinguisher/FireExtinguisherComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Extinguisher; -using Robust.Shared.GameStates; - -namespace Content.Client.Extinguisher; - -[RegisterComponent] -public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent; diff --git a/Content.Server/Extinguisher/FireExtinguisherComponent.cs b/Content.Server/Extinguisher/FireExtinguisherComponent.cs deleted file mode 100644 index 991fc76c62..0000000000 --- a/Content.Server/Extinguisher/FireExtinguisherComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Content.Shared.Extinguisher; -using Robust.Shared.GameStates; - -namespace Content.Server.Extinguisher; - -[RegisterComponent] -[Access(typeof(FireExtinguisherSystem))] -public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent -{ -} diff --git a/Content.Server/Extinguisher/FireExtinguisherSystem.cs b/Content.Server/Extinguisher/FireExtinguisherSystem.cs deleted file mode 100644 index b33a1af157..0000000000 --- a/Content.Server/Extinguisher/FireExtinguisherSystem.cs +++ /dev/null @@ -1,139 +0,0 @@ -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Fluids.EntitySystems; -using Content.Server.Popups; -using Content.Shared.Chemistry.Components; -using Content.Shared.Extinguisher; -using Content.Shared.FixedPoint; -using Content.Shared.Interaction; -using Content.Shared.Interaction.Events; -using Content.Shared.Verbs; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; - -namespace Content.Server.Extinguisher; - -public sealed class FireExtinguisherSystem : EntitySystem -{ - [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnFireExtinguisherInit); - SubscribeLocalEvent(OnUseInHand); - SubscribeLocalEvent(OnAfterInteract); - SubscribeLocalEvent>(OnGetInteractionVerbs); - SubscribeLocalEvent(OnSprayAttempt); - } - - private void OnFireExtinguisherInit(Entity entity, ref ComponentInit args) - { - if (entity.Comp.HasSafety) - { - UpdateAppearance((entity.Owner, entity.Comp)); - } - } - - private void OnUseInHand(Entity entity, ref UseInHandEvent args) - { - if (args.Handled) - return; - - ToggleSafety((entity.Owner, entity.Comp), args.User); - - args.Handled = true; - } - - private void OnAfterInteract(Entity entity, ref AfterInteractEvent args) - { - if (args.Target == null || !args.CanReach) - { - return; - } - - if (args.Handled) - return; - - if (entity.Comp.HasSafety && entity.Comp.Safety) - { - _popupSystem.PopupEntity(Loc.GetString("fire-extinguisher-component-safety-on-message"), entity.Owner, args.User); - return; - } - - if (args.Target is not { Valid: true } target || - !_solutionContainerSystem.TryGetDrainableSolution(target, out var targetSoln, out var targetSolution) || - !_solutionContainerSystem.TryGetRefillableSolution(entity.Owner, out var containerSoln, out var containerSolution)) - { - return; - } - - args.Handled = true; - - // TODO: why is this copy paste shit here just have fire extinguisher cancel transfer when safety is on - var transfer = containerSolution.AvailableVolume; - if (TryComp(entity.Owner, out var solTrans)) - { - transfer = solTrans.TransferAmount; - } - transfer = FixedPoint2.Min(transfer, targetSolution.Volume); - - if (transfer > 0) - { - var drained = _solutionContainerSystem.Drain(target, targetSoln.Value, transfer); - _solutionContainerSystem.TryAddSolution(containerSoln.Value, drained); - - _audio.PlayPvs(entity.Comp.RefillSound, entity.Owner); - _popupSystem.PopupEntity(Loc.GetString("fire-extinguisher-component-after-interact-refilled-message", ("owner", entity.Owner)), - entity.Owner, args.Target.Value); - } - } - - private void OnGetInteractionVerbs(Entity entity, ref GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - var user = args.User; - var verb = new InteractionVerb - { - Act = () => ToggleSafety((entity.Owner, entity.Comp), user), - Text = Loc.GetString("fire-extinguisher-component-verb-text"), - }; - - args.Verbs.Add(verb); - } - - private void OnSprayAttempt(Entity entity, ref SprayAttemptEvent args) - { - if (entity.Comp.HasSafety && entity.Comp.Safety) - { - _popupSystem.PopupEntity(Loc.GetString("fire-extinguisher-component-safety-on-message"), entity, args.User); - args.Cancel(); - } - } - - private void UpdateAppearance(Entity entity) - { - if (!Resolve(entity, ref entity.Comp2, false)) - return; - - if (entity.Comp1.HasSafety) - { - _appearance.SetData(entity, FireExtinguisherVisuals.Safety, entity.Comp1.Safety, entity.Comp2); - } - } - - public void ToggleSafety(Entity extinguisher, EntityUid user) - { - if (!Resolve(extinguisher, ref extinguisher.Comp)) - return; - - extinguisher.Comp.Safety = !extinguisher.Comp.Safety; - _audio.PlayPvs(extinguisher.Comp.SafetySound, extinguisher, AudioParams.Default.WithVariation(0.125f).WithVolume(-4f)); - UpdateAppearance((extinguisher.Owner, extinguisher.Comp)); - } -} diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs index 5499070738..215ed7c33f 100644 --- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs +++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs @@ -1,11 +1,11 @@ using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Chemistry.EntitySystems; -using Content.Server.Extinguisher; using Content.Server.Fluids.Components; using Content.Server.Gravity; using Content.Server.Popups; using Content.Shared.FixedPoint; +using Content.Shared.Fluids; using Content.Shared.Interaction; using Content.Shared.Timing; using Content.Shared.Vapor; @@ -34,7 +34,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAfterInteract, after: new[] { typeof(FireExtinguisherSystem) }); + SubscribeLocalEvent(OnAfterInteract); } private void OnAfterInteract(Entity entity, ref AfterInteractEvent args) @@ -48,7 +48,7 @@ private void OnAfterInteract(Entity entity, ref AfterInteractEve return; var ev = new SprayAttemptEvent(args.User); - RaiseLocalEvent(entity, ev); + RaiseLocalEvent(entity, ref ev); if (ev.Cancelled) return; @@ -148,13 +148,3 @@ private void OnAfterInteract(Entity entity, ref AfterInteractEve _useDelay.TryResetDelay((entity, useDelay)); } } - -public sealed class SprayAttemptEvent : CancellableEntityEventArgs -{ - public EntityUid User; - - public SprayAttemptEvent(EntityUid user) - { - User = user; - } -} diff --git a/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs b/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs index 3b75392508..e5d8cc5f59 100644 --- a/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs @@ -117,6 +117,7 @@ private void OnAfterInteract(Entity ent, ref AfterInt transferAmount = FixedPoint2.Min(transferAmount, maxRefill); var transferred = Transfer(args.User, target, targetSoln.Value, uid, ownerSoln.Value, transferAmount); + args.Handled = true; if (transferred > 0) { var toTheBrim = ownerRefill.AvailableVolume == 0; @@ -125,8 +126,6 @@ private void OnAfterInteract(Entity ent, ref AfterInt : "comp-solution-transfer-fill-normal"; _popup.PopupClient(Loc.GetString(msg, ("owner", args.Target), ("amount", transferred), ("target", uid)), uid, args.User); - - args.Handled = true; return; } } @@ -143,13 +142,11 @@ private void OnAfterInteract(Entity ent, ref AfterInt transferAmount = FixedPoint2.Min(transferAmount, maxRefill); var transferred = Transfer(args.User, uid, ownerSoln.Value, target, targetSoln.Value, transferAmount); - + args.Handled = true; if (transferred > 0) { var message = Loc.GetString("comp-solution-transfer-transfer-solution", ("amount", transferred), ("target", target)); _popup.PopupClient(message, uid, args.User); - - args.Handled = true; } } } @@ -202,6 +199,9 @@ public FixedPoint2 Transfer(EntityUid user, var solution = _solution.SplitSolution(source, actualAmount); _solution.AddSolution(target, solution); + var ev = new SolutionTransferredEvent(sourceEntity, targetEntity, user, actualAmount); + RaiseLocalEvent(targetEntity, ref ev); + _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user):player} transferred {SharedSolutionContainerSystem.ToPrettyString(solution)} to {ToPrettyString(targetEntity):target}, which now contains {SharedSolutionContainerSystem.ToPrettyString(targetSolution)}"); @@ -225,3 +225,9 @@ public void Cancel(string reason) CancelReason = reason; } } + +/// +/// Raised on the target entity when a non-zero amount of solution gets transferred. +/// +[ByRefEvent] +public record struct SolutionTransferredEvent(EntityUid From, EntityUid To, EntityUid User, FixedPoint2 Amount); diff --git a/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs b/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs deleted file mode 100644 index dbb1f6f2c4..0000000000 --- a/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs +++ /dev/null @@ -1,25 +0,0 @@ -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"); - - [DataField("hasSafety")] public bool HasSafety = true; - - [DataField("safety")] public bool Safety = true; - - [DataField("safetySound")] - public SoundSpecifier SafetySound { get; private set; } = new SoundPathSpecifier("/Audio/Machines/button.ogg"); -} - - -[Serializable, NetSerializable] -public enum FireExtinguisherVisuals : byte -{ - Safety -} diff --git a/Content.Shared/Fluids/Components/SpraySafetyComponent.cs b/Content.Shared/Fluids/Components/SpraySafetyComponent.cs new file mode 100644 index 0000000000..30827d4fd1 --- /dev/null +++ b/Content.Shared/Fluids/Components/SpraySafetyComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Fluids.Components; + +/// +/// Uses ItemToggle to control safety for a spray item. +/// You can't spray or refill it while safety is on. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SpraySafetySystem))] +public sealed partial class SpraySafetyComponent : Component +{ + /// + /// Popup shown when trying to spray or refill with safety on. + /// + [DataField] + public LocId Popup = "fire-extinguisher-component-safety-on-message"; + + /// + /// Sound to play after refilling. + /// + [DataField] + public SoundSpecifier RefillSound = new SoundPathSpecifier("/Audio/Effects/refill.ogg"); +} diff --git a/Content.Shared/Fluids/Events.cs b/Content.Shared/Fluids/Events.cs index e281de9137..198e888774 100644 --- a/Content.Shared/Fluids/Events.cs +++ b/Content.Shared/Fluids/Events.cs @@ -34,3 +34,15 @@ public AbsorbantDoAfterEvent(string targetSolution, string message, SoundSpecifi public override DoAfterEvent Clone() => this; } + +/// +/// Raised when trying to spray something, for example a fire extinguisher. +/// +[ByRefEvent] +public record struct SprayAttemptEvent(EntityUid User, bool Cancelled = false) +{ + public void Cancel() + { + Cancelled = true; + } +} diff --git a/Content.Shared/Fluids/SpraySafetySystem.cs b/Content.Shared/Fluids/SpraySafetySystem.cs new file mode 100644 index 0000000000..82006a995b --- /dev/null +++ b/Content.Shared/Fluids/SpraySafetySystem.cs @@ -0,0 +1,44 @@ +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Fluids.Components; +using Content.Shared.Item.ItemToggle; +using Content.Shared.Popups; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Fluids; + +public sealed class SpraySafetySystem : EntitySystem +{ + [Dependency] private readonly ItemToggleSystem _toggle = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTransferAttempt); + SubscribeLocalEvent(OnTransferred); + SubscribeLocalEvent(OnSprayAttempt); + } + + private void OnTransferAttempt(Entity ent, ref SolutionTransferAttemptEvent args) + { + var (uid, comp) = ent; + if (uid == args.To && !_toggle.IsActivated(uid)) + args.Cancel(Loc.GetString(comp.Popup)); + } + + private void OnTransferred(Entity ent, ref SolutionTransferredEvent args) + { + _audio.PlayPredicted(ent.Comp.RefillSound, ent, args.User); + } + + private void OnSprayAttempt(Entity ent, ref SprayAttemptEvent args) + { + if (!_toggle.IsActivated(ent.Owner)) + { + _popup.PopupEntity(Loc.GetString(ent.Comp.Popup), ent, args.User); + args.Cancel(); + } + } +} diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index 5aaa58dbbe..89b421c97d 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -7,8 +7,8 @@ - type: Sprite sprite: Objects/Misc/fire_extinguisher.rsi layers: - - state: fire_extinguisher_closed - map: [ "enabled" ] + - state: fire_extinguisher_closed + map: [ "enum.ToggleVisuals.Layer" ] - type: Item sprite: Objects/Misc/fire_extinguisher.rsi size: Normal @@ -24,6 +24,8 @@ - type: DrainableSolution solution: spray - type: SolutionTransfer + maxTransferAmount: 100 + transferAmount: 100 - type: UseDelay - type: Spray transferAmount: 10 @@ -34,8 +36,20 @@ vaporAmount: 3 vaporSpread: 90 sprayVelocity: 2.0 - - type: FireExtinguisher - hasSafety: true + - type: ItemToggle + soundActivate: + path: /Audio/Machines/button.ogg + params: + variation: 0.125 + volume: -4 + soundDeactivate: + path: /Audio/Machines/button.ogg + params: + variation: 0.125 + volume: -4 + - type: ToggleVerb + text: fire-extinguisher-component-verb-text + - type: SpraySafety - type: MeleeWeapon wideAnimationRotation: 180 damage: @@ -46,14 +60,14 @@ - type: Tool qualities: - Rolling - speedModifier: 0.5 # its very big, akward to use + speedModifier: 0.5 # its very big, awkward to use - type: Appearance - type: GenericVisualizer visuals: - enum.FireExtinguisherVisuals.Safety: - enabled: - True: { state: fire_extinguisher_closed } - False: { state: fire_extinguisher_open } + enum.ToggleVisuals.Toggled: + enum.ToggleVisuals.Layer: + True: { state: fire_extinguisher_open } + False: { state: fire_extinguisher_closed } - type: PhysicalComposition materialComposition: Steel: 100 @@ -107,4 +121,4 @@ - type: PhysicalComposition materialComposition: Steel: 50 - Glass: 40 \ No newline at end of file + Glass: 40 From cb98b659adf022deb575910abac4b124baa6e7d4 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Fri, 12 Jul 2024 21:20:17 -0700 Subject: [PATCH 033/118] Update SalvageSystem.Magnet to not use Component.Owner (#29961) * Update SalvageSystem.Magnet.cs * Update SalvageSystem.Magnet.cs the right way --------- Co-authored-by: plykiya --- .../Salvage/SalvageSystem.Magnet.cs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs index 3fe4baca8b..5e85fdb573 100644 --- a/Content.Server/Salvage/SalvageSystem.Magnet.cs +++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs @@ -8,6 +8,7 @@ using Content.Shared.Salvage.Magnet; using Robust.Server.Maps; using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Server.Salvage; @@ -253,7 +254,8 @@ private async Task TakeMagnetOffer(Entity data, int var seed = data.Comp.Offered[index]; var offering = GetSalvageOffering(seed); - var salvMap = _mapManager.CreateMap(); + var salvMap = _mapSystem.CreateMap(); + var salvMapXform = Transform(salvMap); // Set values while awaiting asteroid dungeon if relevant so we can't double-take offers. data.Comp.ActiveSeed = seed; @@ -264,8 +266,8 @@ private async Task TakeMagnetOffer(Entity data, int switch (offering) { case AsteroidOffering asteroid: - var grid = _mapManager.CreateGrid(salvMap); - await _dungeon.GenerateDungeonAsync(asteroid.DungeonConfig, grid.Owner, grid, Vector2i.Zero, seed); + var grid = _mapManager.CreateGridEntity(salvMap); + await _dungeon.GenerateDungeonAsync(asteroid.DungeonConfig, grid.Owner, grid.Comp, Vector2i.Zero, seed); break; case SalvageOffering wreck: var salvageProto = wreck.SalvageMap; @@ -275,10 +277,10 @@ private async Task TakeMagnetOffer(Entity data, int Offset = new Vector2(0, 0) }; - if (!_map.TryLoad(salvMap, salvageProto.MapPath.ToString(), out var roots, opts)) + if (!_map.TryLoad(salvMapXform.MapID, salvageProto.MapPath.ToString(), out _, opts)) { Report(magnet, MagnetChannel, "salvage-system-announcement-spawn-debris-disintegrated"); - _mapManager.DeleteMap(salvMap); + _mapManager.DeleteMap(salvMapXform.MapID); return; } @@ -288,15 +290,14 @@ private async Task TakeMagnetOffer(Entity data, int } Box2? bounds = null; - var mapXform = _xformQuery.GetComponent(_mapManager.GetMapEntityId(salvMap)); - if (mapXform.ChildCount == 0) + if (salvMapXform.ChildCount == 0) { Report(magnet.Owner, MagnetChannel, "salvage-system-announcement-spawn-no-debris-available"); return; } - var mapChildren = mapXform.ChildEnumerator; + var mapChildren = salvMapXform.ChildEnumerator; while (mapChildren.MoveNext(out var mapChild)) { @@ -340,19 +341,25 @@ private async Task TakeMagnetOffer(Entity data, int if (!TryGetSalvagePlacementLocation(mapId, attachedBounds, bounds!.Value, worldAngle, out var spawnLocation, out var spawnAngle)) { Report(magnet.Owner, MagnetChannel, "salvage-system-announcement-spawn-no-debris-available"); - _mapManager.DeleteMap(salvMap); + _mapManager.DeleteMap(salvMapXform.MapID); return; } + // I have no idea if we want to return on failure or not + // but I assume trying to set the parent with a null value wouldn't have worked out anyways + if (!_mapSystem.TryGetMap(spawnLocation.MapId, out var spawnUid)) + return; + data.Comp.ActiveEntities = null; - mapChildren = mapXform.ChildEnumerator; + mapChildren = salvMapXform.ChildEnumerator; // It worked, move it into position and cleanup values. while (mapChildren.MoveNext(out var mapChild)) { var salvXForm = _xformQuery.GetComponent(mapChild); var localPos = salvXForm.LocalPosition; - _transform.SetParent(mapChild, salvXForm, _mapManager.GetMapEntityId(spawnLocation.MapId)); + + _transform.SetParent(mapChild, salvXForm, spawnUid.Value); _transform.SetWorldPositionRotation(mapChild, spawnLocation.Position + localPos, spawnAngle, salvXForm); data.Comp.ActiveEntities ??= new List(); @@ -371,7 +378,7 @@ private async Task TakeMagnetOffer(Entity data, int } Report(magnet.Owner, MagnetChannel, "salvage-system-announcement-arrived", ("timeLeft", data.Comp.ActiveTime.TotalSeconds)); - _mapManager.DeleteMap(salvMap); + _mapManager.DeleteMap(salvMapXform.MapID); data.Comp.Announced = false; From f969fd2bfbf143583b87fb91e315ae187344fb4e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 13 Jul 2024 16:05:32 +1000 Subject: [PATCH 034/118] Update submodule to 228.0.0 (#29947) * Update submodule to 228.0.0 * Fix every single test * Also this one --- .../Tests/Interaction/InteractionTest.EntitySpecifier.cs | 2 +- .../Tests/Interaction/InteractionTest.Helpers.cs | 2 +- RobustToolbox | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.EntitySpecifier.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.EntitySpecifier.cs index 053152dbe1..194bc54fba 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.EntitySpecifier.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.EntitySpecifier.cs @@ -114,7 +114,7 @@ await Server.WaitPost(() => return await SpawnEntity((stack.StackTypeId, spec.Quantity), coords); Assert.That(spec.Quantity, Is.EqualTo(1), "SpawnEntity only supports returning a singular entity"); - await Server.WaitPost(() => uid = SEntMan.SpawnEntity(spec.Prototype, coords)); + await Server.WaitPost(() => uid = SEntMan.SpawnAtPosition(spec.Prototype, coords)); return uid; } diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs index 33e4da3fa3..0f2c314ed0 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs @@ -91,7 +91,7 @@ protected async Task SpawnTarget(string prototype) Target = NetEntity.Invalid; await Server.WaitPost(() => { - Target = SEntMan.GetNetEntity(SEntMan.SpawnEntity(prototype, SEntMan.GetCoordinates(TargetCoords))); + Target = SEntMan.GetNetEntity(SEntMan.SpawnAtPosition(prototype, SEntMan.GetCoordinates(TargetCoords))); }); await RunTicks(5); diff --git a/RobustToolbox b/RobustToolbox index a9aea7027f..fc1cca4f48 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit a9aea7027f1840c83bcaf1c973caf099745f9eed +Subproject commit fc1cca4f48f2f2d3fbf41aa42b80b4e43b1095a4 From 361ec5941255940db153551f3505bfc7b8f32ee5 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sat, 13 Jul 2024 08:05:57 +0200 Subject: [PATCH 035/118] Dummy vox deserves a proper vox name (#29789) SKREEEEEeeeeeeee --- Resources/Prototypes/Entities/Mobs/Player/vox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/vox.yml b/Resources/Prototypes/Entities/Mobs/Player/vox.yml index e7ad39d731..28906584cb 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/vox.yml @@ -1,5 +1,5 @@ - type: entity save: false - name: Urist McVox + name: Uristititi McVox parent: BaseMobVox - id: MobVox \ No newline at end of file + id: MobVox From 49096cf14f8898bdbcb997fa3bbeacbcdccae67e Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 13 Jul 2024 02:09:19 -0400 Subject: [PATCH 036/118] Watches (#29550) * watches * rename * add it into loot pools --- Content.Client/Clock/ClockSystem.cs | 26 +++++ Content.Server/Clock/ClockSystem.cs | 42 ++++++++ Content.Shared/Clock/ClockComponent.cs | 42 ++++++++ .../Clock/GlobalTimeManagerComponent.cs | 16 +++ Content.Shared/Clock/SharedClockSystem.cs | 66 ++++++++++++ Resources/Locale/en-US/devices/clock.ftl | 1 + .../Prototypes/Catalog/Fills/Lockers/misc.yml | 2 + .../Markers/Spawners/Random/maintenance.yml | 2 + .../Entities/Objects/Devices/wristwatch.yml | 59 +++++++++++ .../Devices/goldwatch.rsi/equipped-HAND.png | Bin 0 -> 295 bytes .../Devices/goldwatch.rsi/goldwatch.png | Bin 0 -> 1180 bytes .../Objects/Devices/goldwatch.rsi/hours_0.png | Bin 0 -> 145 bytes .../Objects/Devices/goldwatch.rsi/hours_1.png | Bin 0 -> 148 bytes .../Devices/goldwatch.rsi/hours_10.png | Bin 0 -> 150 bytes .../Devices/goldwatch.rsi/hours_11.png | Bin 0 -> 146 bytes .../Objects/Devices/goldwatch.rsi/hours_2.png | Bin 0 -> 149 bytes .../Objects/Devices/goldwatch.rsi/hours_3.png | Bin 0 -> 143 bytes .../Objects/Devices/goldwatch.rsi/hours_4.png | Bin 0 -> 151 bytes .../Objects/Devices/goldwatch.rsi/hours_5.png | Bin 0 -> 149 bytes .../Objects/Devices/goldwatch.rsi/hours_6.png | Bin 0 -> 145 bytes .../Objects/Devices/goldwatch.rsi/hours_7.png | Bin 0 -> 148 bytes .../Objects/Devices/goldwatch.rsi/hours_8.png | Bin 0 -> 149 bytes .../Objects/Devices/goldwatch.rsi/hours_9.png | Bin 0 -> 142 bytes .../Devices/goldwatch.rsi/inhand-left.png | Bin 0 -> 271 bytes .../Devices/goldwatch.rsi/inhand-right.png | Bin 0 -> 273 bytes .../Objects/Devices/goldwatch.rsi/meta.json | 98 ++++++++++++++++++ .../Devices/goldwatch.rsi/minutes_0.png | Bin 0 -> 144 bytes .../Devices/goldwatch.rsi/minutes_1.png | Bin 0 -> 150 bytes .../Devices/goldwatch.rsi/minutes_10.png | Bin 0 -> 151 bytes .../Devices/goldwatch.rsi/minutes_11.png | Bin 0 -> 150 bytes .../Devices/goldwatch.rsi/minutes_2.png | Bin 0 -> 148 bytes .../Devices/goldwatch.rsi/minutes_3.png | Bin 0 -> 142 bytes .../Devices/goldwatch.rsi/minutes_4.png | Bin 0 -> 148 bytes .../Devices/goldwatch.rsi/minutes_5.png | Bin 0 -> 150 bytes .../Devices/goldwatch.rsi/minutes_6.png | Bin 0 -> 143 bytes .../Devices/goldwatch.rsi/minutes_7.png | Bin 0 -> 149 bytes .../Devices/goldwatch.rsi/minutes_8.png | Bin 0 -> 146 bytes .../Devices/goldwatch.rsi/minutes_9.png | Bin 0 -> 143 bytes .../Devices/wristwatch.rsi/equipped-HAND.png | Bin 0 -> 292 bytes .../Devices/wristwatch.rsi/hours_0.png | Bin 0 -> 151 bytes .../Devices/wristwatch.rsi/hours_1.png | Bin 0 -> 152 bytes .../Devices/wristwatch.rsi/hours_10.png | Bin 0 -> 156 bytes .../Devices/wristwatch.rsi/hours_11.png | Bin 0 -> 153 bytes .../Devices/wristwatch.rsi/hours_2.png | Bin 0 -> 152 bytes .../Devices/wristwatch.rsi/hours_3.png | Bin 0 -> 153 bytes .../Devices/wristwatch.rsi/hours_4.png | Bin 0 -> 155 bytes .../Devices/wristwatch.rsi/hours_5.png | Bin 0 -> 155 bytes .../Devices/wristwatch.rsi/hours_6.png | Bin 0 -> 152 bytes .../Devices/wristwatch.rsi/hours_7.png | Bin 0 -> 153 bytes .../Devices/wristwatch.rsi/hours_8.png | Bin 0 -> 152 bytes .../Devices/wristwatch.rsi/hours_9.png | Bin 0 -> 150 bytes .../Devices/wristwatch.rsi/inhand-left.png | Bin 0 -> 252 bytes .../Devices/wristwatch.rsi/inhand-right.png | Bin 0 -> 254 bytes .../Objects/Devices/wristwatch.rsi/meta.json | 98 ++++++++++++++++++ .../Devices/wristwatch.rsi/minutes_0.png | Bin 0 -> 152 bytes .../Devices/wristwatch.rsi/minutes_1.png | Bin 0 -> 158 bytes .../Devices/wristwatch.rsi/minutes_10.png | Bin 0 -> 159 bytes .../Devices/wristwatch.rsi/minutes_11.png | Bin 0 -> 160 bytes .../Devices/wristwatch.rsi/minutes_2.png | Bin 0 -> 157 bytes .../Devices/wristwatch.rsi/minutes_3.png | Bin 0 -> 151 bytes .../Devices/wristwatch.rsi/minutes_4.png | Bin 0 -> 160 bytes .../Devices/wristwatch.rsi/minutes_5.png | Bin 0 -> 159 bytes .../Devices/wristwatch.rsi/minutes_6.png | Bin 0 -> 153 bytes .../Devices/wristwatch.rsi/minutes_7.png | Bin 0 -> 157 bytes .../Devices/wristwatch.rsi/minutes_8.png | Bin 0 -> 155 bytes .../Devices/wristwatch.rsi/minutes_9.png | Bin 0 -> 150 bytes .../Devices/wristwatch.rsi/wristwatch.png | Bin 0 -> 887 bytes 67 files changed, 452 insertions(+) create mode 100644 Content.Client/Clock/ClockSystem.cs create mode 100644 Content.Server/Clock/ClockSystem.cs create mode 100644 Content.Shared/Clock/ClockComponent.cs create mode 100644 Content.Shared/Clock/GlobalTimeManagerComponent.cs create mode 100644 Content.Shared/Clock/SharedClockSystem.cs create mode 100644 Resources/Locale/en-US/devices/clock.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/goldwatch.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_0.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_1.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_10.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_11.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_2.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_3.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_4.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_5.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_6.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_7.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_8.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/hours_9.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_0.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_1.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_10.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_11.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_2.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_3.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_4.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_5.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_6.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_7.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_8.png create mode 100644 Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_9.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_0.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_1.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_10.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_11.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_2.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_3.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_4.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_5.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_6.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_7.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_8.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/hours_9.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_0.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_1.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_10.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_11.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_2.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_3.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_4.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_5.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_6.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_7.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_8.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_9.png create mode 100644 Resources/Textures/Objects/Devices/wristwatch.rsi/wristwatch.png diff --git a/Content.Client/Clock/ClockSystem.cs b/Content.Client/Clock/ClockSystem.cs new file mode 100644 index 0000000000..7097ada9df --- /dev/null +++ b/Content.Client/Clock/ClockSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Clock; +using Robust.Client.GameObjects; + +namespace Content.Client.Clock; + +public sealed class ClockSystem : SharedClockSystem +{ + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var sprite)) + { + if (!sprite.LayerMapTryGet(ClockVisualLayers.HourHand, out var hourLayer) || + !sprite.LayerMapTryGet(ClockVisualLayers.MinuteHand, out var minuteLayer)) + continue; + + var time = GetClockTime((uid, comp)); + var hourState = $"{comp.HoursBase}{time.Hours % 12}"; + var minuteState = $"{comp.MinutesBase}{time.Minutes / 5}"; + sprite.LayerSetState(hourLayer, hourState); + sprite.LayerSetState(minuteLayer, minuteState); + } + } +} diff --git a/Content.Server/Clock/ClockSystem.cs b/Content.Server/Clock/ClockSystem.cs new file mode 100644 index 0000000000..29400a59f7 --- /dev/null +++ b/Content.Server/Clock/ClockSystem.cs @@ -0,0 +1,42 @@ +using Content.Server.GameTicking.Events; +using Content.Shared.Clock; +using Content.Shared.Destructible; +using Robust.Server.GameStates; +using Robust.Shared.Random; + +namespace Content.Server.Clock; + +public sealed class ClockSystem : SharedClockSystem +{ + [Dependency] private readonly PvsOverrideSystem _pvsOverride = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRoundStart); + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnBreak); + } + + private void OnRoundStart(RoundStartingEvent ev) + { + var manager = Spawn(); + AddComp(manager); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.TimeOffset = TimeSpan.FromHours(_robustRandom.NextFloat(0, 24)); + _pvsOverride.AddGlobalOverride(ent); + Dirty(ent); + } + + private void OnBreak(Entity ent, ref BreakageEventArgs args) + { + ent.Comp.StuckTime = GetClockTime(ent); + Dirty(ent, ent.Comp); + } +} diff --git a/Content.Shared/Clock/ClockComponent.cs b/Content.Shared/Clock/ClockComponent.cs new file mode 100644 index 0000000000..3a1027d813 --- /dev/null +++ b/Content.Shared/Clock/ClockComponent.cs @@ -0,0 +1,42 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Clock; + +[RegisterComponent, NetworkedComponent] +[Access(typeof(SharedClockSystem))] +[AutoGenerateComponentState] +public sealed partial class ClockComponent : Component +{ + /// + /// If not null, this time will be permanently shown. + /// + [DataField, AutoNetworkedField] + public TimeSpan? StuckTime; + + /// + /// The format in which time is displayed. + /// + [DataField, AutoNetworkedField] + public ClockType ClockType = ClockType.TwelveHour; + + [DataField] + public string HoursBase = "hours_"; + + [DataField] + public string MinutesBase = "minutes_"; +} + +[Serializable, NetSerializable] +public enum ClockType : byte +{ + TwelveHour, + TwentyFourHour +} + +[Serializable, NetSerializable] +public enum ClockVisualLayers : byte +{ + HourHand, + MinuteHand +} diff --git a/Content.Shared/Clock/GlobalTimeManagerComponent.cs b/Content.Shared/Clock/GlobalTimeManagerComponent.cs new file mode 100644 index 0000000000..764b578b25 --- /dev/null +++ b/Content.Shared/Clock/GlobalTimeManagerComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Clock; + +/// +/// This is used for globally managing the time on-station +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause, Access(typeof(SharedClockSystem))] +public sealed partial class GlobalTimeManagerComponent : Component +{ + /// + /// A fixed random offset, used to fuzz the time between shifts. + /// + [DataField, AutoPausedField, AutoNetworkedField] + public TimeSpan TimeOffset; +} diff --git a/Content.Shared/Clock/SharedClockSystem.cs b/Content.Shared/Clock/SharedClockSystem.cs new file mode 100644 index 0000000000..0a7c1b01b2 --- /dev/null +++ b/Content.Shared/Clock/SharedClockSystem.cs @@ -0,0 +1,66 @@ +using System.Linq; +using Content.Shared.Examine; +using Content.Shared.GameTicking; + +namespace Content.Shared.Clock; + +public abstract class SharedClockSystem : EntitySystem +{ + [Dependency] private readonly SharedGameTicker _ticker = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + args.PushMarkup(Loc.GetString("clock-examine", ("time", GetClockTimeText(ent)))); + } + + public string GetClockTimeText(Entity ent) + { + var time = GetClockTime(ent); + switch (ent.Comp.ClockType) + { + case ClockType.TwelveHour: + return time.ToString(@"h\:mm"); + case ClockType.TwentyFourHour: + return time.ToString(@"hh\:mm"); + default: + throw new ArgumentOutOfRangeException(); + } + } + + private TimeSpan GetGlobalTime() + { + return (EntityQuery().FirstOrDefault()?.TimeOffset ?? TimeSpan.Zero) + _ticker.RoundDuration(); + } + + public TimeSpan GetClockTime(Entity ent) + { + var comp = ent.Comp; + + if (comp.StuckTime != null) + return comp.StuckTime.Value; + + var time = GetGlobalTime(); + + switch (comp.ClockType) + { + case ClockType.TwelveHour: + var adjustedHours = time.Hours % 12; + if (adjustedHours == 0) + adjustedHours = 12; + return new TimeSpan(adjustedHours, time.Minutes, time.Seconds); + case ClockType.TwentyFourHour: + return time; + default: + throw new ArgumentOutOfRangeException(); + } + } +} diff --git a/Resources/Locale/en-US/devices/clock.ftl b/Resources/Locale/en-US/devices/clock.ftl new file mode 100644 index 0000000000..6d0aef1eb7 --- /dev/null +++ b/Resources/Locale/en-US/devices/clock.ftl @@ -0,0 +1 @@ +clock-examine = The time reads: [color=white]{$time}[/color] diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index fac36ba710..b49fa383bc 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -170,6 +170,8 @@ prob: 0.20 - id: BarberScissors prob: 0.05 + - id: Wristwatch + prob: 0.05 - id: BookRandomStory prob: 0.1 # Syndicate loot diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 7d7d9697d2..00798b36e0 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -67,6 +67,7 @@ - ClothingHeadHatCowboyBountyHunter - ClothingNeckAutismPin - ClothingNeckGoldAutismPin + - WristwatchGold rareChance: 0.01 prototypes: - Lighter @@ -128,6 +129,7 @@ - ClothingShoesTourist - ClothingUniformJumpsuitLoungewear - ClothingHeadHatCowboyRed + - Wristwatch chance: 0.6 offset: 0.0 diff --git a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml new file mode 100644 index 0000000000..7fbb4aecf6 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml @@ -0,0 +1,59 @@ +- type: entity + id: Wristwatch + parent: BaseItem + name: wristwatch + description: A cheap watch for telling time. How much did you waste playing Space Station 14? + components: + - type: Sprite + sprite: Objects/Devices/wristwatch.rsi + layers: + - state: wristwatch + - map: [ "enum.ClockVisualLayers.MinuteHand"] + - map: [ "enum.ClockVisualLayers.HourHand"] + - type: Clock + - type: Item + sprite: Objects/Devices/wristwatch.rsi + size: Small + - type: Clothing + sprite: Objects/Devices/wristwatch.rsi + slots: + - gloves + - type: Appearance + - type: Damageable + damageContainer: Inorganic + - type: StaticPrice + price: 50 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageGroupTrigger + damageGroup: Brute + damage: 25 + behaviors: + - !type:DoActsBehavior + acts: [ "Breakage" ] + +- type: entity + id: WristwatchGold + parent: Wristwatch + name: gold watch + description: A fancy watch worth more than your kidney. It was owned by the notorious Syndicate mobster Vunibaldo "200 Pound Horse Meat Grinder" Frediani. + components: + - type: Sprite + sprite: Objects/Devices/goldwatch.rsi + layers: + - state: goldwatch + - map: [ "enum.ClockVisualLayers.MinuteHand"] + - map: [ "enum.ClockVisualLayers.HourHand"] + - type: Item + sprite: Objects/Devices/goldwatch.rsi + - type: Clothing + sprite: Objects/Devices/goldwatch.rsi + - type: StaticPrice + price: 500 #if you ever increase the price of kidneys, increase this too. diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/equipped-HAND.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..59522f6c12e86f2b7a6364c89a0d9a25bb3e8fef GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1GUw zi(^Q|oVT|O`4|I5+#V_iZsP7_4OlsqYcB7K(y)cWw;S@fmPVP1DQx8aB^dakWoE{+ zKk1C-?`u!4zV}v1pWy^I!zZSOJq!v+%=h{Xx4&+g)l>b2-MDRW>hgDUPFIHCUB~YC zbnew>5!L6G|6}@Kmvb@0Pk2xMX<>&rh6&;fPgof$8Syf=GA+1se)V&`L&eh*_Gr}o t3d(0a@cPo%GQlXu3rkS!2RfyiLA^yGryYJmM^L^(#=bn3K5&dQS7w~ThxPPf3CF6+Up_QedvgYyZ#HELMe?$PtS8Y2? zljE;xbl?T;Y;UK@@I4xhk5E}%1NA+4$M0P^y*(9=#^~~`K}SLy3FtVxE)`9h6uo_g zKF^k_CmxD)by2>{;Q2_J9K@}`5;dw)LaI_u+{h`wid;q8_i{={u3SLG{t`Fa4k5## z8QQ#Ujv`SH`TP-bO?&CozM51nCu{|P9QHDyB5&HU+9J=)KgfOlDoP{_788%IOwS~9 z#h2Rw$t?&o#}awI%j9PgHJ)RfNEA_ZU@_N(T`J}kfV|_!U^#%u%QEIMPJ|;IZFRt) zr#(o)7@PsSi>AV}qlG2#EQb z0$rF35}?V?S;WYFam^Mgtyn>!-kTI?K0t3rh$aS~P*Z(^-$5~Al>k^JND=P!iunl# z1c*A&tclldXr_>Qw%8qKaxG-YasxmiB4VF^PSsx#3yDV;ARse(L=JLq`Envf27uIE z;8s^33xO+ry>OyJ&5o$3bzhJaL=1@X*!F~Z9f0kK9ONZS-TVwrG6D;1UiD|%J!upZID_PNGp5Of2y$5+NY&($!mJ+^a_J3@1suQlCa;4i)!4F?n+(>uG@#(#BQ(%`oxI9+ zSskz*tvcM(nNjUA-VZe7>aYgB1)2=jIc!GM0CFx%R1PHo$aNE{%GrKx1&9l1uYhhc zx+Xx3sF8Enj>rMo839}&LXhip^g{<&gxU?Yr6c@oY5EF;d&nXdQk)5pd)bbGpWY2c z1P&xZg1-Lfd6J`(adkkaMaXs0dH7u5qyTLN2;@A_tCTlncbivZne%7J(~1eJ{y6mffknI@wr8A+3=s0Wg|ABlL zF|hz7h#Ixx^OH(TjGaMxoRB*b07yNQ`6~FH52*EMK84m8SJVeYIQ>uHSOB2Y(U5k+ ur2YZJ+GhI)hS(k4FNAzS0z?G;W_$tEs%t8vJoi2T0000mdKI;Vst0Pf`}!2kdN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_11.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_11.png new file mode 100644 index 0000000000000000000000000000000000000000..e364438e4ecd35612f8d36bd0210b081e8e5aee1 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpwp z;uumf=k3LdoD2pW%on-JTHe_&Q2vov$iaE&E>op|{Ue|%AZU=!YC-eXS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_2.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_2.png new file mode 100644 index 0000000000000000000000000000000000000000..87c642239fe1370c4a14745d559d81fdb8716ed6 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq9# z;uumf=k2+TybKCF%#KP2Io{YSC+ ihVTfs9qbT^EzEK^4LRmc+hjH!B;e`l=d#Wzp$P!(2__T( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_3.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_3.png new file mode 100644 index 0000000000000000000000000000000000000000..107b210ff4f3c9e0d121ec590091b896ba2918bd GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp?v z;uumf=k2+Tf(!y8E{S@5QFulkC`m%0QriXU5|5dy8{_S}HvH e!X+RJ7CgX|&A~F4?KMLLi0kR<=d#Wzp$PzNDkZr9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_4.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_4.png new file mode 100644 index 0000000000000000000000000000000000000000..c03f799fcce9cb94ff51072e22083ab1511e0e34 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp_w z;uumf=k3LfoD2#)E`iL2EZ^k~lp|b%b~Lc?J&Z3-l@phL1XKtCf7nmRM&=gJWGUbm jU&8$H57SMiyNqBdc6T$5ojc=SOMrNuu6{1-oD!M<`(-7z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_5.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_5.png new file mode 100644 index 0000000000000000000000000000000000000000..2835fadd249d0a84532950f44f547515a74f29d6 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq9# z;uumf=k3LdoIusC7g?ki{$(#|vFmZukn<>c&vJbE_D4Wv5O9zANzWF$H9QO6No-gj izOG>Ff&2PknNn`^0~|XKYR3KtaXnrAT-G@yGywp`$15cO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_6.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_6.png new file mode 100644 index 0000000000000000000000000000000000000000..55df41a9ce9fa78ca7b747f8b4a7369bde2092ca GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq3z z;uumf=k0}qoD2pWM=x-_<+xjapzp!Ka|#;riZdTf+&L6GPPMtR?7EOWm%Ouh`_db;|#taD0e0swhmDyIMd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_7.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/hours_7.png new file mode 100644 index 0000000000000000000000000000000000000000..890650474dfcf2593d48c0df4977ffc49a687cfb GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp+t z;uumf=k0k%UIqmLW=B0n&L83(EOPCwb+g)1t~)F*Zea#01A`yz7rvLQjWul0=6q14 i&m8mE=zt_h;s_)E*YzB8*#ms5B literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/inhand-left.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ec40991d4ecf42b62c9e4bfa358a24a938dface4 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1GCq zi(^Q|oVPdkaxyuJFgz6G*~)#8$;8NP3s17~YJ<%}+#Ag6t8Q3Zq^aE~kgw61y~p$u zlS3TC32uf;Mg@I_C#(&77$%4_fCZKHtM8qkfBW&?Bu8FW3t4lWwF?<;-+fxXFCxg9 z@mu@rMf3jew{t|%g4LYh7^~~EYL3kDWOx=exqpT+=Yg2)PlCm2j5D%*?UMZFE5Myl a)u10&EMok2KPwB+GYp=telF{r5}E*wty!l4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/inhand-right.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..aac69417e32f8656e2f87d013ae5b462f43879e4 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1Gy) zi(^Q|oVPc3^B!^#V7Tb0)S@>*gFz|D>6C)nVlE@Cg$z}XgPT%sHm0lXII(N$yfxls zy?YoYh%R{O_Nif2&v@5zx%wcbwNdTi`%h`Omrf z)2=8q{C&7<#r^;B{R-H$qL|mPQT)tSqxo6qG8%SK(L`hB}_edZJv0j59y g&3%q>5@G#$kEboFyt=akR{01#^=T>t<8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_1.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef2c831f4d7d9a213a9a7a9c20360607b94a848 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpto z;uumf=k0k%UIqmo7ROl)EPuFNoa9}d^{0Q?ygH$5{X?KC5a0~>sdcW`uwk>=fl7VG kJ6jpgRdYVzgUCs+*L?lWG50GM{~3^gr>mdKI;Vst0C#vP6951J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_10.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_10.png new file mode 100644 index 0000000000000000000000000000000000000000..3019a20a9ba454202f8ed338bcdfaafcc25aed05 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp_w z;uumf=k3Lfyg=11fu1ES-{mI=Y8Z%ZJL0zf=k=JAr!UU704fB52B8TLciui`!udd^ lj&o;KV@{(yBShv&18c-Yj-3}@i&TIFJYD@<);T3K0RSQ!D?R`K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_11.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_11.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbf039b6ffdc5668c29a95790386bf6c26e691f GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpto z;uumf=k29~yg=0~j-Fdse(PTlsz`XzaK2TdTw6l#%taZXIv@yOYMH-b>ssCgYgkUa l4%ObX(c#;7euxyqDLtp@96P_~zHkBwc)I$ztaD0e0s!chD@FhS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_2.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1304f56e757368d4d5d02aa54f405f34fa1b3259 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp+t z;uumf=k2+TybKCF%#KP2Io{YSC@ig3`BA%{(F6*2UngBb^DJB2_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_3.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8f58881dbda93e25a21ab56f6ab0baeea8616a4b GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpqn z;uumf=k2+Tf(!y8E{rVMPU3*p+{=*Ho b8Ns4DSugTe~DWM4f6_Y3a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_5.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_5.png new file mode 100644 index 0000000000000000000000000000000000000000..1d71f45c4791977ae15c34eea85bb396938222a4 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpto z;uumf=k2A7oIusC7g?ki{$oz?nOXl5b%|uY}?70No*bOBp+ON lUl)+i`2M{-P|Csj0ITK_j-Bsp%Jzd)db;|#taD0e0s!UED|!F` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_6.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_6.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1070e3a80454ab5edd53e2b7850b6c4fdfdc85 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp?v z;uumf=j}yDP6h=521kCAroYTm2iwyGrZ~^=HQ2CKg&n901U`r-oZYzSs|WKQjt3kC fzyBLPa0LlV+n-{Y%b>)p1>$(R`njxgN@xNA9D^j} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_7.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_7.png new file mode 100644 index 0000000000000000000000000000000000000000..4af1070d216a1a25590a53b6aa3f5a91b6413b18 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq9# z;uumf=k0k%UIqmo7ROm4oIk`nSmcf#s@3zI9Lu_S=PYKRGBB9IyrNwDTc=rrHs^y~ k(;3gHG`x;uvj9mq@IRl-F?X-$@-rZXp00i_>zopr00p@y8~^|S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_8.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_8.png new file mode 100644 index 0000000000000000000000000000000000000000..39b252688a78299da0303e13de4000e038bb8339 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpwp z;uumf=k2+JybJ;&E{;N87wQ|m3KXmgKDruJ-+VlKk{mx!83;V!KOj^4?)=uL0SC^0 i5PXpKgG0a&B;LSk{)1y~>B1A-AfBhIpUXO@geCw@bSf_Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_9.png b/Resources/Textures/Objects/Devices/goldwatch.rsi/minutes_9.png new file mode 100644 index 0000000000000000000000000000000000000000..b9614ed80f52a6292f44f8548ded905f170b710e GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp?v z;uumf=k2+Tf(!y8E{p=fS?83{1OQ`3CdB{% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/equipped-HAND.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..b12afe6d4eec194bee8911634e1060ccaa43b517 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1F_k zi(^Q|oVT|&avlm0aeJsNwV{|RI3mKjO?XG+EiKzjZxu4<9Ggo8nV{7=-Pi>MZof{k)S{$Rl^IG|~>AOD9 z@&C*Ep!UYB=WnaezHI)UTgilJ0Cr;?8QzFrUUt_tqny+1`ECFBSIrC+vAZ7Y9a3QU oCBpE8m7$W+A&y~!IGD*Ft0Yr#`1X`lKp!%Ay85}Sb4q9e08OoHO#lD@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_0.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3af9ca46343c1cc46a95181236029f45ffc7fcf1 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp_w z;uumf=j}yCP6h)G)AZ&ZIon oZP=CWkap_cc7|6F$%euMtesytPYVh}Tm*@Dy85}Sb4q9e0JbwN@c;k- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_10.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_10.png new file mode 100644 index 0000000000000000000000000000000000000000..aeac86265673b1c55070ac1237c027112df89691 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp&lJK6k>0|rH=Th;al2?&AV|Q|)z4*}Q$iB}{GTY9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_2.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_2.png new file mode 100644 index 0000000000000000000000000000000000000000..386166cabdd3578c61abb30fad6364611cdebaa7 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp(s z;uumf=j}O1UIqgWmV=Y7h{R237f-o(g-P+l&EI#5pU->B2vi3Gry5MW3#S)0ta|pp nuYyxRQ1_wHf@+A=0jmd$pXYF%-o3Xn4J6{}>gTe~DWM4f#O*FS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_3.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5300928f2e1fb8cd3ff0242ab69c5200ab4a26 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq6! z;uumf=k3LVoD2#)&KJe*9MRmhe)EitB6l4GTz~F-GK1Z-%o3;&0!}w{WGv1;_iX8p n!iFW5uO_`cQ7sOZX?V{dYd?b{?UiYaGf2SG)z4*}Q$iB}9d#~_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_4.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_4.png new file mode 100644 index 0000000000000000000000000000000000000000..c994c0568591ca8dac03794872c2421335f69bcc GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq0y z;uumf=k3LVoD2#)&Vj7cU+KxN-(9k%i(Py}tJ0sCqBG5FF3JE^f#cos8I85sQF77&b{w4G6F7t^>bP0l+XkKs;?;e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_7.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_7.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7af8e5cca4735e331a30cfa96e4bd7aba03ac4 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq6! z;uumf=k0k%UIqgWmV=Y7h{R237f%V~w(;UPxvp{c?sN;FGB9YcWe7dnF~QIwT-9OL p(jE2n@oXi%(;4S70%Z?aJYaO?=RE!C&gP9E#h$KyF6*2UngH6@Dn$SQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_8.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_8.png new file mode 100644 index 0000000000000000000000000000000000000000..83caf8c8e170e619de757651e787ddb190f0e2bb GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp(s z;uumf=k2+Jyg=0~j-EMPaT@(`8r;e3HZIAVzVCc~PNtt7s1OW3usehn*Snl3b(pnu lhdlpu#p=fS?83{1OTP2D8c{$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_9.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/hours_9.png new file mode 100644 index 0000000000000000000000000000000000000000..6334bb72fdc1733bc48f6078d32126779a1e23a4 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpto z;uumf=k2+Jyg=0~j-G2yMQQZMt!Roe*vOdN^y_Br-S^A3pJxOr1%n*Mm9vzSa?7Vb iXE4;Zw`ID+2N9p~=QhXbc(L6vAg-sYpUXO@geCy%Dk<{- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/inhand-left.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..76ca3c491159bfbe14fc4bbe0712376d010e8e9c GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;i~6 zi(^Q|oVPbO@;Vs`90*VjH1On7OOR?yW=dO_AZ8_C{lvZNjroDODXLfJPSj>7Vs%)@ za6*(}CzC=r!xOHC7{&=8!5Nls3isB$e}BHS_X|@R-)`G@12*fKQVBg9uYUgjnj1we zRs$@OUaT_y*<-u6LAh<6)#URxiai=a(?3a8|6+pM_Jy&ou2dxFroeASpvxINUHx3v IIVCg!0CAvI4gdfE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/inhand-right.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ab9c67d492e6bcbab2032582b09efd6aa0eb53 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;i5% zi(^Q|oVPbO@-i8U90*VjH1On7OOR?yW=dO_AZ8_?JjZXR(zn%%T{hLNs&`w*a6*(} zCzC=r!xOHC7{&?O3`MLCAi;#w508KSw0FO~y4WR_9Lt*OeF;2an=}tdB(MDV|1~$J z26R(yR38k~{v7$4H7R#yo2B5A_ZY@B z;uumf=k0k%UIqo8qXE+rvQ9Wkl&LXVIy0a4FUu6&bMB%HP#s7q)0;CkY1i0xWb=mJ tXDC14G2za1hFAL-PyH5hkcB9@z*lkX7LO7~v2YVez|+;wWt~$(695Z$EL8vi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_10.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_10.png new file mode 100644 index 0000000000000000000000000000000000000000..9dad0d83cbe85a64b02d8ee9a552d191ae753355 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>ZGJ z;uumf=k3Lfyg=11fgUkj#|sUvC$bzr_=4e>TjoF0@J~e|o_s*1An<@AL(niwwEVh= sL-^hHvpQk>8)Eh<Z4F z;uumf=k588yg=2gfgUkj#|sUvC$bzrxPwuw<=MKQZ+|<_Vg{-NDQ*xIj1IlcknXoq vi?yKKbaTaRrWHE8D=Pl8t^ipL1R3lxKg0McPTV$f0C7EC{an^LB{Ts5menmb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_2.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c3bbe7179bc4ac528d3d1c5c8ed342b7529a29 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCqC$ z;uumf=k2A9yg=2gfgUl(1S75$Cg|{LYh0XhCtu^es7a*_P$38$FgtK2t$g~zRpE@1 q=cEOt(%;%Tv@I?8{|_R~5U`ciU50ys$SWy#kcg+NpUXO@geCy3Eh>os literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_3.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6bfdc405c790914479d3f4582acb23b3840585cd GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp_w z;uumf=k2-OybKCF%z;W9d6ZKkk98hz;;OQ1dKR;D_w>up8G#DHK!^Fx-rjhnAk)pu k89a?wZ2l(q;2T7yf$!Zf_626eGc!SaPgg&ebxsLQ0QvkX`2YX_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_4.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_4.png new file mode 100644 index 0000000000000000000000000000000000000000..89c08f3396f0ff1bbfe620de16cadeda888989c7 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>Z4F z;uumf=k2A9yg=11fgUl(1S75$Cg||Ca%UtO%x{}C{qZatIiN}~XsBW^p1o7qX+FcZ uhb<-LlB>ceJQi0``C`{nB@0r}@ScJD`byq!byDHkAik%opUXO@geCw@EiDoN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_5.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_5.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbaa00d14b3d50aba0fe36ec3ee2468db228850 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>ZGJ z;uumf=j|m%UZ851z#BTrET^R0lV0{HBp1Kh&(i<6ONI}q4h#;|G8jw0TX&q{=1sOW vuZ^QQOarRLug}qMVetL>m=~zzf#m^~R||N*ZKyx9AEd+6)z4*}Q$iB}N<1$? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_6.png b/Resources/Textures/Objects/Devices/wristwatch.rsi/minutes_6.png new file mode 100644 index 0000000000000000000000000000000000000000..e834c52d8cd5aaaa10bbbd97c159e1cd82a8bafb GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq6! z;uumf=k29NP6h=Y=7SxHEcf$AXO4|Boy*)z@9UU+d{ t*t(DBhM-sW%k_+Xrdz!qwE|ItM6yeoWith n_j|*jLy8B4Jh|H$M47>|>_umJlzhUS9)ftDu6{1-oD!MIP)^@RCt{2S4(IUQ53yN%tErLXj|+;TN*N56cJn$>xT%{T|qa& zjkKbz6~RqFanVx62GlOQiK0TqjXMkOO2I*^;3A;XLK7Mq3#L>TQ-c)g=Q-zPUiv1P zU(<*PUKsA3_dDmF_n9}l=r7xU0^24q774P()`+QWb|FLcn?%<$Yra25V7M*F;2T>a z^lLF|OAdZJL_87TSsTE}78VW!Xk~4K$MyR2-A@$K;dirQd#@y12?)tW)&PdhZ|LCu zVjBR5STSDJVSjF8A{+?-ye=51C`ab?Ml3RYpafZYUoR@SDlo~`iN2&Qdv&aDjej$} z<^u_24>eXjs^ChXFF8ezuXb6Mf9gAJDib8cI~MMpIcF7Y2_zB;_CxngO-(d3F>Bf8 z?Zw-4L(|yk=x7N9B*cyhF>*Ca0sxQ2Vm!|0^R}Hun?j+$lF1||@ofAlTS^R++TgvX z_mZs&6$Avh0RH&uF71h&fpEr za&xaqiS|-j9jD{x2WeUdZ9fvF=@%os9QDm@r%ZjK(Wp;VRfYuM@$Q*`oINrJNW=aE z`l!9UUXeU6HxxQ-C?QmE1NEc;q(fyw^c(ju=HQ&O!tP61@MGmvP|>t|9be?QuJ zf5$G_~!uQ1Zs9Cr2E&X`=DaF3FAtJ>;Q@s2@?gXM3=6po>$c~sA|TAmimt}~y??`6+iz=%nuRh`+1LO8 N002ovPDHLkV1f$6lfVD~ literal 0 HcmV?d00001 From eb4ce85354c7c93da527bebca37cf986973f39a2 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sat, 13 Jul 2024 08:10:04 +0200 Subject: [PATCH 037/118] Remove imagesharp and StatusEffectAddedEvent from FlashOverlay (#28930) remove imagesharp and StatusEffectAddedEvent from FlashOverlay --- Content.Client/Flash/FlashOverlay.cs | 27 ++++++--------------------- Content.Client/Flash/FlashSystem.cs | 14 +++----------- 2 files changed, 9 insertions(+), 32 deletions(-) diff --git a/Content.Client/Flash/FlashOverlay.cs b/Content.Client/Flash/FlashOverlay.cs index 9ea00275e8..046be2aa62 100644 --- a/Content.Client/Flash/FlashOverlay.cs +++ b/Content.Client/Flash/FlashOverlay.cs @@ -1,27 +1,22 @@ using Content.Shared.Flash; using Content.Shared.Flash.Components; using Content.Shared.StatusEffect; -using Content.Client.Viewport; using Robust.Client.Graphics; -using Robust.Client.State; using Robust.Client.Player; using Robust.Shared.Enums; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using SixLabors.ImageSharp.PixelFormats; namespace Content.Client.Flash { public sealed class FlashOverlay : Overlay { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IClyde _displayManager = default!; - [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IGameTiming _timing = default!; - private readonly StatusEffectsSystem _statusSys; + private readonly StatusEffectsSystem _statusSys; public override OverlaySpace Space => OverlaySpace.WorldSpace; private readonly ShaderInstance _shader; @@ -56,20 +51,6 @@ protected override void FrameUpdate(FrameEventArgs args) PercentComplete = timeDone / lastsFor; } - public void ReceiveFlash() - { - if (_stateManager.CurrentState is IMainViewportState state) - { - // take a screenshot - // note that the callback takes a while and ScreenshotTexture will be null the first few Draws - state.Viewport.Viewport.Screenshot(image => - { - var rgba32Image = image.CloneAs(SixLabors.ImageSharp.Configuration.Default); - ScreenshotTexture = _displayManager.LoadTextureFromImage(rgba32Image); - }); - } - } - protected override bool BeforeDraw(in OverlayDrawArgs args) { if (!_entityManager.TryGetComponent(_playerManager.LocalEntity, out EyeComponent? eyeComp)) @@ -82,6 +63,11 @@ protected override bool BeforeDraw(in OverlayDrawArgs args) protected override void Draw(in OverlayDrawArgs args) { + if (RequestScreenTexture && ScreenTexture != null) + { + ScreenshotTexture = ScreenTexture; + RequestScreenTexture = false; // we only need the first frame, so we can stop the request now for performance reasons + } if (ScreenshotTexture == null) return; @@ -96,7 +82,6 @@ protected override void DisposeBehavior() { base.DisposeBehavior(); ScreenshotTexture = null; - PercentComplete = 1.0f; } } } diff --git a/Content.Client/Flash/FlashSystem.cs b/Content.Client/Flash/FlashSystem.cs index 9a0579f6aa..146d84b990 100644 --- a/Content.Client/Flash/FlashSystem.cs +++ b/Content.Client/Flash/FlashSystem.cs @@ -22,7 +22,6 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); - SubscribeLocalEvent(OnStatusAdded); _overlay = new(); } @@ -34,8 +33,8 @@ private void OnPlayerAttached(EntityUid uid, FlashedComponent component, LocalPl private void OnPlayerDetached(EntityUid uid, FlashedComponent component, LocalPlayerDetachedEvent args) { - _overlay.PercentComplete = 1.0f; _overlay.ScreenshotTexture = null; + _overlay.RequestScreenTexture = false; _overlayMan.RemoveOverlay(_overlay); } @@ -43,6 +42,7 @@ private void OnInit(EntityUid uid, FlashedComponent component, ComponentInit arg { if (_player.LocalEntity == uid) { + _overlay.RequestScreenTexture = true; _overlayMan.AddOverlay(_overlay); } } @@ -51,17 +51,9 @@ private void OnShutdown(EntityUid uid, FlashedComponent component, ComponentShut { if (_player.LocalEntity == uid) { - _overlay.PercentComplete = 1.0f; _overlay.ScreenshotTexture = null; + _overlay.RequestScreenTexture = false; _overlayMan.RemoveOverlay(_overlay); } } - - private void OnStatusAdded(EntityUid uid, FlashedComponent component, StatusEffectAddedEvent args) - { - if (_player.LocalEntity == uid && args.Key == FlashedKey) - { - _overlay.ReceiveFlash(); - } - } } From 044d84142c473ba91098dd23b85dc200c62d5765 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 13 Jul 2024 06:10:25 +0000 Subject: [PATCH 038/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index eb495bc316..ca549b51fb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: The item status menu has been moved to the side of the hands. There is - now one for each hand. - type: Add - - message: The item status menu fits with the rest of the HUD theme now. - type: Add - - message: Improved, fixed and otherwise added a bunch of item status menus. - type: Add - id: 6414 - time: '2024-04-21T13:16:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22986 - author: FairlySadPanda changes: - message: Xenoarchaeology Traversal Distorters have been rolled into the Artifact @@ -3823,3 +3811,10 @@ id: 6913 time: '2024-07-13T04:14:30.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29830 +- author: EmoGarbage404 + changes: + - message: Added wristwatches for telling time. + type: Add + id: 6914 + time: '2024-07-13T06:09:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29550 From 87f7ea8aa9758a5f718c5696e5c5e0d6bc995563 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 13 Jul 2024 06:11:14 +0000 Subject: [PATCH 039/118] make cargo balance ui updating its own component (#28295) * add BankClientComponent and event * query BankClient instead of hardcoded CargoOrderConsole for updating * add BankClient to all ordering consoles * :trollface: * add Balance field to BankClient * forgor Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> * m --------- Co-authored-by: deltanedas <@deltanedas:kde.org> Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> --- .../Cargo/Systems/CargoSystem.Orders.cs | 10 +++++++ Content.Server/Cargo/Systems/CargoSystem.cs | 14 +++++----- .../Cargo/Components/BankClientComponent.cs | 26 +++++++++++++++++++ .../Entities/Mobs/Player/admin_ghost.yml | 1 + .../Entities/Objects/Misc/paper.yml | 1 + .../Machines/Computers/computers.yml | 1 + 6 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 Content.Shared/Cargo/Components/BankClientComponent.cs diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index a288d7b07d..dd408755e6 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -40,6 +40,7 @@ private void InitializeConsole() SubscribeLocalEvent(OnOrderUIOpened); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(OnOrderBalanceUpdated); Reset(); } @@ -315,6 +316,15 @@ private void OnOrderUIOpened(EntityUid uid, CargoOrderConsoleComponent component #endregion + + private void OnOrderBalanceUpdated(Entity ent, ref BankBalanceUpdatedEvent args) + { + if (!_uiSystem.IsUiOpen(ent.Owner, CargoConsoleUiKey.Orders)) + return; + + UpdateOrderState(ent, args.Station); + } + private void UpdateOrderState(EntityUid consoleUid, EntityUid? station) { if (station == null || diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index a93a7bdcc2..1b33404e35 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -81,18 +81,18 @@ public override void Update(float frameTime) public void UpdateBankAccount(EntityUid uid, StationBankAccountComponent component, int balanceAdded) { component.Balance += balanceAdded; - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); - while (query.MoveNext(out var oUid, out var _)) + var ev = new BankBalanceUpdatedEvent(uid, component.Balance); + while (query.MoveNext(out var client, out var comp, out var xform)) { - if (!_uiSystem.IsUiOpen(oUid, CargoConsoleUiKey.Orders)) - continue; - - var station = _station.GetOwningStation(oUid); + var station = _station.GetOwningStation(client, xform); if (station != uid) continue; - UpdateOrderState(oUid, station); + comp.Balance = component.Balance; + Dirty(client, comp); + RaiseLocalEvent(client, ref ev); } } } diff --git a/Content.Shared/Cargo/Components/BankClientComponent.cs b/Content.Shared/Cargo/Components/BankClientComponent.cs new file mode 100644 index 0000000000..4fd7085503 --- /dev/null +++ b/Content.Shared/Cargo/Components/BankClientComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.Cargo; +using Robust.Shared.GameStates; + +namespace Content.Shared.Cargo.Components; + +/// +/// Makes an entity a client of the station's bank account. +/// When its balance changes it will have raised on it. +/// Other systems can then use this for logic or to update ui states. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedCargoSystem))] +[AutoGenerateComponentState] +public sealed partial class BankClientComponent : Component +{ + /// + /// The balance updated for the last station this entity was a part of. + /// + [DataField, AutoNetworkedField] + public int Balance; +} + +/// +/// Raised on an entity with when the bank's balance is updated. +/// +[ByRefEvent] +public record struct BankBalanceUpdatedEvent(EntityUid Station, int Balance); diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index a0eb01e03b..0c814e08f7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -69,6 +69,7 @@ - type: RadarConsole followEntity: true - type: CargoOrderConsole + - type: BankClient - type: CrewMonitoringConsole - type: GeneralStationRecordConsole canDeleteEntries: true diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 1c8d875488..5dbafa6416 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -548,6 +548,7 @@ tags: - Write - type: CargoOrderConsole + - type: BankClient - type: ActivatableUI verbText: qm-clipboard-computer-verb-text key: enum.CargoConsoleUiKey.Orders diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 3f9a9bc222..4baf9bb5dc 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -735,6 +735,7 @@ - map: ["computerLayerKeys"] state: tech_key - type: CargoOrderConsole + - type: BankClient - type: ActiveRadio channels: - Supply From ac768fe9f14ffd0ef0e64ebe717e5f4d459192a0 Mon Sep 17 00:00:00 2001 From: CaasGit <87243814+CaasGit@users.noreply.github.com> Date: Fri, 12 Jul 2024 23:12:57 -0700 Subject: [PATCH 040/118] fix(SharedGunSystem): Return and debug log on CreateEffect. (#29656) Sometimes CreateEffect is called on a Invalid Entity. This now causes that to check, thus returning out and printing some hopefully helpful logs to try to track down the real source of this issue. --- Content.Client/Weapons/Ranged/Systems/GunSystem.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.cs index ac5914d47c..7134227767 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.cs @@ -276,6 +276,14 @@ protected override void CreateEffect(EntityUid gunUid, MuzzleFlashEvent message, if (!Timing.IsFirstTimePredicted) return; + // EntityUid check added to stop throwing exceptions due to https://github.com/space-wizards/space-station-14/issues/28252 + // TODO: Check to see why invalid entities are firing effects. + if (gunUid == EntityUid.Invalid) + { + Log.Debug($"Invalid Entity sent MuzzleFlashEvent (proto: {message.Prototype}, user: {user})"); + return; + } + var gunXform = Transform(gunUid); var gridUid = gunXform.GridUid; EntityCoordinates coordinates; From 6c1d1057d5d45e49e8d4262c495219b89c1bcf38 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Sat, 13 Jul 2024 03:59:33 -0700 Subject: [PATCH 041/118] Replace DetachParentToNull() with DetachEntity() (#29992) DETACH PARENT TO ENTITY Co-authored-by: plykiya --- Content.Client/Materials/MaterialStorageSystem.cs | 4 ++-- Content.Client/Stack/StackSystem.cs | 2 +- Content.Shared/Actions/ActionContainerSystem.cs | 2 +- Content.Shared/Follower/FollowerSystem.cs | 2 +- .../Inventory/VirtualItem/SharedVirtualItemSystem.cs | 2 +- .../Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Content.Client/Materials/MaterialStorageSystem.cs b/Content.Client/Materials/MaterialStorageSystem.cs index edd07391f7..592471d673 100644 --- a/Content.Client/Materials/MaterialStorageSystem.cs +++ b/Content.Client/Materials/MaterialStorageSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Materials; +using Content.Shared.Materials; using Robust.Client.GameObjects; namespace Content.Client.Materials; @@ -49,7 +49,7 @@ public override bool TryInsertMaterialEntity(EntityUid user, { if (!base.TryInsertMaterialEntity(user, toInsert, receiver, storage, material, composition)) return false; - _transform.DetachParentToNull(toInsert, Transform(toInsert)); + _transform.DetachEntity(toInsert, Transform(toInsert)); return true; } } diff --git a/Content.Client/Stack/StackSystem.cs b/Content.Client/Stack/StackSystem.cs index c081581338..7e681aeba3 100644 --- a/Content.Client/Stack/StackSystem.cs +++ b/Content.Client/Stack/StackSystem.cs @@ -44,7 +44,7 @@ public override void SetCount(EntityUid uid, int amount, StackComponent? compone // TODO PREDICT ENTITY DELETION: This should really just be a normal entity deletion call. if (component.Count <= 0 && !component.Lingering) { - Xform.DetachParentToNull(uid, Transform(uid)); + Xform.DetachEntity(uid, Transform(uid)); return; } diff --git a/Content.Shared/Actions/ActionContainerSystem.cs b/Content.Shared/Actions/ActionContainerSystem.cs index 1c5a3ba0d9..1a83cf38e5 100644 --- a/Content.Shared/Actions/ActionContainerSystem.cs +++ b/Content.Shared/Actions/ActionContainerSystem.cs @@ -261,7 +261,7 @@ public void RemoveAction(EntityUid actionId, BaseActionComponent? action = null) if (action.Container == null) return; - _transform.DetachParentToNull(actionId, Transform(actionId)); + _transform.DetachEntity(actionId, Transform(actionId)); // Container removal events should have removed the action from the action container. // However, just in case the container was already deleted we will still manually clear the container field diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 8027ee449c..8c35617e2c 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -227,7 +227,7 @@ public void StopFollowingEntity(EntityUid uid, EntityUid target, FollowedCompone if (_netMan.IsClient) { - _transform.DetachParentToNull(uid, xform); + _transform.DetachEntity(uid, xform); return; } diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index 4a5894d895..cd0863ec88 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -244,7 +244,7 @@ public void DeleteVirtualItem(Entity item, EntityUid user) if (TerminatingOrDeleted(item)) return; - _transformSystem.DetachParentToNull(item, Transform(item)); + _transformSystem.DetachEntity(item, Transform(item)); if (_netManager.IsServer) QueueDel(item); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs index adae26a223..d6f45ba77d 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs @@ -108,7 +108,7 @@ private void UseChambered(EntityUid uid, ChamberMagazineAmmoProviderComponent co else { // Similar to below just due to prediction. - TransformSystem.DetachParentToNull(chamberEnt.Value, Transform(chamberEnt.Value)); + TransformSystem.DetachEntity(chamberEnt.Value, Transform(chamberEnt.Value)); } } From 87c82ff114fa0b213b561cd7c93c0855e55cc359 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Sat, 13 Jul 2024 04:50:21 -0700 Subject: [PATCH 042/118] Update SpawnAfterInteractSystem.cs to not use Component.Owner (#29968) * Update SpawnAfterInteractSystem.cs * what the fuck is that condition --------- Co-authored-by: plykiya --- .../Engineering/EntitySystems/SpawnAfterInteractSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs index 281bbc4721..8391e8faad 100644 --- a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs +++ b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs @@ -65,8 +65,8 @@ bool IsTileClear() EntityManager.SpawnEntity(component.Prototype, args.ClickLocation.SnapToGrid(grid)); - if (component.RemoveOnInteract && stackComp == null && !((!EntityManager.EntityExists(uid) ? EntityLifeStage.Deleted : EntityManager.GetComponent(component.Owner).EntityLifeStage) >= EntityLifeStage.Deleted)) - EntityManager.DeleteEntity(uid); + if (component.RemoveOnInteract && stackComp == null) + TryQueueDel(uid); } } } From 1b0c434a9fa12ebdeadc2ace8e3f7b6f1a39651f Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sat, 13 Jul 2024 15:15:57 +0300 Subject: [PATCH 043/118] Shiny Diamonds (#25750) * shiny * add * reresprite * rereresprite * Add files via upload * Update ore.yml --- .../Locale/en-US/materials/materials.ftl | 2 + .../Locale/en-US/salvage/salvage-magnet.ftl | 1 + .../Entities/Objects/Materials/materials.yml | 13 ++ .../Entities/Objects/Materials/ore.yml | 31 ++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Entities/Structures/Walls/asteroid.yml | 155 +++++++++++++++++- .../Entities/World/Debris/asteroids.yml | 3 + .../Prototypes/Procedural/Magnet/asteroid.yml | 1 + .../Procedural/biome_ore_templates.yml | 14 ++ .../Prototypes/Procedural/salvage_loot.yml | 7 + .../Prototypes/Reagents/Materials/ores.yml | 9 + Resources/Prototypes/Recipes/Lathes/sheet.yml | 7 + Resources/Prototypes/Stacks/Materials/ore.yml | 7 + Resources/Prototypes/ore.yml | 6 + .../materials.rsi/diamond-inhand-left.png | Bin 223 -> 236 bytes .../materials.rsi/diamond-inhand-right.png | Bin 231 -> 244 bytes .../Materials/materials.rsi/diamond.png | Bin 297 -> 255 bytes .../Materials/materials.rsi/diamond_2.png | Bin 0 -> 345 bytes .../Materials/materials.rsi/diamond_3.png | Bin 0 -> 419 bytes .../Objects/Materials/materials.rsi/meta.json | 6 + .../Objects/Materials/ore.rsi/diamond.png | Bin 0 -> 390 bytes .../Objects/Materials/ore.rsi/meta.json | 5 +- .../Structures/Walls/rock.rsi/meta.json | 18 +- .../Walls/rock.rsi/rock_diamond.png | Bin 1307 -> 1916 bytes 24 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 Resources/Textures/Objects/Materials/materials.rsi/diamond_2.png create mode 100644 Resources/Textures/Objects/Materials/materials.rsi/diamond_3.png create mode 100644 Resources/Textures/Objects/Materials/ore.rsi/diamond.png diff --git a/Resources/Locale/en-US/materials/materials.ftl b/Resources/Locale/en-US/materials/materials.ftl index a354423d2b..0fc716bda5 100644 --- a/Resources/Locale/en-US/materials/materials.ftl +++ b/Resources/Locale/en-US/materials/materials.ftl @@ -25,6 +25,7 @@ materials-meat = meat materials-web = silk materials-bones = bone materials-coal = coal +materials-diamond = diamond materials-gunpowder = gunpowder # Ores @@ -36,3 +37,4 @@ materials-raw-plasma = raw plasma materials-raw-uranium = raw uranium materials-raw-bananium = raw bananium materials-raw-salt = raw salt +materials-raw-diamond = raw diamond diff --git a/Resources/Locale/en-US/salvage/salvage-magnet.ftl b/Resources/Locale/en-US/salvage/salvage-magnet.ftl index 7ce2a486de..c60bafcc13 100644 --- a/Resources/Locale/en-US/salvage/salvage-magnet.ftl +++ b/Resources/Locale/en-US/salvage/salvage-magnet.ftl @@ -13,6 +13,7 @@ salvage-magnet-resources = {$resource -> [OreQuartz] Quartz [OreSalt] Salt [OreGold] Gold + [OreDiamond] Diamond [OreSilver] Silver [OrePlasma] Plasma [OreUranium] Uranium diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index c4de4bb18f..a3fc4a2774 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -350,8 +350,21 @@ components: - type: Stack stackType: Diamond + baseLayer: base + layerStates: + - diamond + - diamond_2 + - diamond_3 - type: Sprite state: diamond + layers: + - state: diamond + map: ["base"] + - type: StaticPrice + price: 0 + - type: StackPrice + price: 500 + - type: Appearance - type: Item heldPrefix: diamond - type: Extractable diff --git a/Resources/Prototypes/Entities/Objects/Materials/ore.yml b/Resources/Prototypes/Entities/Objects/Materials/ore.yml index bf7dbfad5a..136d20cc81 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/ore.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/ore.yml @@ -66,6 +66,37 @@ - type: Stack count: 1 +- type: entity + parent: OreBase + id: DiamondOre + name: diamond ore + suffix: Full + components: + - type: Stack + stackType: DiamondOre + - type: Sprite + state: diamond + - type: Material + - type: PhysicalComposition + materialComposition: + RawDiamond: 500 + - type: Extractable + grindableSolutionName: diamondore + - type: SolutionContainerManager + solutions: + diamondore: + reagents: + - ReagentId: Carbon + Quantity: 20 + +- type: entity + parent: DiamondOre + id: DiamondOre1 + suffix: Single + components: + - type: Stack + count: 1 + - type: entity parent: OreBase id: SteelOre diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 67cf6f767d..66f4f684e9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -1175,6 +1175,7 @@ - IngotGold30 - IngotSilver30 - MaterialBananium10 + - MaterialDiamond - type: entity parent: OreProcessor diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml index e14bf26e0d..c0a30e7669 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml @@ -93,6 +93,28 @@ state: rock_asteroid_west - state: rock_gold +- type: entity + id: AsteroidRockDiamond + parent: AsteroidRock + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_diamond + - type: entity id: AsteroidRockPlasma parent: AsteroidRock @@ -693,6 +715,28 @@ state: rock_west - state: rock_gold +- type: entity + id: WallRockDiamond + parent: WallRock + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_diamond + - type: entity id: WallRockPlasma parent: WallRock @@ -993,6 +1037,28 @@ state: rock_wall_west - state: rock_gold +- type: entity + id: WallRockBasaltDiamond + parent: WallRockBasalt + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_diamond + - type: entity id: WallRockBasaltPlasma parent: WallRockBasalt @@ -1236,6 +1302,28 @@ state: rock_snow_west - state: rock_gold +- type: entity + id: WallRockSnowDiamond + parent: WallRockSnow + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_diamond + - type: entity id: WallRockSnowPlasma parent: WallRockSnow @@ -1479,6 +1567,28 @@ state: rock_sand_west - state: rock_gold +- type: entity + id: WallRockSandDiamond + parent: WallRockSand + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_diamond + - type: entity id: WallRockSandPlasma parent: WallRockSand @@ -1589,7 +1699,6 @@ state: rock_sand_west - state: rock_uranium - - type: entity id: WallRockSandBananium parent: WallRockSand @@ -1722,6 +1831,28 @@ state: rock_chromite_west - state: rock_gold +- type: entity + id: WallRockChromiteDiamond + parent: WallRockChromite + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_diamond + - type: entity id: WallRockChromitePlasma parent: WallRockChromite @@ -1965,6 +2096,28 @@ state: rock_andesite_west - state: rock_gold +- type: entity + id: WallRockAndesiteDiamond + parent: WallRockAndesite + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_diamond + - type: entity id: WallRockAndesitePlasma parent: WallRockAndesite diff --git a/Resources/Prototypes/Entities/World/Debris/asteroids.yml b/Resources/Prototypes/Entities/World/Debris/asteroids.yml index 061288d010..2817b083be 100644 --- a/Resources/Prototypes/Entities/World/Debris/asteroids.yml +++ b/Resources/Prototypes/Entities/World/Debris/asteroids.yml @@ -32,6 +32,9 @@ - id: WallRockGold prob: 0.05 orGroup: rock + - id: WallRockDiamond + prob: 0.005 + orGroup: rock - id: WallRockSilver prob: 0.05 orGroup: rock diff --git a/Resources/Prototypes/Procedural/Magnet/asteroid.yml b/Resources/Prototypes/Procedural/Magnet/asteroid.yml index c20b80af55..c380dfbc7c 100644 --- a/Resources/Prototypes/Procedural/Magnet/asteroid.yml +++ b/Resources/Prototypes/Procedural/Magnet/asteroid.yml @@ -6,6 +6,7 @@ OreCoal: 1.0 OreSalt: 1.0 OreGold: 0.25 + OreDiamond: 0.05 OreSilver: 0.25 OrePlasma: 0.15 OreUranium: 0.15 diff --git a/Resources/Prototypes/Procedural/biome_ore_templates.yml b/Resources/Prototypes/Procedural/biome_ore_templates.yml index 4a60427e30..a6e5fac2d8 100644 --- a/Resources/Prototypes/Procedural/biome_ore_templates.yml +++ b/Resources/Prototypes/Procedural/biome_ore_templates.yml @@ -130,6 +130,20 @@ maxGroupSize: 10 radius: 4 +- type: biomeMarkerLayer + id: OreDiamond + entityMask: + AsteroidRock: AsteroidRockDiamond + WallRock: WallRockDiamond + WallRockBasalt: WallRockBasaltDiamond + WallRockChromite: WallRockChromiteDiamond + WallRockSand: WallRockSandDiamond + WallRockSnow: WallRockSnowDiamond + maxCount: 6 + minGroupSize: 1 + maxGroupSize: 2 + radius: 4 + # Artifact Fragment - type: biomeMarkerLayer id: OreArtifactFragment diff --git a/Resources/Prototypes/Procedural/salvage_loot.yml b/Resources/Prototypes/Procedural/salvage_loot.yml index e8783760dd..da99da7c75 100644 --- a/Resources/Prototypes/Procedural/salvage_loot.yml +++ b/Resources/Prototypes/Procedural/salvage_loot.yml @@ -178,6 +178,13 @@ - !type:BiomeMarkerLoot proto: OreBananium +- type: salvageLoot + id: OreDiamond + guaranteed: true + loots: + - !type:BiomeMarkerLoot + proto: OreDiamond + - type: salvageLoot id: OreArtifactFragment guaranteed: true diff --git a/Resources/Prototypes/Reagents/Materials/ores.yml b/Resources/Prototypes/Reagents/Materials/ores.yml index 18f1d9ebb3..1555ab9e23 100644 --- a/Resources/Prototypes/Reagents/Materials/ores.yml +++ b/Resources/Prototypes/Reagents/Materials/ores.yml @@ -24,6 +24,15 @@ color: "#FFD700" price: 0.2 +- type: material + id: RawDiamond + stackEntity: DiamondOre1 + name: materials-raw-diamond + unit: materials-unit-piece + icon: { sprite: Objects/Materials/ore.rsi, state: diamond } + color: "#C9D8F2" + price: 0.5 + - type: material id: RawSilver stackEntity: SilverOre1 diff --git a/Resources/Prototypes/Recipes/Lathes/sheet.yml b/Resources/Prototypes/Recipes/Lathes/sheet.yml index 053715a181..3efaac95a7 100644 --- a/Resources/Prototypes/Recipes/Lathes/sheet.yml +++ b/Resources/Prototypes/Recipes/Lathes/sheet.yml @@ -127,6 +127,13 @@ materials: RawBananium: 3000 +- type: latheRecipe + id: MaterialDiamond + result: MaterialDiamond1 + completetime: 3 + materials: + RawDiamond: 1000 + - type: latheRecipe id: SheetUranium1 result: SheetUranium1 diff --git a/Resources/Prototypes/Stacks/Materials/ore.yml b/Resources/Prototypes/Stacks/Materials/ore.yml index 51254b5a7a..3aaa04601a 100644 --- a/Resources/Prototypes/Stacks/Materials/ore.yml +++ b/Resources/Prototypes/Stacks/Materials/ore.yml @@ -4,6 +4,13 @@ icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: gold } spawn: GoldOre1 maxCount: 30 + +- type: stack + id: DiamondOre + name: rough diamond + icon: { sprite: /Textures/Objects/Materials/ore.rsi, state: diamond } + spawn: DiamondOre1 + maxCount: 30 - type: stack id: SteelOre diff --git a/Resources/Prototypes/ore.yml b/Resources/Prototypes/ore.yml index 84d1c66736..146f04b49c 100644 --- a/Resources/Prototypes/ore.yml +++ b/Resources/Prototypes/ore.yml @@ -58,6 +58,12 @@ minOreYield: 1 maxOreYield: 3 +- type: ore + id: OreDiamond + oreEntity: DiamondOre1 + minOreYield: 1 + maxOreYield: 2 + - type: ore id: OreQuartzCrab oreEntity: MobSpawnCrabQuartz diff --git a/Resources/Textures/Objects/Materials/materials.rsi/diamond-inhand-left.png b/Resources/Textures/Objects/Materials/materials.rsi/diamond-inhand-left.png index c9b55e9daa52ea2f352f43917ffa03611e0c5512..9eae45d039abc1b118d047edae3ca52f3b28bb1f 100644 GIT binary patch delta 59 zcmcc5_=a(U3KwH>kh>GZx^prwCn}2ZTki6(^2$hD_K{2WaO4v0iEeGe?YVjOf1)Nc O0D-5gpUXO@geCxoViiyT delta 48 zcmaFEc%N~C%0xq9ep@RKE3b^iWgod@4@)jFo*3LFoS&QbXX>LG1|aZs^>bP0l+XkK DuM!c9 diff --git a/Resources/Textures/Objects/Materials/materials.rsi/diamond-inhand-right.png b/Resources/Textures/Objects/Materials/materials.rsi/diamond-inhand-right.png index 295c2c4eca1dddeb5fb91200177af77b78a76710..3353eb6f7caea4fa57c518ff3ecf7cf12666714b 100644 GIT binary patch delta 198 zcmaFP_=RzT3KwH>kh>GZx^prwCn}27%jgKX6`nSk64_`t$2CGx_imuV5|LvZ4?QX` z{tw;Oy}bD0DRo8$2#9mredSv8x9n$Eq`pjOdwMf)mY(L^|0lNZTK)FvzvySq*%8x9 zrmJ~cc^+Qtd|+#8=^2|_soQLC_kCg6l_vLA=;^0?L1Sj9Squ!(!W)e*7=GF)A0WKd u_`;<(>{n8bzUC{8E3e3uG-+TMTV zR(fX6Tcg|aa^0(#VvW;xyX^cEeB=z&ECz-H*IeH4Y%$#PhW(1mTb?Z@zZp#zKPqM0 k)pbMiMc@B&h6D9Gn3pWeUD_Nmi4mm9)78&qol`;+04q0CTL1t6 diff --git a/Resources/Textures/Objects/Materials/materials.rsi/diamond.png b/Resources/Textures/Objects/Materials/materials.rsi/diamond.png index 5eb8aabf8796f2a3b5ffce29119ea1b73dbdbb9b..8b39437d0ac358f85f04f69f9a743c0325c6dbc9 100644 GIT binary patch delta 239 zcmV+v2VHk$7F-7iz zT59IzT#MrJ6M&|NsAn|Nr~{|9}7g|C#^)&;S2_|NsB_|Nj^K|L<^4gdeDmrzFTP znBl;G5CD@C)eo!&inn>XIEGZrNlvJjxYH0A5FpU1pOTZ)qN5}8v;Z{M6MdNaCi9S$K>qUP^%Twzu?oMZ=a4G?J8i*bPP;Q4t31j!H_&b>4K~m zhqGi$x`cGJk6Xm)0~uj)acvt|max1qU`%0jGY(;OP@T*gz$zhbw1APZgz*;>LyK^% W=;V3o>MMY5V(@hJb6Mw<&;$V4^l+vC diff --git a/Resources/Textures/Objects/Materials/materials.rsi/diamond_2.png b/Resources/Textures/Objects/Materials/materials.rsi/diamond_2.png new file mode 100644 index 0000000000000000000000000000000000000000..410d83f1c29f1e958fb38d3c0594d059846ffe0e GIT binary patch literal 345 zcmV-f0jBPx$6G=otR9J=Wlrc`jFcgNr07481b?b)8#)fYY#Kcv&1-Hm;Ah|&V3tL&cv_k6s zGuTE}sFY_y>45(wvJ>n3{GMYdDJl8yseZb!k=n6u9;)hgF9MC!uAr`g#g6yyKnKjB z8LgbnrVCF8^vQf2ci&b_5E$&@<_b6m*1%JkycPx$T}ebiR9J=Wls!(vKoo?(MF^#!h@hZD$pyeCz!nu(am5w5h3`Q{1@;XhXwoHZ znvfz5)lhg%R>t<)`B92^Bx}9veV*BQ?=AG`(c{!%whc_A)VC)#COU|KL`oMBhQO%e z`y9xC8_0Yj&UPUWELoX60775^q0g!Ft^x{Vb_{@tvtG=ze-T>>s5rs>7`OzMz&r3* z+7LKGrn?Aeo9i`j>yS_EGiXr*wF1hyo|Ht)$sHI2E8qvX243xakPlvXQ&5-dCGbUF zY!4N2a~Ni}2%B7J?1B(@w&aC~phUiFC)7F+8xz^Ua0Cq5IIys(5(|%-Gs3*(VKO2MgDRD+0!h&1O&fMX zBBd{q+@eaPbS7yg>08o=r1GA*gdL6C6>&839zA+&i(e?myS|8_8-D-* N002ovPDHLkV1hl2wF>|M literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Materials/materials.rsi/meta.json b/Resources/Textures/Objects/Materials/materials.rsi/meta.json index 78f497c0cd..3ae12dc14c 100644 --- a/Resources/Textures/Objects/Materials/materials.rsi/meta.json +++ b/Resources/Textures/Objects/Materials/materials.rsi/meta.json @@ -78,6 +78,12 @@ { "name": "diamond" }, + { + "name": "diamond_2" + }, + { + "name": "diamond_3" + }, { "name": "diamond-inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Materials/ore.rsi/diamond.png b/Resources/Textures/Objects/Materials/ore.rsi/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a3c788d34c3190e6ff143d2b0cc324597bad94 GIT binary patch literal 390 zcmV;10eSw3P)Px$KuJVFR9J=Wl(9<0KoExih!1epam8)g%X$!NjkqZ+?Cllod<9=5*XJb!3wK2X zOD(eHL8=gtq_7{G+jTt1Og){h-5(|$7t;P6ifNlOA8?n z08s(T&Aa4z{;TGmj{z-&)I!*9F@SSGxVi0`oly`;MMNDD@ie2OvkT&BW@E+@x_@{f zQ#W)qUMq+J93P%wGMxbcCezus`1%1z_GZSeg1WK9_Qw!wU{#2uhKJPb!l3C0pyZ|(wP3GpU2GIZ9Ke6)0cT606jQbG zQRE{KAT|iZ_@G97B0gzCOpGRgkw7Q`%SZ6l2Oq$|gAhqffCr;S6MPb5jF`ZKsjL#K zk#Cfb3YCwP%k_G_?%nR*+}_MDxomE)z2EH2?0?MO&VOdXVzF4_!(I`w zev8E~n>stS))>?M7E6Wj>dBJ@pGsTq+zIXU)8!X&k|Iv(HRq&=I4Kb)8Kysxyet=sIk%a_htLt10Dw?fk9v(kytiZ3cu@~3`_&6fL@>-=o%{x ze*J+nIv?A*yMN`Qnwp{=K{6nyKf}EkSPHBL4g|!tc3PqiTMl{a#horGctC_x)P;^Mccm?e|>(ue^|AZ*A?c zf8Koi_NWE2p`#;cVGW|%`~yH&ZG9Clr*549_5lxo!3h1H`!K56>60Z{RYe>jR!gH9KA(@G;OzNPR%r761%oL^Z0-ACIc} z{}N&5XSuzLfF-DA=OA#3kTM_2ya1s1-vJ@Ii@pplDeG_C(0bD;O23Gc@Lpm2L%R&^ z>FMF!_I7QB5T!qnSSH>}hu>0;e64w8$SD68B7gE}d-1{@>2#pP8smTC^y!>`_@jud zY;E=RCA$LD4AcFVxbpsqeyyc$wEvx}SG69z>3&}v)Z8wb?zdPf2;G-iru!`xi^XCv zy5r+b_gmtI?)Z4q{T54wVCwvUlKb~$_43{X1revZkO>M$MdYh)ku{eu7nF!>f3d{X zKYt82^Xo*M#UjpfcU$MT5Vm!9YwdvI;2$;6NN0S$N#qO6(ixv08L{!ZZT@l*r&Ywc z^!tD3jc><|mY!Ki?UkGd_O=8s;aI#P6pMD0zIoN#qSr*BPI0 z3S-U>&>5d^DS%3z9}uPA&JU;%zopa|6@Q3&Px&>bIdy5C}{ z5R8e>*X`FGA8)!pRN@eyU&($;ITD-r{BrYGYJ7fN{QQukb1G$gzUh98#bPOE;(r>S zuiGEm{D5>%59{08rO+AmVWB%dzgT}Lk1&bVqdv-vqR#*?K0a$k{fodS?sfq%IjS?E zQsxKvDu7(^@v9y_aMPPnzXaG0%yhRyPn(M(K7Z9H4;&2?pC5uh7y10d3ShMO_{V`G z*M1r8JG`gPtpz6DU}8Nmk&LI!?SHDS_LbNo{X>X2vYVwN3ZYbf$Q`(q&mXuC5OGq# zJXEu@9hLb#z;56;a6XY()*sYUKzbyRSXTCr=kf^SDrn$?pBMdsdcfIk;EKCFh3be0 zLU80IGd^EO=4+oH5OiIkp#G>GDTPziX?)Z4q{T7SGVt+9h-SP32 z=8w%ilR}8oGHaoYh-KpbDxM(XRBh?(lv0k4WsFbE0~URFcSau(j!TS|2Jf!GSjQjw z8Q{vQP%G_D0PX`ff!?TVVb2^Ygf0rd%Q#e_&jhx9(_6n1weI#zMpjIFg?|*krBl;UwQ^{L zE<%42)$BC?#f%m6k`ws+)}$4v3NSvGdqe@W6foAAgF#fAzwsIVIeU%));xCaEU?kt zKW6(I(BF${^V3gq`&w7xKF?P7Ujx$a{@$_D5W?|40QN29>amM5z?)O=9V27C?d*RD zwG+H}uFY1oGvCCs_rcBq}O z`{iCt&}HCtcRQ5%5y$6up)$D@*n_(I*h5CqBO9i3(GRt(oC1m~wF?fKdtyPz}00000NkvXXu0mjfAd}HG literal 1307 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq&N#aB8wRq_>O=u<5X=vX$A(C zvz{)FAr*7p&OPWI;wW=GUD3cNXrkAIv(0isO?=N(KP-`3Rb28ig`>11DCm>EfXS8@ z0RoaC0vC7gdanCfOybGWGXYK^1*-m+`wV}TeLs1wI{#Vi{p#O;n>Os;@q6aa+WY6; zoI5w&QcYt;21A4i!V>*DHOyyPq~y?guCr2bj6*2FYMJ`I;Jh@JD)y+&=;f)D*iuiw<< z*tmC(PW-m*()Qc0{SamAiJ0|ty-57?f9L!boKv5v|1^B&=~$CG-QazfEgvL0H*e)M z$Y9L*Bx>y=?ek-!{~_~f)1J&ecg~@eGnzrV=Ipn7{g>K`_HAV3xBEY}TKwA)pXB5v zOf98VB3#b_O+kfmzYiY+{^po^;%)(osU)h_wC-PDQ|B6+w94=U%P6m zp7}gcbSMoejrjQcsQJUUJF@qst-d{Lz5Mp0=4J^8(u=IP)}<`|5w%O;X?Uzm&DnS2 z-0a_TKLvkw)p>P8erj&=zmLILJPxO?vL>8uh|bRb6q&94M$1?G{w&5;Cr6&O>rOq- z&7GjMWNQA|hU>Dj7ebG3`Q$A9A31>g2Cq z7kbYc?LX4+y1V;RYKmAH8;@ndi4EY+#ap@ZC_`FSS?xMuXvp+m_iie2xhh88!e@!5Q|3pU8Ml%fTc&hBN6< zY%bR{;rHjmTD&#N%s@u2cIKZ|Yzp6>SGS&0-|;Nmlwqg+eeDptgQoX0IGo;{zwY!* zIObEYdg7CRe{{Ocp18XG8oK9#*+c1Zs zCoNne;CXL;{^b4Vo#x6f_ILaHq*M9azK&3iBEK44-F0vGH8~ANvg=4*z60a%#o&xh-ZP$=0XY zHGX_3TfUWv<>Bi`+W&kWPnv4Bq;dA(F^(@tY?vJ_x`KxT% z#SS;zrr3*J|MzDxmq5DRfhGTEo@4(Z+VHbs!mDIEh1tJ9U#wZz*5t~3068r@|H+tO zcOK~U$~s_td Date: Sat, 13 Jul 2024 12:17:05 +0000 Subject: [PATCH 044/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ca549b51fb..e4c8aa1b43 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,18 +1,4 @@ Entries: -- author: FairlySadPanda - changes: - - message: Xenoarchaeology Traversal Distorters have been rolled into the Artifact - Analyzers to make artifact gameplay a bit more controlled. - type: Tweak - - message: The T2 Abnormal Artifact Manipulation tech has been made cheaper to compensate - for losing an unlock. - type: Tweak - - message: The Xenoarchaeology guidebook entry has been rewritten to be more useful - and comprehensive for newbies. - type: Tweak - id: 6415 - time: '2024-04-21T16:09:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26545 - author: deltanedas changes: - message: Flaming mice no longer completely engulf people they touch. @@ -3818,3 +3804,12 @@ id: 6914 time: '2024-07-13T06:09:19.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29550 +- author: TheShuEd + changes: + - message: Added diamonds ore! + type: Add + - message: Diamonds can now be sold at a bargain price. + type: Add + id: 6915 + time: '2024-07-13T12:15:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25750 From dcb3443b352ac6004886ab6eedf3a0fe3388b707 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sat, 13 Jul 2024 15:45:35 +0300 Subject: [PATCH 045/118] Vgroid diamonds hotfix (#29999) vgroid diamonds --- .../Entities/Structures/Walls/asteroid.yml | 22 +++++++++++++++++++ Resources/Prototypes/Procedural/vgroid.yml | 6 +++++ 2 files changed, 28 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml index c0a30e7669..4673405e03 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml @@ -611,6 +611,28 @@ state: ironrock_west - state: rock_artifact_fragment +- type: entity + id: IronRockDiamond + parent: IronRock + description: An ore vein rich with diamonds. + suffix: Diamond + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_diamond + # Rocks and ore veins - type: entity id: WallRock diff --git a/Resources/Prototypes/Procedural/vgroid.yml b/Resources/Prototypes/Procedural/vgroid.yml index 49e956e73f..6e9fc6f395 100644 --- a/Resources/Prototypes/Procedural/vgroid.yml +++ b/Resources/Prototypes/Procedural/vgroid.yml @@ -82,6 +82,12 @@ count: 50 minGroupSize: 2 maxGroupSize: 4 + - !type:OreDunGen + replacement: IronRock + entity: IronRockDiamond + count: 15 + minGroupSize: 1 + maxGroupSize: 2 # Configs - type: dungeonConfig From bf4ef62ab3a5be3ecd8aa2ff259622070c8bca32 Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sat, 13 Jul 2024 19:45:34 +0300 Subject: [PATCH 046/118] Update RadiationPulseOverlay.cs to have 0 warnings (#30004) --- Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs index 8d5607af2d..9ec24fae0e 100644 --- a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs @@ -116,7 +116,9 @@ private void RadiationQuery(IEye? currentEye) var shaderInstance = _pulses[pulseEntity]; shaderInstance.instance.CurrentMapCoords = _transform.GetMapCoordinates(pulseEntity); shaderInstance.instance.Range = pulse.VisualRange; - } else { + } + else + { _pulses[pulseEntity].shd.Dispose(); _pulses.Remove(pulseEntity); } @@ -129,7 +131,7 @@ private bool PulseQualifies(EntityUid pulseEntity, MapCoordinates currentEyeLoc) var transformComponent = _entityManager.GetComponent(pulseEntity); var transformSystem = _entityManager.System(); return transformComponent.MapID == currentEyeLoc.MapId - && transformComponent.Coordinates.InRange(_entityManager, transformSystem, EntityCoordinates.FromMap(transformComponent.ParentUid, currentEyeLoc, transformSystem, _entityManager), MaxDist); + && transformSystem.InRange(transformComponent.Coordinates, transformSystem.ToCoordinates(transformComponent.ParentUid, currentEyeLoc), MaxDist); } private sealed record RadiationShaderInstance(MapCoordinates CurrentMapCoords, float Range, TimeSpan Start, float Duration) From 5e800e0ece7beadeb06bba901dd573e84fa4c133 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 13 Jul 2024 19:34:17 +0200 Subject: [PATCH 047/118] New CDN publish workflow (#30009) * LET'S SEE IF THIS WORKS * I forgot the chmod +x * I forgot the shebang --- .github/workflows/publish.yml | 42 +++++++------- SpaceStation14.sln | 1 - Tools/gen_build_info.py | 96 -------------------------------- Tools/publish_github_artifact.py | 56 +++++++++++++++++++ 4 files changed, 75 insertions(+), 120 deletions(-) delete mode 100755 Tools/gen_build_info.py create mode 100755 Tools/publish_github_artifact.py diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4e72256cb8..16cb5017d6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -41,31 +41,22 @@ jobs: - name: Package client run: dotnet run --project Content.Packaging client --no-wipe-release - - name: Update Build Info - run: Tools/gen_build_info.py - - - name: Shuffle files around - run: | - mkdir "release/${{ github.sha }}" - mv release/*.zip "release/${{ github.sha }}" - - - name: Upload files to centcomm - uses: appleboy/scp-action@master + - name: Upload build artifact + id: artifact-upload-step + uses: actions/upload-artifact@v4 with: - host: centcomm.spacestation14.io - username: wizards-build-push - key: ${{ secrets.CENTCOMM_WIZARDS_BUILDS_PUSH_KEY }} - source: "release/${{ github.sha }}" - target: "/home/wizards-build-push/builds_dir/builds/" - strip_components: 1 + name: build + path: release/*.zip + compression-level: 0 + retention-days: 0 - - name: Update manifest JSON - uses: appleboy/ssh-action@master - with: - host: centcomm.spacestation14.io - username: wizards-build-push - key: ${{ secrets.CENTCOMM_WIZARDS_BUILDS_PUSH_KEY }} - script: /home/wizards-build-push/push.ps1 ${{ github.sha }} + - name: Publish version + run: Tools/publish_github_artifact.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }} + ARTIFACT_ID: ${{ steps.artifact-upload-step.outputs.artifact-id }} + GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }} - name: Publish changelog (Discord) run: Tools/actions_changelogs_since_last_run.py @@ -77,3 +68,8 @@ jobs: run: Tools/actions_changelog_rss.py env: CHANGELOG_RSS_KEY: ${{ secrets.CHANGELOG_RSS_KEY }} + + - uses: geekyeggo/delete-artifact@v5 + if: always() + with: + name: build diff --git a/SpaceStation14.sln b/SpaceStation14.sln index e0cb455a6d..bcd013b598 100644 --- a/SpaceStation14.sln +++ b/SpaceStation14.sln @@ -62,7 +62,6 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{806ED41A-411B-4B3B-BEB6-DEC6DCA4C205}" ProjectSection(SolutionItems) = preProject Tools\generate_hashes.ps1 = Tools\generate_hashes.ps1 - Tools\gen_build_info.py = Tools\gen_build_info.py EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Robust.Shared.Scripting", "RobustToolbox\Robust.Shared.Scripting\Robust.Shared.Scripting.csproj", "{41B450C0-A361-4CD7-8121-7072B8995CFC}" diff --git a/Tools/gen_build_info.py b/Tools/gen_build_info.py deleted file mode 100755 index 0207f568dd..0000000000 --- a/Tools/gen_build_info.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 - -# Generates build info and injects it into the server zip files. - -import codecs -import hashlib -import io -import json -import os -import subprocess -from zipfile import ZipFile, ZIP_DEFLATED - -FILE = "SS14.Client.zip" - -SERVER_FILES = [ - "SS14.Server_linux-x64.zip", - "SS14.Server_linux-arm64.zip", - "SS14.Server_win-x64.zip", - "SS14.Server_osx-x64.zip" -] - -VERSION = os.environ['GITHUB_SHA'] -FORK_ID = "wizards" -BUILD_URL = f"https://cdn.centcomm.spacestation14.com/builds/wizards/builds/{{FORK_VERSION}}/{FILE}" -MANIFEST_URL = f"https://cdn.centcomm.spacestation14.com/cdn/version/{{FORK_VERSION}}/manifest" -MANIFEST_DOWNLOAD_URL = f"https://cdn.centcomm.spacestation14.com/cdn/version/{{FORK_VERSION}}/download" - -def main() -> None: - client_file = os.path.join("release", FILE) - manifest = generate_build_json(client_file) - - for server in SERVER_FILES: - inject_manifest(os.path.join("release", server), manifest) - - -def inject_manifest(zip_path: str, manifest: str) -> None: - with ZipFile(zip_path, "a", compression=ZIP_DEFLATED) as z: - z.writestr("build.json", manifest) - - -def generate_build_json(file: str) -> str: - # Env variables set by Jenkins. - - hash = sha256_file(file) - engine_version = get_engine_version() - manifest_hash = generate_manifest_hash(file) - - return json.dumps({ - "download": BUILD_URL, - "hash": hash, - "version": VERSION, - "fork_id": FORK_ID, - "engine_version": engine_version, - "manifest_url": MANIFEST_URL, - "manifest_download_url": MANIFEST_DOWNLOAD_URL, - "manifest_hash": manifest_hash - }) - -def generate_manifest_hash(file: str) -> str: - zip = ZipFile(file) - infos = zip.infolist() - infos.sort(key=lambda i: i.filename) - - bytesIO = io.BytesIO() - writer = codecs.getwriter("UTF-8")(bytesIO) - writer.write("Robust Content Manifest 1\n") - - for info in infos: - if info.filename[-1] == "/": - continue - - bytes = zip.read(info) - hash = hashlib.blake2b(bytes, digest_size=32).hexdigest().upper() - writer.write(f"{hash} {info.filename}\n") - - manifestHash = hashlib.blake2b(bytesIO.getbuffer(), digest_size=32) - - return manifestHash.hexdigest().upper() - -def get_engine_version() -> str: - proc = subprocess.run(["git", "describe","--tags", "--abbrev=0"], stdout=subprocess.PIPE, cwd="RobustToolbox", check=True, encoding="UTF-8") - tag = proc.stdout.strip() - assert tag.startswith("v") - return tag[1:] # Cut off v prefix. - - -def sha256_file(path: str) -> str: - with open(path, "rb") as f: - h = hashlib.sha256() - for b in iter(lambda: f.read(4096), b""): - h.update(b) - - return h.hexdigest() - -if __name__ == '__main__': - main() diff --git a/Tools/publish_github_artifact.py b/Tools/publish_github_artifact.py new file mode 100755 index 0000000000..b488ccdf2e --- /dev/null +++ b/Tools/publish_github_artifact.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import requests +import os +import subprocess + +GITHUB_TOKEN = os.environ["GITHUB_TOKEN"] +PUBLISH_TOKEN = os.environ["PUBLISH_TOKEN"] +ARTIFACT_ID = os.environ["ARTIFACT_ID"] +GITHUB_REPOSITORY = os.environ["GITHUB_REPOSITORY"] +VERSION = os.environ['GITHUB_SHA'] + +# +# CONFIGURATION PARAMETERS +# Forks should change these to publish to their own infrastructure. +# +ROBUST_CDN_URL = "https://wizards.cdn.spacestation14.com/" +FORK_ID = "wizards" + +def main(): + print("Fetching artifact URL from API...") + artifact_url = get_artifact_url() + print(f"Artifact URL is {artifact_url}, publishing to Robust.Cdn") + + data = { + "version": VERSION, + "engineVersion": get_engine_version(), + "archive": artifact_url + } + headers = { + "Authorization": f"Bearer {PUBLISH_TOKEN}", + "Content-Type": "application/json" + } + resp = requests.post(f"{ROBUST_CDN_URL}fork/{FORK_ID}/publish", json=data, headers=headers) + resp.raise_for_status() + print("Publish succeeded!") + +def get_artifact_url() -> str: + headers = { + "Authorization": f"Bearer {GITHUB_TOKEN}", + "X-GitHub-Api-Version": "2022-11-28" + } + resp = requests.get(f"https://api.github.com/repos/{GITHUB_REPOSITORY}/actions/artifacts/{ARTIFACT_ID}/zip", allow_redirects=False, headers=headers) + resp.raise_for_status() + + return resp.headers["Location"] + +def get_engine_version() -> str: + proc = subprocess.run(["git", "describe","--tags", "--abbrev=0"], stdout=subprocess.PIPE, cwd="RobustToolbox", check=True, encoding="UTF-8") + tag = proc.stdout.strip() + assert tag.startswith("v") + return tag[1:] # Cut off v prefix. + + +if __name__ == '__main__': + main() From c1915c9d73bb19e29fc0034b24e34fd776643fe2 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 13 Jul 2024 22:36:20 +0200 Subject: [PATCH 048/118] Remove outdated steps from Test Packaging workflow (#30018) gen build info was removed in 5e800e0ece7beadeb06bba901dd573e84fa4c133 but I didn't realize this workflow also tested it. Gone now. --- .github/workflows/test-packaging.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/test-packaging.yml b/.github/workflows/test-packaging.yml index 2dce502697..2d002f869a 100644 --- a/.github/workflows/test-packaging.yml +++ b/.github/workflows/test-packaging.yml @@ -64,11 +64,3 @@ jobs: - name: Package client run: dotnet run --project Content.Packaging client --no-wipe-release - - - name: Update Build Info - run: Tools/gen_build_info.py - - - name: Shuffle files around - run: | - mkdir "release/${{ github.sha }}" - mv release/*.zip "release/${{ github.sha }}" From a03b88979e25a9778a30f30612790f6966369fca Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:05:22 -0700 Subject: [PATCH 049/118] Replace obsolete xform.ToMap() with xformSystem.ToMapCoordinates() (#30010) * Get rid of a bunch of obsolete usages * position --------- Co-authored-by: plykiya --- .../Construction/ConstructionSystem.cs | 6 +++--- .../ContextMenu/UI/EntityMenuUIController.cs | 2 +- Content.Client/Gameplay/GameplayStateBase.cs | 3 ++- .../Movement/Systems/JetpackSystem.cs | 5 +++-- Content.Client/NPC/PathfindingSystem.cs | 18 +++++++++--------- Content.Client/Physics/JointVisualsOverlay.cs | 4 ++-- Content.Client/Pinpointer/UI/NavMapControl.cs | 14 +++++++------- Content.Client/RCD/AlignRCDConstruction.cs | 6 +++--- Content.Client/Sandbox/SandboxSystem.cs | 6 ++++-- .../Shuttles/Systems/ShuttleSystem.Console.cs | 4 ++-- .../Shuttles/UI/ShuttleMapControl.xaml.cs | 2 +- .../Storage/Systems/StorageSystem.cs | 4 ++-- .../Weapons/Melee/MeleeWeaponSystem.cs | 2 +- .../Weapons/Ranged/Systems/GunSystem.cs | 6 +++--- .../Pointing/EntitySystems/PointingSystem.cs | 5 ++--- Content.Shared/Actions/SharedActionsSystem.cs | 2 +- 16 files changed, 46 insertions(+), 43 deletions(-) diff --git a/Content.Client/Construction/ConstructionSystem.cs b/Content.Client/Construction/ConstructionSystem.cs index 453658bebf..889c992f7f 100644 --- a/Content.Client/Construction/ConstructionSystem.cs +++ b/Content.Client/Construction/ConstructionSystem.cs @@ -48,11 +48,11 @@ public override void Initialize() CommandBinds.Builder .Bind(ContentKeyFunctions.OpenCraftingMenu, - new PointerInputCmdHandler(HandleOpenCraftingMenu, outsidePrediction:true)) + new PointerInputCmdHandler(HandleOpenCraftingMenu, outsidePrediction: true)) .Bind(EngineKeyFunctions.Use, new PointerInputCmdHandler(HandleUse, outsidePrediction: true)) .Bind(ContentKeyFunctions.EditorFlipObject, - new PointerInputCmdHandler(HandleFlip, outsidePrediction:true)) + new PointerInputCmdHandler(HandleFlip, outsidePrediction: true)) .Register(); SubscribeLocalEvent(HandleConstructionGhostExamined); @@ -196,7 +196,7 @@ public bool TrySpawnGhost( if (GhostPresent(loc)) return false; - var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager, _transformSystem)); + var predicate = GetPredicate(prototype.CanBuildInImpassable, _transformSystem.ToMapCoordinates(loc)); if (!_examineSystem.InRangeUnOccluded(user, loc, 20f, predicate: predicate)) return false; diff --git a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs index a60619baa3..0462c095ba 100644 --- a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs +++ b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs @@ -170,7 +170,7 @@ private bool HandleOpenEntityMenu(in PointerInputCmdHandler.PointerInputCmdArgs if (_combatMode.IsInCombatMode(args.Session?.AttachedEntity)) return false; - var coords = args.Coordinates.ToMap(_entityManager, _xform); + var coords = _xform.ToMapCoordinates(args.Coordinates); if (_verbSystem.TryGetEntityMenuEntities(coords, out var entities)) OpenRootMenu(entities); diff --git a/Content.Client/Gameplay/GameplayStateBase.cs b/Content.Client/Gameplay/GameplayStateBase.cs index 6236cd8e95..63cbfdb09c 100644 --- a/Content.Client/Gameplay/GameplayStateBase.cs +++ b/Content.Client/Gameplay/GameplayStateBase.cs @@ -104,7 +104,8 @@ private bool HandleInspect(ICommonSession? session, EntityCoordinates coords, En public IEnumerable GetClickableEntities(EntityCoordinates coordinates) { - return GetClickableEntities(coordinates.ToMap(_entityManager, _entitySystemManager.GetEntitySystem())); + var transformSystem = _entitySystemManager.GetEntitySystem(); + return GetClickableEntities(transformSystem.ToMapCoordinates(coordinates)); } public IEnumerable GetClickableEntities(MapCoordinates coordinates) diff --git a/Content.Client/Movement/Systems/JetpackSystem.cs b/Content.Client/Movement/Systems/JetpackSystem.cs index b7f5e48821..e25300d44c 100644 --- a/Content.Client/Movement/Systems/JetpackSystem.cs +++ b/Content.Client/Movement/Systems/JetpackSystem.cs @@ -15,6 +15,7 @@ public sealed class JetpackSystem : SharedJetpackSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly ClothingSystem _clothing = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; public override void Initialize() { @@ -73,11 +74,11 @@ private void CreateParticles(EntityUid uid) var uidXform = Transform(uid); var coordinates = uidXform.Coordinates; - var gridUid = coordinates.GetGridUid(EntityManager); + var gridUid = _transform.GetGrid(coordinates); if (TryComp(gridUid, out var grid)) { - coordinates = new EntityCoordinates(gridUid.Value, grid.WorldToLocal(coordinates.ToMapPos(EntityManager, _transform))); + coordinates = new EntityCoordinates(gridUid.Value, _mapSystem.WorldToLocal(gridUid.Value, grid, _transform.ToMapCoordinates(coordinates).Position)); } else if (uidXform.MapUid != null) { diff --git a/Content.Client/NPC/PathfindingSystem.cs b/Content.Client/NPC/PathfindingSystem.cs index d3ae509152..0c72a8f99f 100644 --- a/Content.Client/NPC/PathfindingSystem.cs +++ b/Content.Client/NPC/PathfindingSystem.cs @@ -203,7 +203,7 @@ private void DrawScreen(OverlayDrawArgs args, DrawingHandleScreen screenHandle) if (found || !_system.Breadcrumbs.TryGetValue(netGrid, out var crumbs) || !xformQuery.TryGetComponent(grid, out var gridXform)) continue; - var (_, _, worldMatrix, invWorldMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform); var localAABB = invWorldMatrix.TransformBox(aabb.Enlarged(float.Epsilon - SharedPathfindingSystem.ChunkSize)); foreach (var chunk in crumbs) @@ -287,7 +287,7 @@ private void DrawScreen(OverlayDrawArgs args, DrawingHandleScreen screenHandle) return; } - var invGridMatrix = gridXform.InvWorldMatrix; + var invGridMatrix = _transformSystem.GetInvWorldMatrix(gridXform); DebugPathPoly? nearest = null; foreach (var poly in tile) @@ -359,7 +359,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) continue; } - var (_, _, worldMatrix, invWorldMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform); worldHandle.SetTransform(worldMatrix); var localAABB = invWorldMatrix.TransformBox(aabb); @@ -419,7 +419,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) !xformQuery.TryGetComponent(grid, out var gridXform)) continue; - var (_, _, worldMatrix, invWorldMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform); worldHandle.SetTransform(worldMatrix); var localAABB = invWorldMatrix.TransformBox(aabb); @@ -458,7 +458,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) !xformQuery.TryGetComponent(grid, out var gridXform)) continue; - var (_, _, worldMatrix, invMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform); worldHandle.SetTransform(worldMatrix); var localAABB = invMatrix.TransformBox(aabb); @@ -483,7 +483,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) if (neighborPoly.NetEntity != poly.GraphUid) { color = Color.Green; - var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager, _transformSystem); + var neighborMap = _transformSystem.ToMapCoordinates(_entManager.GetCoordinates(neighborPoly)); if (neighborMap.MapId != args.MapId) continue; @@ -517,7 +517,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) !xformQuery.TryGetComponent(grid, out var gridXform)) continue; - var (_, _, worldMatrix, invWorldMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform); worldHandle.SetTransform(worldMatrix); var localAABB = invWorldMatrix.TransformBox(args.WorldBounds); @@ -544,7 +544,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) if (!_entManager.TryGetComponent(_entManager.GetEntity(node.GraphUid), out var graphXform)) continue; - worldHandle.SetTransform(graphXform.WorldMatrix); + worldHandle.SetTransform(_transformSystem.GetWorldMatrix(graphXform)); worldHandle.DrawRect(node.Box, Color.Orange.WithAlpha(0.10f)); } } @@ -568,7 +568,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) continue; matrix = graph; - worldHandle.SetTransform(graphXform.WorldMatrix); + worldHandle.SetTransform(_transformSystem.GetWorldMatrix(graphXform)); } worldHandle.DrawRect(node.Box, new Color(0f, cost / highestGScore, 1f - (cost / highestGScore), 0.10f)); diff --git a/Content.Client/Physics/JointVisualsOverlay.cs b/Content.Client/Physics/JointVisualsOverlay.cs index 09c02746e2..e0b3499a97 100644 --- a/Content.Client/Physics/JointVisualsOverlay.cs +++ b/Content.Client/Physics/JointVisualsOverlay.cs @@ -58,8 +58,8 @@ protected override void Draw(in OverlayDrawArgs args) coordsA = coordsA.Offset(rotA.RotateVec(visuals.OffsetA)); coordsB = coordsB.Offset(rotB.RotateVec(visuals.OffsetB)); - var posA = coordsA.ToMapPos(_entManager, xformSystem); - var posB = coordsB.ToMapPos(_entManager, xformSystem); + var posA = xformSystem.ToMapCoordinates(coordsA).Position; + var posB = xformSystem.ToMapCoordinates(coordsB).Position; var diff = (posB - posA); var length = diff.Length(); diff --git a/Content.Client/Pinpointer/UI/NavMapControl.cs b/Content.Client/Pinpointer/UI/NavMapControl.cs index 3c99a18818..413b41c36a 100644 --- a/Content.Client/Pinpointer/UI/NavMapControl.cs +++ b/Content.Client/Pinpointer/UI/NavMapControl.cs @@ -228,8 +228,8 @@ protected override void KeyBindUp(GUIBoundKeyEventArgs args) { if (!blip.Selectable) continue; - - var currentDistance = (blip.Coordinates.ToMapPos(EntManager, _transformSystem) - worldPosition).Length(); + + var currentDistance = (_transformSystem.ToMapCoordinates(blip.Coordinates).Position - worldPosition).Length(); if (closestDistance < currentDistance || currentDistance * MinimapScale > MaxSelectableDistance) continue; @@ -397,7 +397,7 @@ protected override void Draw(DrawingHandleScreen handle) { if (lit && value.Visible) { - var mapPos = coord.ToMap(EntManager, _transformSystem); + var mapPos = _transformSystem.ToMapCoordinates(coord); if (mapPos.MapId != MapId.Nullspace) { @@ -418,7 +418,7 @@ protected override void Draw(DrawingHandleScreen handle) if (blip.Texture == null) continue; - var mapPos = blip.Coordinates.ToMap(EntManager, _transformSystem); + var mapPos = _transformSystem.ToMapCoordinates(blip.Coordinates); if (mapPos.MapId != MapId.Nullspace) { @@ -535,7 +535,7 @@ private void UpdateNavMapWallLines() // East edge neighborData = 0; if (relativeTile.X != SharedNavMapSystem.ChunkSize - 1) - neighborData = chunk.TileData[i+SharedNavMapSystem.ChunkSize]; + neighborData = chunk.TileData[i + SharedNavMapSystem.ChunkSize]; else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Right, out neighborChunk)) neighborData = neighborChunk.TileData[i + SharedNavMapSystem.ChunkSize - SharedNavMapSystem.ArraySize]; @@ -548,7 +548,7 @@ private void UpdateNavMapWallLines() // South edge neighborData = 0; if (relativeTile.Y != 0) - neighborData = chunk.TileData[i-1]; + neighborData = chunk.TileData[i - 1]; else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Down, out neighborChunk)) neighborData = neighborChunk.TileData[i - 1 + SharedNavMapSystem.ChunkSize]; @@ -561,7 +561,7 @@ private void UpdateNavMapWallLines() // West edge neighborData = 0; if (relativeTile.X != 0) - neighborData = chunk.TileData[i-SharedNavMapSystem.ChunkSize]; + neighborData = chunk.TileData[i - SharedNavMapSystem.ChunkSize]; else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Left, out neighborChunk)) neighborData = neighborChunk.TileData[i - SharedNavMapSystem.ChunkSize + SharedNavMapSystem.ArraySize]; diff --git a/Content.Client/RCD/AlignRCDConstruction.cs b/Content.Client/RCD/AlignRCDConstruction.cs index d5425425a7..fcbe408a38 100644 --- a/Content.Client/RCD/AlignRCDConstruction.cs +++ b/Content.Client/RCD/AlignRCDConstruction.cs @@ -45,7 +45,7 @@ public override void AlignPlacementMode(ScreenCoordinates mouseScreen) _unalignedMouseCoords = ScreenToCursorGrid(mouseScreen); MouseCoords = _unalignedMouseCoords.AlignWithClosestGridTile(SearchBoxSize, _entityManager, _mapManager); - var gridId = MouseCoords.GetGridUid(_entityManager); + var gridId = _transformSystem.GetGrid(MouseCoords); if (!_entityManager.TryGetComponent(gridId, out var mapGrid)) return; @@ -105,8 +105,8 @@ public override bool IsValidPosition(EntityCoordinates position) if (currentState is not GameplayStateBase screen) return false; - - var target = screen.GetClickedEntity(_unalignedMouseCoords.ToMap(_entityManager, _transformSystem)); + + var target = screen.GetClickedEntity(_transformSystem.ToMapCoordinates(_unalignedMouseCoords)); // Determine if the RCD operation is valid or not if (!_rcdSystem.IsRCDOperationStillValid(heldEntity.Value, rcd, mapGridData.Value, target, player.Value, false)) diff --git a/Content.Client/Sandbox/SandboxSystem.cs b/Content.Client/Sandbox/SandboxSystem.cs index 6a1129bb75..8a4c93fa35 100644 --- a/Content.Client/Sandbox/SandboxSystem.cs +++ b/Content.Client/Sandbox/SandboxSystem.cs @@ -17,6 +17,7 @@ public sealed class SandboxSystem : SharedSandboxSystem [Dependency] private readonly IPlacementManager _placement = default!; [Dependency] private readonly ContentEyeSystem _contentEye = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; private bool _sandboxEnabled; public bool SandboxAllowed { get; private set; } @@ -92,7 +93,7 @@ public bool Copy(ICommonSession? session, EntityCoordinates coords, EntityUid ui && EntityManager.TryGetComponent(uid, out MetaDataComponent? comp) && !comp.EntityDeleted) { - if (comp.EntityPrototype == null || comp.EntityPrototype.NoSpawn || comp.EntityPrototype.Abstract) + if (comp.EntityPrototype == null || comp.EntityPrototype.HideSpawnMenu || comp.EntityPrototype.Abstract) return false; if (_placement.Eraser) @@ -109,7 +110,8 @@ public bool Copy(ICommonSession? session, EntityCoordinates coords, EntityUid ui } // Try copy tile. - if (!_map.TryFindGridAt(coords.ToMap(EntityManager, _transform), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) + + if (!_map.TryFindGridAt(_transform.ToMapCoordinates(coords), out var gridUid, out var grid) || !_mapSystem.TryGetTileRef(gridUid, grid, coords, out var tileRef)) return false; if (_placement.Eraser) diff --git a/Content.Client/Shuttles/Systems/ShuttleSystem.Console.cs b/Content.Client/Shuttles/Systems/ShuttleSystem.Console.cs index c134b7157c..eb9ec285f8 100644 --- a/Content.Client/Shuttles/Systems/ShuttleSystem.Console.cs +++ b/Content.Client/Shuttles/Systems/ShuttleSystem.Console.cs @@ -35,9 +35,9 @@ public MapCoordinates GetMapCoordinates(IMapObject mapObj) switch (mapObj) { case ShuttleBeaconObject beacon: - return GetCoordinates(beacon.Coordinates).ToMap(EntityManager, XformSystem); + return XformSystem.ToMapCoordinates(GetCoordinates(beacon.Coordinates)); case ShuttleExclusionObject exclusion: - return GetCoordinates(exclusion.Coordinates).ToMap(EntityManager, XformSystem); + return XformSystem.ToMapCoordinates(GetCoordinates(exclusion.Coordinates)); case GridMapObject grid: var gridXform = Transform(grid.Entity); diff --git a/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs b/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs index 8bd4a338cb..53ad4a0b23 100644 --- a/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs +++ b/Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs @@ -519,7 +519,7 @@ private void AddMapObject(List edges, List verts, ValueList(gunUid); _animPlayer.Stop(gunUid, uidPlayer, "muzzle-flash-light"); - _animPlayer.Play((gunUid, uidPlayer), animTwo,"muzzle-flash-light"); + _animPlayer.Play((gunUid, uidPlayer), animTwo, "muzzle-flash-light"); } } diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index 9dc3b5e1e6..ca7791fb68 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -145,8 +145,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E _popup.PopupEntity(Loc.GetString("pointing-system-try-point-cannot-reach"), player, player); return false; } - - var mapCoordsPointed = coordsPointed.ToMap(EntityManager, _transform); + var mapCoordsPointed = _transform.ToMapCoordinates(coordsPointed); _rotateToFaceSystem.TryFaceCoordinates(player, mapCoordsPointed.Position); var arrow = EntityManager.SpawnEntity("PointingArrow", coordsPointed); @@ -154,7 +153,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E if (TryComp(arrow, out var pointing)) { if (TryComp(player, out TransformComponent? xformPlayer)) - pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager, _transform), _transform).Position; + pointing.StartPosition = _transform.ToCoordinates((player, xformPlayer), _transform.ToMapCoordinates(xformPlayer.Coordinates)).Position; pointing.EndTime = _gameTiming.CurTime + PointDuration; diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 0e302f1e02..49c137468e 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -427,7 +427,7 @@ private void OnActionRequest(RequestPerformActionEvent ev, EntitySessionEventArg } var entityCoordinatesTarget = GetCoordinates(netCoordinatesTarget); - _rotateToFaceSystem.TryFaceCoordinates(user, entityCoordinatesTarget.ToMapPos(EntityManager, _transformSystem)); + _rotateToFaceSystem.TryFaceCoordinates(user, _transformSystem.ToMapCoordinates(entityCoordinatesTarget).Position); if (!ValidateWorldTarget(user, entityCoordinatesTarget, (actionEnt, worldAction))) return; From b7aa97e2030c0b01d07a76b4ee291fe2c8be95fa Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:25:51 -0700 Subject: [PATCH 050/118] Replace obsolete EntityCoordiates.InRange() with TransformSystem.InRange() (#29993) * Replace EntityCoordiates.InRange() with TransformSystem.InRange() * nullspace * I figured it out * man I have no clue how client side sutff works * please have mercy * remove RadiationPulseOverlay changes * nullspace --------- Co-authored-by: plykiya --- Content.Client/RCD/AlignRCDConstruction.cs | 2 +- Content.Client/Storage/Systems/StorageSystem.cs | 4 ++-- Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs | 2 +- Content.Server/Dragon/DragonSystem.cs | 2 +- Content.Server/Guardian/GuardianSystem.cs | 2 +- Content.Server/Instruments/InstrumentSystem.cs | 3 ++- Content.Server/Medical/HealthAnalyzerSystem.cs | 2 +- Content.Server/Movement/Systems/PullController.cs | 5 +++-- .../HTN/Preconditions/CoordinatesInRangePrecondition.cs | 9 ++++++++- .../Preconditions/CoordinatesNotInRangePrecondition.cs | 9 ++++++++- .../NPC/HTN/Preconditions/TargetInRangePrecondition.cs | 9 ++++++++- Content.Server/Pointing/EntitySystems/PointingSystem.cs | 2 +- Content.Shared/Actions/SharedActionsSystem.cs | 2 +- Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs | 2 +- 14 files changed, 39 insertions(+), 16 deletions(-) diff --git a/Content.Client/RCD/AlignRCDConstruction.cs b/Content.Client/RCD/AlignRCDConstruction.cs index fcbe408a38..ef99b01855 100644 --- a/Content.Client/RCD/AlignRCDConstruction.cs +++ b/Content.Client/RCD/AlignRCDConstruction.cs @@ -75,7 +75,7 @@ public override bool IsValidPosition(EntityCoordinates position) if (!_entityManager.TryGetComponent(player, out var xform)) return false; - if (!xform.Coordinates.InRange(_entityManager, _transformSystem, position, SharedInteractionSystem.InteractionRange)) + if (!_transformSystem.InRange(xform.Coordinates, position, SharedInteractionSystem.InteractionRange)) { InvalidPlaceColor = InvalidPlaceColor.WithAlpha(0); return false; diff --git a/Content.Client/Storage/Systems/StorageSystem.cs b/Content.Client/Storage/Systems/StorageSystem.cs index 1e011f08f0..eea7b9ec79 100644 --- a/Content.Client/Storage/Systems/StorageSystem.cs +++ b/Content.Client/Storage/Systems/StorageSystem.cs @@ -142,8 +142,8 @@ public void PickupAnimation(EntityUid item, EntityCoordinates initialCoords, Ent { if (!_timing.IsFirstTimePredicted) return; - - if (finalCoords.InRange(EntityManager, TransformSystem, initialCoords, 0.1f) || + + if (TransformSystem.InRange(finalCoords, initialCoords, 0.1f) || !Exists(initialCoords.EntityId) || !Exists(finalCoords.EntityId)) { return; diff --git a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs index c2cdd4a107..0f4490cd7e 100644 --- a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs @@ -162,7 +162,7 @@ private bool UpdateAnalyzer(EntityUid uid, GasAnalyzerComponent? component = nul if (component.LastPosition.HasValue) { // Check if position is out of range => don't update and disable - if (!component.LastPosition.Value.InRange(EntityManager, _transform, userPos, SharedInteractionSystem.InteractionRange)) + if (!_transform.InRange(component.LastPosition.Value, userPos, SharedInteractionSystem.InteractionRange)) { if (component.User is { } userId && component.Enabled) _popup.PopupEntity(Loc.GetString("gas-analyzer-shutoff"), userId, userId); diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 62d1f61a35..96ca8d3614 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -146,7 +146,7 @@ private void OnSpawnRift(EntityUid uid, DragonComponent component, DragonSpawnRi // cant stack rifts near eachother foreach (var (_, riftXform) in EntityQuery(true)) { - if (riftXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, RiftRange)) + if (_transform.InRange(riftXform.Coordinates, xform.Coordinates, RiftRange)) { _popup.PopupEntity(Loc.GetString("carp-rift-proximity", ("proximity", RiftRange)), uid, uid); return; diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 203882ed9e..ae4d0ca2b8 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -325,7 +325,7 @@ private void CheckGuardianMove( if (!guardianComponent.GuardianLoose) return; - if (!guardianXform.Coordinates.InRange(EntityManager, _transform, hostXform.Coordinates, guardianComponent.DistanceAllowed)) + if (!_transform.InRange(guardianXform.Coordinates, hostXform.Coordinates, guardianComponent.DistanceAllowed)) RetractGuardian(hostUid, hostComponent, guardianUid, guardianComponent); } diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs index 582bf7fa67..6814b596dc 100644 --- a/Content.Server/Instruments/InstrumentSystem.cs +++ b/Content.Server/Instruments/InstrumentSystem.cs @@ -402,7 +402,8 @@ public override void Update(float frameTime) var trans = transformQuery.GetComponent(uid); var masterTrans = transformQuery.GetComponent(master); - if (!masterTrans.Coordinates.InRange(EntityManager, _transform, trans.Coordinates, 10f)) + if (!_transform.InRange(masterTrans.Coordinates, trans.Coordinates, 10f) +) { Clean(uid, instrument); } diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs index 1d6e564a32..98f4f00d89 100644 --- a/Content.Server/Medical/HealthAnalyzerSystem.cs +++ b/Content.Server/Medical/HealthAnalyzerSystem.cs @@ -65,7 +65,7 @@ public override void Update(float frameTime) //Get distance between health analyzer and the scanned entity var patientCoordinates = Transform(patient).Coordinates; - if (!patientCoordinates.InRange(EntityManager, _transformSystem, transform.Coordinates, component.MaxScanRange)) + if (!_transformSystem.InRange(patientCoordinates, transform.Coordinates, component.MaxScanRange)) { //Range too far, disable updates StopAnalyzingEntity((uid, component), patient); diff --git a/Content.Server/Movement/Systems/PullController.cs b/Content.Server/Movement/Systems/PullController.cs index 340dc5654e..4bd4b60371 100644 --- a/Content.Server/Movement/Systems/PullController.cs +++ b/Content.Server/Movement/Systems/PullController.cs @@ -58,6 +58,7 @@ public sealed class PullController : VirtualController [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; /// /// If distance between puller and pulled entity lower that this threshold, @@ -133,8 +134,8 @@ private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinate var range = 2f; var fromUserCoords = coords.WithEntityId(player, EntityManager); var userCoords = new EntityCoordinates(player, Vector2.Zero); - - if (!coords.InRange(EntityManager, TransformSystem, userCoords, range)) + + if (!_transformSystem.InRange(coords, userCoords, range)) { var direction = fromUserCoords.Position - userCoords.Position; diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs index 3485bd2a18..452bf327f2 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs @@ -8,12 +8,19 @@ namespace Content.Server.NPC.HTN.Preconditions; public sealed partial class CoordinatesInRangePrecondition : HTNPrecondition { [Dependency] private readonly IEntityManager _entManager = default!; + private SharedTransformSystem _transformSystem = default!; [DataField("targetKey", required: true)] public string TargetKey = default!; [DataField("rangeKey", required: true)] public string RangeKey = default!; + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _transformSystem = sysManager.GetEntitySystem(); + } + public override bool IsMet(NPCBlackboard blackboard) { if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) @@ -22,6 +29,6 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return _transformSystem.InRange(coordinates, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs index 9d000ca2eb..901831679e 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs @@ -8,12 +8,19 @@ namespace Content.Server.NPC.HTN.Preconditions; public sealed partial class CoordinatesNotInRangePrecondition : HTNPrecondition { [Dependency] private readonly IEntityManager _entManager = default!; + private SharedTransformSystem _transformSystem = default!; [DataField("targetKey", required: true)] public string TargetKey = default!; [DataField("rangeKey", required: true)] public string RangeKey = default!; + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _transformSystem = sysManager.GetEntitySystem(); + } + public override bool IsMet(NPCBlackboard blackboard) { if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) @@ -22,7 +29,7 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return !coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return !_transformSystem.InRange(coordinates, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs index aaccb426d7..921b5ffa22 100644 --- a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs @@ -8,11 +8,17 @@ namespace Content.Server.NPC.HTN.Preconditions; public sealed partial class TargetInRangePrecondition : HTNPrecondition { [Dependency] private readonly IEntityManager _entManager = default!; + private SharedTransformSystem _transformSystem = default!; [DataField("targetKey", required: true)] public string TargetKey = default!; [DataField("rangeKey", required: true)] public string RangeKey = default!; + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _transformSystem = sysManager.GetEntitySystem(); + } public override bool IsMet(NPCBlackboard blackboard) { @@ -23,6 +29,7 @@ public override bool IsMet(NPCBlackboard blackboard) !_entManager.TryGetComponent(target, out var targetXform)) return false; - return coordinates.InRange(_entManager, _entManager.System(), targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); + var transformSystem = _entManager.System; + return _transformSystem.InRange(coordinates, targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index ca7791fb68..4b7f50fb86 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -101,7 +101,7 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) { if (HasComp(pointer)) { - return Transform(pointer).Coordinates.InRange(EntityManager, _transform, coordinates, 15); + return _transform.InRange(Transform(pointer).Coordinates, coordinates, 15); } else { diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 49c137468e..013348eb4f 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -533,7 +533,7 @@ private bool ValidateWorldTargetBase(EntityUid user, EntityCoordinates coords, W if (action.Range <= 0) return true; - return coords.InRange(EntityManager, _transformSystem, Transform(user).Coordinates, action.Range); + return _transformSystem.InRange(coords, Transform(user).Coordinates, action.Range); } return _interactionSystem.InRangeUnobstructed(user, coords, range: action.Range); diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs index 4f77a271b3..ad94f3b940 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs @@ -170,7 +170,7 @@ private bool ShouldCancel(DoAfter doAfter, if (args.BreakOnMove && !(!args.BreakOnWeightlessMove && _gravity.IsWeightless(args.User, xform: userXform))) { // Whether the user has moved too much from their original position. - if (!userXform.Coordinates.InRange(EntityManager, _transform, doAfter.UserPosition, args.MovementThreshold)) + if (!_transform.InRange(userXform.Coordinates, doAfter.UserPosition, args.MovementThreshold)) return true; // Whether the distance between the user and target(if any) has changed too much. From f68712431263fb2d2240fdf3bb9e0cbb278bd61d Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sun, 14 Jul 2024 02:17:15 +0300 Subject: [PATCH 051/118] Update IdExaminableSystem.cs to use TryFromMarkup (#29957) * Change FromMarkup to TryFromMarkup method in IdExaminableSystem.cs * Update --- Content.Shared/Access/Systems/IdExaminableSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Access/Systems/IdExaminableSystem.cs b/Content.Shared/Access/Systems/IdExaminableSystem.cs index 333272e27a..13359adcba 100644 --- a/Content.Shared/Access/Systems/IdExaminableSystem.cs +++ b/Content.Shared/Access/Systems/IdExaminableSystem.cs @@ -27,7 +27,8 @@ private void OnGetExamineVerbs(EntityUid uid, IdExaminableComponent component, G { Act = () => { - var markup = FormattedMessage.FromMarkup(info); + var markup = FormattedMessage.FromMarkupOrThrow(info); + _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("id-examinable-component-verb-text"), From 85fba9809ae267d096ff28d425dff0dac085bac8 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 14 Jul 2024 01:18:12 +0200 Subject: [PATCH 052/118] Update changelog RSS configuration (#30024) New server --- Tools/actions_changelog_rss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/actions_changelog_rss.py b/Tools/actions_changelog_rss.py index 5e42a030bd..01ca7852cc 100755 --- a/Tools/actions_changelog_rss.py +++ b/Tools/actions_changelog_rss.py @@ -29,7 +29,7 @@ # Change these to suit your server settings # https://docs.fabfile.org/en/stable/getting-started.html#run-commands-via-connections-and-run -SSH_HOST = "centcomm.spacestation14.io" +SSH_HOST = "moon.spacestation14.com" SSH_USER = "changelog-rss" SSH_PORT = 22 RSS_FILE = "changelog.xml" From a06309b96492d014781a8d0384588617673b335c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 20:26:39 -0400 Subject: [PATCH 053/118] Update Credits (#30026) Co-authored-by: PJBot --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index f3d458e046..47b90c9a16 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aeshus, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, ArkiveDev, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blueDev2, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, dffdff2423, diraven, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, Futuristic-OK, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JIPDawg, JoeHammad1844, joelsgp, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, Keer-Sar, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, laok233, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, RamZ, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zonespace27, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aeshus, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, ArkiveDev, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blueDev2, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, CatTheSystem, Centronias, chairbender, Charlese2, chavonadelal, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, dffdff2423, diraven, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FoLoKe, fooberticus, Fortune117, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JIPDawg, JoeHammad1844, joelsgp, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, Keer-Sar, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, laok233, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, RamZ, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, whateverusername0, Willhelm53, Winkarst-cpu, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zonespace27, Zumorica, Zymem From 87467a358bfb874f15e7aa4afef5abd76423d22f Mon Sep 17 00:00:00 2001 From: Luiz Costa <33888056+luizwritescode@users.noreply.github.com> Date: Sat, 13 Jul 2024 23:59:45 -0300 Subject: [PATCH 054/118] Fix lizards losing snouts when equipping a head bandana (#29979) * say goodbye to no-snout lizards * remove snout from plague doctor hat HideLayerClothing component --- .../Components/FoldableClothingComponent.cs | 13 +++++++++++++ .../EntitySystems/FoldableClothingSystem.cs | 7 +++++++ .../Prototypes/Entities/Clothing/Head/bandanas.yml | 2 ++ .../Prototypes/Entities/Clothing/Head/hats.yml | 1 - .../Prototypes/Entities/Clothing/Masks/bandanas.yml | 3 +++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Clothing/Components/FoldableClothingComponent.cs b/Content.Shared/Clothing/Components/FoldableClothingComponent.cs index 1a40d1dca1..ffcb52b457 100644 --- a/Content.Shared/Clothing/Components/FoldableClothingComponent.cs +++ b/Content.Shared/Clothing/Components/FoldableClothingComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Humanoid; using Content.Shared.Inventory; using Robust.Shared.GameStates; @@ -30,4 +31,16 @@ public sealed partial class FoldableClothingComponent : Component /// [DataField] public string? FoldedHeldPrefix; + + /// + /// Which layers does this hide when Unfolded? See and + /// + [DataField] + public HashSet UnfoldedHideLayers = new(); + + /// + /// Which layers does this hide when folded? See and + /// + [DataField] + public HashSet FoldedHideLayers = new(); } diff --git a/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs index be55588ddd..603af4099c 100644 --- a/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs @@ -47,6 +47,10 @@ private void OnFolded(Entity ent, ref FoldedEvent arg if (ent.Comp.FoldedHeldPrefix != null) _itemSystem.SetHeldPrefix(ent.Owner, ent.Comp.FoldedHeldPrefix, false, itemComp); + + if (TryComp(ent.Owner, out var hideLayerComp)) + hideLayerComp.Slots = ent.Comp.FoldedHideLayers; + } else { @@ -59,6 +63,9 @@ private void OnFolded(Entity ent, ref FoldedEvent arg if (ent.Comp.FoldedHeldPrefix != null) _itemSystem.SetHeldPrefix(ent.Owner, null, false, itemComp); + if (TryComp(ent.Owner, out var hideLayerComp)) + hideLayerComp.Slots = ent.Comp.UnfoldedHideLayers; + } } } diff --git a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml index 51a56f1f1d..da56194f71 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml @@ -20,6 +20,8 @@ - state: icon_mask map: [ "unfoldedLayer" ] visible: false + - type: HideLayerClothing # needed since head bandana inherits from mask bandana + slots: [] - type: Tag tags: - Bandana diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index d220d55f1f..8eeb82cbf4 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -391,7 +391,6 @@ - type: HideLayerClothing slots: - Hair - - Snout - HeadTop - HeadSide diff --git a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml index f5ad2fb6c8..8021030095 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml @@ -11,6 +11,9 @@ - HEAD unfoldedSlots: - MASK + foldedHideLayers: [] + unfoldedHideLayers: + - Snout - type: Mask - type: IngestionBlocker - type: IdentityBlocker From 68982953f3c4ba082e7e4651565bd36ae810d763 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 14 Jul 2024 03:00:52 +0000 Subject: [PATCH 055/118] 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 e4c8aa1b43..0a41c2e2e9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Flaming mice no longer completely engulf people they touch. - type: Tweak - id: 6416 - time: '2024-04-22T08:42:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27202 - author: Weax changes: - message: The CLF3 reaction now requires heating first before you can engulf chemistry @@ -3813,3 +3806,10 @@ id: 6915 time: '2024-07-13T12:15:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/25750 +- author: coffeeware + changes: + - message: Lizards will no longer lose their snouts when equipping head bandanas + type: Fix + id: 6916 + time: '2024-07-14T02:59:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29979 From 5d1702d280ff0f20537abaa4ebf0e8f13400ff51 Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sun, 14 Jul 2024 06:05:39 +0300 Subject: [PATCH 056/118] Update MainMenu.cs to use ISawmill (#29988) * Update MainMenu.cs to use ISawmill * Update * Error --- Content.Client/MainMenu/MainMenu.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Content.Client/MainMenu/MainMenu.cs b/Content.Client/MainMenu/MainMenu.cs index 43c5bfe567..3c709d2d15 100644 --- a/Content.Client/MainMenu/MainMenu.cs +++ b/Content.Client/MainMenu/MainMenu.cs @@ -25,6 +25,9 @@ public sealed class MainScreen : Robust.Client.State.State [Dependency] private readonly IGameController _controllerProxy = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; + [Dependency] private readonly ILogManager _logManager = default!; + + private ISawmill _sawmill = default!; private MainMenuControl _mainMenuControl = default!; private bool _isConnecting; @@ -35,6 +38,8 @@ public sealed class MainScreen : Robust.Client.State.State /// protected override void Startup() { + _sawmill = _logManager.GetSawmill("mainmenu"); + _mainMenuControl = new MainMenuControl(_resourceCache, _configurationManager); _userInterfaceManager.StateRoot.AddChild(_mainMenuControl); @@ -116,7 +121,7 @@ private void TryConnect(string address) catch (ArgumentException e) { _userInterfaceManager.Popup($"Unable to connect: {e.Message}", "Connection error."); - Logger.Warning(e.ToString()); + _sawmill.Warning(e.ToString()); _netManager.ConnectFailed -= _onConnectFailed; _setConnectingState(false); } From 922be642904ede5988835a9143357d47be731b8d Mon Sep 17 00:00:00 2001 From: osjarw <62134478+osjarw@users.noreply.github.com> Date: Sun, 14 Jul 2024 06:26:38 +0300 Subject: [PATCH 057/118] NPC exits MeleeOperator on invalid EntityUid (#30005) EntityUid 0 problem fix --- .../HTN/PrimitiveTasks/Operators/Combat/Melee/MeleeOperator.cs | 3 ++- Content.Server/NPC/Systems/NPCJukeSystem.cs | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/Melee/MeleeOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/Melee/MeleeOperator.cs index 32be027ec4..5a02b86201 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/Melee/MeleeOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/Melee/MeleeOperator.cs @@ -89,7 +89,8 @@ public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTi HTNOperatorStatus status; if (_entManager.TryGetComponent(owner, out var combat) && - blackboard.TryGetValue(TargetKey, out var target, _entManager)) + blackboard.TryGetValue(TargetKey, out var target, _entManager) && + target != EntityUid.Invalid) { combat.Target = target; diff --git a/Content.Server/NPC/Systems/NPCJukeSystem.cs b/Content.Server/NPC/Systems/NPCJukeSystem.cs index da9fa1f761..94a30feb0c 100644 --- a/Content.Server/NPC/Systems/NPCJukeSystem.cs +++ b/Content.Server/NPC/Systems/NPCJukeSystem.cs @@ -143,6 +143,9 @@ private void OnJukeSteering(EntityUid uid, NPCJukeComponent component, ref NPCSt if (!_melee.TryGetWeapon(uid, out var weaponUid, out var weapon)) return; + if (!HasComp(melee.Target)) + return; + var cdRemaining = weapon.NextAttack - _timing.CurTime; var attackCooldown = TimeSpan.FromSeconds(1f / _melee.GetAttackRate(weaponUid, uid, weapon)); From bdf7293cfb83dd1e36fad4b40dfc33a9960e1d7a Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Sat, 13 Jul 2024 20:27:39 -0700 Subject: [PATCH 058/118] Clean itemmapper (#29983) * File scoped namespace * Format file * Fix param name in doc comment * Reflow doc comment --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../EntitySystems/SharedItemMapperSystem.cs | 164 +++++++++--------- 1 file changed, 83 insertions(+), 81 deletions(-) diff --git a/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs b/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs index eb20c65a11..7ae821d8d9 100644 --- a/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedItemMapperSystem.cs @@ -4,107 +4,109 @@ using JetBrains.Annotations; using Robust.Shared.Containers; -namespace Content.Shared.Storage.EntitySystems +namespace Content.Shared.Storage.EntitySystems; + +/// +/// ItemMapperSystem is a system that on each initialization, insertion, removal of an entity from +/// given (with appropriate storage attached) will check each stored item to see +/// if its tags/component, and overall quantity match . +/// +[UsedImplicitly] +public abstract class SharedItemMapperSystem : EntitySystem { - /// - /// ItemMapperSystem is a system that on each initialization, insertion, removal of an entity from - /// given (with appropriate storage attached) will check each stored item to see - /// if its tags/component, and overall quantity match . - /// - [UsedImplicitly] - public abstract class SharedItemMapperSystem : EntitySystem + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + + /// + public override void Initialize() { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + base.Initialize(); + SubscribeLocalEvent(InitLayers); + SubscribeLocalEvent(MapperEntityInserted); + SubscribeLocalEvent(MapperEntityRemoved); + } - /// - public override void Initialize() + private void InitLayers(EntityUid uid, ItemMapperComponent component, ComponentInit args) + { + foreach (var (layerName, val) in component.MapLayers) { - base.Initialize(); - SubscribeLocalEvent(InitLayers); - SubscribeLocalEvent(MapperEntityInserted); - SubscribeLocalEvent(MapperEntityRemoved); + val.Layer = layerName; } - private void InitLayers(EntityUid uid, ItemMapperComponent component, ComponentInit args) + if (EntityManager.TryGetComponent(uid, out AppearanceComponent? appearanceComponent)) { - foreach (var (layerName, val) in component.MapLayers) - { - val.Layer = layerName; - } + var list = new List(component.MapLayers.Keys); + _appearance.SetData(uid, StorageMapVisuals.InitLayers, new ShowLayerData(list), appearanceComponent); + } - if (EntityManager.TryGetComponent(uid, out AppearanceComponent? appearanceComponent)) - { - var list = new List(component.MapLayers.Keys); - _appearance.SetData(uid, StorageMapVisuals.InitLayers, new ShowLayerData(list), appearanceComponent); - } + // Ensure appearance is correct with current contained entities. + UpdateAppearance(uid, component); + } - // Ensure appearance is correct with current contained entities. - UpdateAppearance(uid, component); - } + private void MapperEntityRemoved(EntityUid uid, ItemMapperComponent itemMapper, EntRemovedFromContainerMessage args) + { + if (itemMapper.ContainerWhitelist != null && !itemMapper.ContainerWhitelist.Contains(args.Container.ID)) + return; - private void MapperEntityRemoved(EntityUid uid, ItemMapperComponent itemMapper, - EntRemovedFromContainerMessage args) - { - if (itemMapper.ContainerWhitelist != null && !itemMapper.ContainerWhitelist.Contains(args.Container.ID)) - return; + UpdateAppearance(uid, itemMapper); + } - UpdateAppearance(uid, itemMapper); - } + private void MapperEntityInserted(EntityUid uid, + ItemMapperComponent itemMapper, + EntInsertedIntoContainerMessage args) + { + if (itemMapper.ContainerWhitelist != null && !itemMapper.ContainerWhitelist.Contains(args.Container.ID)) + return; - private void MapperEntityInserted(EntityUid uid, ItemMapperComponent itemMapper, - EntInsertedIntoContainerMessage args) - { - if (itemMapper.ContainerWhitelist != null && !itemMapper.ContainerWhitelist.Contains(args.Container.ID)) - return; + UpdateAppearance(uid, itemMapper); + } - UpdateAppearance(uid, itemMapper); - } + private void UpdateAppearance(EntityUid uid, ItemMapperComponent? itemMapper = null) + { + if (!Resolve(uid, ref itemMapper)) + return; - private void UpdateAppearance(EntityUid uid, ItemMapperComponent? itemMapper = null) + if (EntityManager.TryGetComponent(uid, out AppearanceComponent? appearanceComponent) + && TryGetLayers(uid, itemMapper, out var containedLayers)) { - if(!Resolve(uid, ref itemMapper)) - return; - - if (EntityManager.TryGetComponent(uid, out AppearanceComponent? appearanceComponent) - && TryGetLayers(uid, itemMapper, out var containedLayers)) - { - _appearance.SetData(uid, StorageMapVisuals.LayerChanged, new ShowLayerData(containedLayers), appearanceComponent); - } + _appearance.SetData(uid, + StorageMapVisuals.LayerChanged, + new ShowLayerData(containedLayers), + appearanceComponent); } + } - /// - /// Method that iterates over storage of the entity in and sets according to - /// definition. It will have O(n*m) time behavior (n - number of entities in container, and m - number of - /// definitions in . - /// - /// EntityUid used to search the storage - /// component that contains definition used to map whitelist in - /// mapLayers to string. - /// - /// list of layers that should be visible - /// false if msg.Container.Owner is not a storage, true otherwise. - private bool TryGetLayers(EntityUid uid, - ItemMapperComponent itemMapper, - out List showLayers) - { - var containedLayers = _container.GetAllContainers(uid) - .Where(c => itemMapper.ContainerWhitelist?.Contains(c.ID) ?? true).SelectMany(cont => cont.ContainedEntities).ToArray(); + /// + /// Method that iterates over storage of the entity in and sets + /// according to definition. It will have O(n*m) time behavior + /// (n - number of entities in container, and m - number of definitions in ). + /// + /// EntityUid used to search the storage + /// component that contains definition used to map + /// Whitelist in to string. + /// + /// list of layers that should be visible + /// false if msg.Container.Owner is not a storage, true otherwise. + private bool TryGetLayers(EntityUid uid, ItemMapperComponent itemMapper, out List showLayers) + { + var containedLayers = _container.GetAllContainers(uid) + .Where(c => itemMapper.ContainerWhitelist?.Contains(c.ID) ?? true) + .SelectMany(cont => cont.ContainedEntities) + .ToArray(); - var list = new List(); - foreach (var mapLayerData in itemMapper.MapLayers.Values) + var list = new List(); + foreach (var mapLayerData in itemMapper.MapLayers.Values) + { + var count = containedLayers.Count(ent => _whitelistSystem.IsWhitelistPassOrNull(mapLayerData.Whitelist, + ent)); + if (count >= mapLayerData.MinCount && count <= mapLayerData.MaxCount) { - var count = containedLayers.Count(ent => _whitelistSystem.IsWhitelistPassOrNull(mapLayerData.Whitelist, - ent)); - if (count >= mapLayerData.MinCount && count <= mapLayerData.MaxCount) - { - list.Add(mapLayerData.Layer); - } + list.Add(mapLayerData.Layer); } - - showLayers = list; - return true; } + + showLayers = list; + return true; } } From 960cc806cc4cdcabcbe9f08f0bb3e54aa2513c4a Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sun, 14 Jul 2024 13:24:26 +0300 Subject: [PATCH 059/118] Update AccessLevelControl.xaml.cs to use ISawmill (#29987) * Update AccessLevelControl.xaml.cs to use ISawmill * Update * Silly me * Update --- Content.Client/Access/UI/AccessLevelControl.xaml.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Content.Client/Access/UI/AccessLevelControl.xaml.cs b/Content.Client/Access/UI/AccessLevelControl.xaml.cs index 34db80b7af..9f09eceec0 100644 --- a/Content.Client/Access/UI/AccessLevelControl.xaml.cs +++ b/Content.Client/Access/UI/AccessLevelControl.xaml.cs @@ -12,11 +12,17 @@ namespace Content.Client.Access.UI; [GenerateTypedNameReferences] public sealed partial class AccessLevelControl : GridContainer { + [Dependency] private readonly ILogManager _logManager = default!; + + private ISawmill _sawmill = default!; + public readonly Dictionary, Button> ButtonsList = new(); public AccessLevelControl() { RobustXamlLoader.Load(this); + + _sawmill = _logManager.GetSawmill("accesslevelcontrol"); } public void Populate(List> accessLevels, IPrototypeManager prototypeManager) @@ -25,7 +31,7 @@ public void Populate(List> accessLevels, IPrototyp { if (!prototypeManager.TryIndex(access, out var accessLevel)) { - Logger.Error($"Unable to find accesslevel for {access}"); + _sawmill.Error($"Unable to find accesslevel for {access}"); continue; } From 011250f35ed90d285cb37e50949c0e086718a0e7 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sun, 14 Jul 2024 12:25:18 +0200 Subject: [PATCH 060/118] Fix AGhostCommand naming (#29945) --- .../Administration/Commands/{AGhost.cs => AGhostCommand.cs} | 3 +-- Resources/Locale/en-US/administration/commands/aghost.ftl | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename Content.Server/Administration/Commands/{AGhost.cs => AGhostCommand.cs} (97%) diff --git a/Content.Server/Administration/Commands/AGhost.cs b/Content.Server/Administration/Commands/AGhostCommand.cs similarity index 97% rename from Content.Server/Administration/Commands/AGhost.cs rename to Content.Server/Administration/Commands/AGhostCommand.cs index 935114e7a6..b24dbbc018 100644 --- a/Content.Server/Administration/Commands/AGhost.cs +++ b/Content.Server/Administration/Commands/AGhostCommand.cs @@ -12,13 +12,12 @@ namespace Content.Server.Administration.Commands; [AdminCommand(AdminFlags.Admin)] -public sealed class AGhost : LocalizedCommands +public sealed class AGhostCommand : LocalizedCommands { [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; public override string Command => "aghost"; - public override string Description => LocalizationManager.GetString("aghost-description"); public override string Help => "aghost"; public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) diff --git a/Resources/Locale/en-US/administration/commands/aghost.ftl b/Resources/Locale/en-US/administration/commands/aghost.ftl index 4de0639981..30cd893dc8 100644 --- a/Resources/Locale/en-US/administration/commands/aghost.ftl +++ b/Resources/Locale/en-US/administration/commands/aghost.ftl @@ -1,3 +1,3 @@ -aghost-description = Makes you an admin ghost. +cmd-aghost-desc = Makes you or others an admin ghost. aghost-no-mind-self = You can't ghost here! aghost-no-mind-other = They can't ghost here! From 919b3ac9e64a18990bd8dbf21eceae782e2b3f77 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sun, 14 Jul 2024 12:25:57 +0200 Subject: [PATCH 061/118] Change wristwatch meta description (#30036) --- Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml index 7fbb4aecf6..6359f659b5 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml @@ -2,7 +2,7 @@ id: Wristwatch parent: BaseItem name: wristwatch - description: A cheap watch for telling time. How much did you waste playing Space Station 14? + description: A cheap watch for telling time. How much did you waste working on this shift? components: - type: Sprite sprite: Objects/Devices/wristwatch.rsi From 4f479b6c85aec0b775062ece959b34f21171f211 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Sun, 14 Jul 2024 12:26:34 +0200 Subject: [PATCH 062/118] Fix RGB toys color when worn/in-hand (#30023) rgbeeeeeeee --- .../Prototypes/Entities/Objects/Fun/toys.yml | 22 ++++++++++++++++++ .../Textures/Objects/Fun/toys.rsi/meta.json | 8 +++++++ .../toys.rsi/rainbowcarpplush-inhand-left.png | Bin 0 -> 15498 bytes .../rainbowcarpplush-inhand-right.png | Bin 0 -> 15496 bytes 4 files changed, 30 insertions(+) create mode 100644 Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush-inhand-left.png create mode 100644 Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush-inhand-right.png diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 310f92e60c..33a322cb25 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -184,6 +184,19 @@ energy: 2 - type: RgbLightController layers: [ 0 ] + - type: Item + inhandVisuals: + left: + - state: bee-inhand-left + shader: unshaded + right: + - state: bee-inhand-right + shader: unshaded + - type: Clothing + clothingVisuals: + head: + - state: bee-equipped-HELMET + shader: unshaded - type: entity parent: BasePlushie @@ -543,6 +556,15 @@ energy: 2 - type: RgbLightController layers: [ 0 ] + - type: Item + heldPrefix: rainbowcarpplush + inhandVisuals: + left: + - state: rainbowcarpplush-inhand-left + shader: unshaded + right: + - state: rainbowcarpplush-inhand-right + shader: unshaded - type: entity parent: PlushieCarp diff --git a/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Resources/Textures/Objects/Fun/toys.rsi/meta.json index fc92a47936..fa118695c2 100644 --- a/Resources/Textures/Objects/Fun/toys.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/toys.rsi/meta.json @@ -53,6 +53,14 @@ { "name": "rainbowcarpplush" }, + { + "name": "rainbowcarpplush-inhand-left", + "directions": 4 + }, + { + "name": "rainbowcarpplush-inhand-right", + "directions": 4 + }, { "name": "narplush" }, diff --git a/Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush-inhand-left.png b/Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..8f28f41fd8513829dc0f926f9bd0fa46f67c05c4 GIT binary patch literal 15498 zcmeI3XHXkS7RSeHT)WHOZtd2s?{2rY>U3J1k!F+-$dUjfFxVExfK6~>B#mH+av{Zsto5kBM&o zz3;ES2!ebc6{(2@zah-uH;q9#Ytz6o@bj%TGRcl0-~FBWYlKXn`7Z)&<6+c0y#kAHiB8`m9wh?jJ z(ee81bbXM4AFTFOx)dOQnV@l=%WSgP6)qLu9ajNtrW)n*+!8un#SdjV$c-#1e%RQ%J?Us)w)k1(wogFe+j-5mnuR zHx)mPrmYGTbvm6wr$k8EQc+P*P!NiVQL$J66asseg~nY1i~V;`kk4^6gk5hVtu#ql zcuZVeM>%K}pU-sUeX8bVwt73V*sIt9il_^>q9P%N*5_oR6~xVe{tCqqgwS4EhOz-h`BPf;edXO+c# zM#u{bbFV61%LLM5pq%zrO0>31b-t^k5gME()M8956<~6KNE(lU#TW#ZWE)JZz%VF? zM_DU|mNJmWta@U|Ko}Vu15(zG0rrmpr|~}&1=d1w40?r;vYByOO`7pk0<~IFm1uP( zr1Y*TMHpqGY+zVm`bxCEYRJpI(iBk^JB?fPM3hDiDug6yP!NPptP2PT5Xdo|P5>}U z1c72gE-(b>3;`0UL@W#NK-6ks_d209l-|MYma5Q(KN%WwuM@hnjRYqhZh|z-=>KdN z^@OR@RU~N#>oW^lw_x?U&$2ioqh{^r1{3K%ldQPSPB1%8#s9qJyoZ?gjADG;J6D10 znbS# z)Z}pMe?PLq>C^mYDlnu?aZnSkXHHBZm8EWsUb(Gp~}&dD(K(2JCmMT@UZ~CQ&8`R zO3fsDH^N_RRL|%y4h)CmI)Q1h+8i!cM6iIv1=C=)Ib5uWU;&2dA8hl>>vEZ}g#G+1p87b_xI zz~O>vu-Y6hRz$FX!v)h|wK-g@h+qMS3#P$pbGTR$!2%8!OoP?taIqqS1spDz2CL2C zVnqZCI9xCdR-41ciU<~PxL_KrHiwH95iH=XafWrmT zV6{11tcYL%hYO~`YIC?)5y1iu7fgfI{vs~l>Z^Z*1>E;@f{T3>%igX4mjZeE$XG3c zWH&>QoIwauQ3-w@AczA)kcTMsFW+o7Ta`526 zptRfVp!D~fj}q}q9_WkQiwz%u~;mT zNTgD!OeO}m0GP14h{|p2?-4iZP%_{SXh`wqX`cW zkBEq9-@bihWMouSREG{7I(F>XsZ%GdRvR51-MMq;n3$L@UAn}^#>U0P#mC2Y?b@|l zw{8gu35kh`Nl8h`$;sWjckj`oN6(%;d-dwoyLa!DloTAtbvm71uQwPB1VI>$#?;i* zw6rvmB>VK~lb)V#GMUU~v&CYeC<@Ta$jAT?z?5m4b~qeh;^3mA%jL?-$^yjt_U+rR zUq1k6z<>b&S58jOz<~pEb8`m`8U$Dk88T$((4l#GdBcVc8$Nvah!G<|3Pz0@1^AC1 zJsNNxJ9g~2apT61A3tHj1dxbHlO|1`JbB8LDO0CT1=y!gpFU&8jF~fM&YCrA_Uzen z=FFKpckaA-^XAW=zhJ?Fg$oxhTC`~K;>AmrECCr`wrtt*<;z#BSg~^D%2lgYtzNyl zprByQnl)?Ju3fio-TL+GH*DBYSXj7mK79Ddkt0Ws z9zAyK*zx1XPnAmsE?vHS`O1|m zSFc{ZcJ12r>(_7GxN-C5&0Du_-M)SM&Ye4V@7}$4@813U_a8iX@bKZoM~@zrm6bhy z{P@X}Cr_U~efI3x^XJcBym$eY=*yQcU%h(u`t|EKZ{ECp`?jK@;@!J<@87@w@ZrP9 zj~_pM`czq2nb6yK5A1bZ{a@`I!c>nT>Dh{ z?|V%n2Ki0MdX#0lzR*7k)%%40_>XOQzrIm9Lw|hH_ouI%jUqC}KOF6!x-!H$uw|R# z>S0?>rY>_nf!qxgNKiY(&M9%%l-Ah6oZ6lpsPBun)10yswmX3uL9{L1PQsK*vZ7=%g>nRopKRG77E$J4ae~T#8JuCHm5R)Ak?~nE zMpIU*Nn;kb)cI-MI0#@TSwiHt+Z+t;4iO4>*}>0lY) zC#%%YX{A}3vC>rx>Fcg?V2~4o!8dlL^R?S69hzao(*c4~q?LLy#!M%P#*qx2<}#7t z>0l`hDqB5ES;~@AE)v&M<=ja(RfQYZ<8||tf;U52uvR?GMG`FSGSak7=dH5XF9=0p zVVlE6SECLw}M zYDthH$YL>RuFOOw_8d>oBv{H$o;F(?OYT%=?EL7;b#9=ho~gX zS3^Zo45-gcsBS^^dd{+VvRC=mFC8|@b0#?n7ejJ8E?E3!%lQs5-xDu&mh-05$l$|u6xT0TEtD)#GqYPmxV2ekm^MR;-`)1qIsm5uDxCvrKprFryf zIR-9N#@$O@;qHpAN#AybyDPeud3JD6EVs)&6Rpq;d2uJN_gIJrFA1bBP^D6+v}ncV ziXO3)o3thBDX@PTt||kSr9KrqDs@b%$`R@)b@ZkR`giWhq_-8kEP(eE)c2xNKFPj~ z@HZP}EBc!Q!{LNMU>dx(fQuIqED&(PGl*Hj^Z2u~<@4Qmj@h zMNvI__DoGpwb^WTyWQb%&@>I`_3G6NEFY|wW!bc}G_ZE?p`+XF&dkgN#CrGc-KS3< z0Hi9f=&)hKh7TV;V#J7%BS(Tnj2=B2@E<#N zEFe5?+_>@M$7g3}Pna+PZ{EE5^XD&EuwdcBg^Ly~TD*8MNcYmEOP4KMmYbWqeEISfD^{#rxpLL2 zRjXI8UbALRUS8hXwQJX{Tep7w`VAX4Y}~kU)223T%hs)1w{6?Def#zu zJ9ZQl6ztr&bJwn2yLa#2vu96XVd37rd-v_zw}1cs0|yQqJb3WXp+kocA3k#A$kC%m zj~zQ!R8(~Q`0*1bPMkb>^3&d2uy4LDNzs{*v^h1LrEJk!~%MZ`|P{{vh2vnK!m literal 0 HcmV?d00001 From 07535e8ecfbbba14f2845629306af192d11ffce9 Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sun, 14 Jul 2024 13:26:56 +0300 Subject: [PATCH 063/118] Clumsy proof grappling gun (#29904) Make grappling gun clumsy proof --- .../Entities/Objects/Weapons/Guns/Launchers/launchers.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index 19a0cf30e8..0ecad70a64 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -251,6 +251,7 @@ - type: Gun soundGunshot: /Audio/Weapons/Guns/Gunshots/harpoon.ogg fireRate: 0.5 + clumsyProof: true - type: BasicEntityAmmoProvider proto: GrapplingHook capacity: 1 From f90538cca79340378fdbf5ad44decba2d4a46f68 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 14 Jul 2024 10:28:02 +0000 Subject: [PATCH 064/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0a41c2e2e9..d06bda3324 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,19 +1,4 @@ Entries: -- author: Weax - changes: - - message: The CLF3 reaction now requires heating first before you can engulf chemistry - in fiery death. - type: Tweak - id: 6417 - time: '2024-04-22T08:44:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27187 -- author: Potato1234_x - changes: - - message: Added Psicodine, Mannitol, Lipolicide and Happiness. - type: Add - id: 6418 - time: '2024-04-22T08:45:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27134 - author: Terraspark4941 changes: - message: Updated the engineering section of the guidebook! @@ -3813,3 +3798,17 @@ id: 6916 time: '2024-07-14T02:59:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29979 +- author: SlamBamActionman + changes: + - message: RGBee and Rainbow Carp plushies now cycle color when held/worn. + type: Fix + id: 6917 + time: '2024-07-14T10:26:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30023 +- author: Winkarst-cpu + changes: + - message: Now grappling gun is clumsy proof. + type: Tweak + id: 6918 + time: '2024-07-14T10:26:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29904 From 7d9653fff7f7c415e317c3fab03a2162da7983bf Mon Sep 17 00:00:00 2001 From: osjarw <62134478+osjarw@users.noreply.github.com> Date: Sun, 14 Jul 2024 13:28:46 +0300 Subject: [PATCH 065/118] Fix HTN/NPC better plan selection (#30017) * recording commit * Remove debugging/recording content --- Content.Server/NPC/HTN/HTNPlanJob.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/NPC/HTN/HTNPlanJob.cs b/Content.Server/NPC/HTN/HTNPlanJob.cs index d6d10ad311..8158303524 100644 --- a/Content.Server/NPC/HTN/HTNPlanJob.cs +++ b/Content.Server/NPC/HTN/HTNPlanJob.cs @@ -160,9 +160,9 @@ private bool TryFindSatisfiedMethod(HTNCompoundTask compoundId, Queue t { var compound = _protoManager.Index(compoundId.Task); - for (var i = mtrIndex; i < compound.Branches.Count; i++) + for (; mtrIndex < compound.Branches.Count; mtrIndex++) { - var branch = compound.Branches[i]; + var branch = compound.Branches[mtrIndex]; var isValid = true; foreach (var con in branch.Preconditions) From 1c74ffb8e475d619e188864194333ca8890509e4 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sun, 14 Jul 2024 16:58:48 +0300 Subject: [PATCH 066/118] Ambient music rules refactor (#29921) * refactor * dutypo --- .../Audio/ContentAudioSystem.AmbientMusic.cs | 1 + Content.Shared/Audio/AmbientMusicPrototype.cs | 1 + Content.Shared/Random/Rules/AlwaysTrue.cs | 12 + Content.Shared/Random/Rules/GridInRange.cs | 39 +++ Content.Shared/Random/Rules/InSpace.cs | 18 ++ Content.Shared/Random/Rules/NearbyAccess.cs | 77 ++++++ .../Random/Rules/NearbyComponents.cs | 71 +++++ Content.Shared/Random/Rules/NearbyEntities.cs | 58 ++++ .../Random/Rules/NearbyTilesPercent.cs | 79 ++++++ Content.Shared/Random/Rules/OnMapGrid.cs | 19 ++ Content.Shared/Random/Rules/RulesSystem.cs | 39 +++ Content.Shared/Random/RulesPrototype.cs | 141 ---------- Content.Shared/Random/RulesSystem.cs | 247 ------------------ 13 files changed, 414 insertions(+), 388 deletions(-) create mode 100644 Content.Shared/Random/Rules/AlwaysTrue.cs create mode 100644 Content.Shared/Random/Rules/GridInRange.cs create mode 100644 Content.Shared/Random/Rules/InSpace.cs create mode 100644 Content.Shared/Random/Rules/NearbyAccess.cs create mode 100644 Content.Shared/Random/Rules/NearbyComponents.cs create mode 100644 Content.Shared/Random/Rules/NearbyEntities.cs create mode 100644 Content.Shared/Random/Rules/NearbyTilesPercent.cs create mode 100644 Content.Shared/Random/Rules/OnMapGrid.cs create mode 100644 Content.Shared/Random/Rules/RulesSystem.cs delete mode 100644 Content.Shared/Random/RulesPrototype.cs delete mode 100644 Content.Shared/Random/RulesSystem.cs diff --git a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs index 84b787a4ec..d60c978ccf 100644 --- a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs @@ -4,6 +4,7 @@ using Content.Shared.CCVar; using Content.Shared.GameTicking; using Content.Shared.Random; +using Content.Shared.Random.Rules; using Robust.Client.GameObjects; using Robust.Client.Player; using Robust.Client.ResourceManagement; diff --git a/Content.Shared/Audio/AmbientMusicPrototype.cs b/Content.Shared/Audio/AmbientMusicPrototype.cs index 54f70f5728..219c41527d 100644 --- a/Content.Shared/Audio/AmbientMusicPrototype.cs +++ b/Content.Shared/Audio/AmbientMusicPrototype.cs @@ -1,4 +1,5 @@ using Content.Shared.Random; +using Content.Shared.Random.Rules; using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; diff --git a/Content.Shared/Random/Rules/AlwaysTrue.cs b/Content.Shared/Random/Rules/AlwaysTrue.cs new file mode 100644 index 0000000000..98b81fae79 --- /dev/null +++ b/Content.Shared/Random/Rules/AlwaysTrue.cs @@ -0,0 +1,12 @@ +namespace Content.Shared.Random.Rules; + +/// +/// Always returns true. Used for fallbacks. +/// +public sealed partial class AlwaysTrueRule : RulesRule +{ + public override bool Check(EntityManager entManager, EntityUid uid) + { + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/GridInRange.cs b/Content.Shared/Random/Rules/GridInRange.cs new file mode 100644 index 0000000000..8cbbef1cdc --- /dev/null +++ b/Content.Shared/Random/Rules/GridInRange.cs @@ -0,0 +1,39 @@ +using System.Numerics; +using Robust.Shared.Map; + +namespace Content.Shared.Random.Rules; + +/// +/// Returns true if on a grid or in range of one. +/// +public sealed partial class GridInRangeRule : RulesRule +{ + [DataField] + public float Range = 10f; + + public override bool Check(EntityManager entManager, EntityUid uid) + { + if (!entManager.TryGetComponent(uid, out TransformComponent? xform)) + { + return false; + } + + if (xform.GridUid != null) + { + return !Inverted; + } + + var transform = entManager.System(); + var mapManager = IoCManager.Resolve(); + + var worldPos = transform.GetWorldPosition(xform); + var gridRange = new Vector2(Range, Range); + + foreach (var _ in mapManager.FindGridsIntersecting(xform.MapID, new Box2(worldPos - gridRange, worldPos + gridRange))) + { + return !Inverted; + } + + return false; + } +} diff --git a/Content.Shared/Random/Rules/InSpace.cs b/Content.Shared/Random/Rules/InSpace.cs new file mode 100644 index 0000000000..8163e1f6be --- /dev/null +++ b/Content.Shared/Random/Rules/InSpace.cs @@ -0,0 +1,18 @@ +namespace Content.Shared.Random.Rules; + +/// +/// Returns true if the attached entity is in space. +/// +public sealed partial class InSpaceRule : RulesRule +{ + public override bool Check(EntityManager entManager, EntityUid uid) + { + if (!entManager.TryGetComponent(uid, out TransformComponent? xform) || + xform.GridUid != null) + { + return Inverted; + } + + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/NearbyAccess.cs b/Content.Shared/Random/Rules/NearbyAccess.cs new file mode 100644 index 0000000000..2a8ad077c6 --- /dev/null +++ b/Content.Shared/Random/Rules/NearbyAccess.cs @@ -0,0 +1,77 @@ +using Content.Shared.Access; +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Random.Rules; + +/// +/// Checks for an entity nearby with the specified access. +/// +public sealed partial class NearbyAccessRule : RulesRule +{ + // This exists because of door electronics contained inside doors. + /// + /// Does the access entity need to be anchored. + /// + [DataField] + public bool Anchored = true; + + /// + /// Count of entities that need to be nearby. + /// + [DataField] + public int Count = 1; + + [DataField(required: true)] + public List> Access = new(); + + [DataField] + public float Range = 10f; + + public override bool Check(EntityManager entManager, EntityUid uid) + { + var xformQuery = entManager.GetEntityQuery(); + + if (!xformQuery.TryGetComponent(uid, out var xform) || + xform.MapUid == null) + { + return false; + } + + var transform = entManager.System(); + var lookup = entManager.System(); + var reader = entManager.System(); + + var found = false; + var worldPos = transform.GetWorldPosition(xform, xformQuery); + var count = 0; + + // TODO: Update this when we get the callback version + var entities = new HashSet>(); + lookup.GetEntitiesInRange(xform.MapID, worldPos, Range, entities); + foreach (var comp in entities) + { + if (!reader.AreAccessTagsAllowed(Access, comp) || + Anchored && + (!xformQuery.TryGetComponent(comp, out var compXform) || + !compXform.Anchored)) + { + continue; + } + + count++; + + if (count < Count) + continue; + + found = true; + break; + } + + if (!found) + return Inverted; + + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/NearbyComponents.cs b/Content.Shared/Random/Rules/NearbyComponents.cs new file mode 100644 index 0000000000..13108e88d6 --- /dev/null +++ b/Content.Shared/Random/Rules/NearbyComponents.cs @@ -0,0 +1,71 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Random.Rules; + +public sealed partial class NearbyComponentsRule : RulesRule +{ + /// + /// Does the entity need to be anchored. + /// + [DataField] + public bool Anchored; + + [DataField] + public int Count; + + [DataField(required: true)] + public ComponentRegistry Components = default!; + + [DataField] + public float Range = 10f; + + public override bool Check(EntityManager entManager, EntityUid uid) + { + var inRange = new HashSet>(); + var xformQuery = entManager.GetEntityQuery(); + + if (!xformQuery.TryGetComponent(uid, out var xform) || + xform.MapUid == null) + { + return false; + } + + var transform = entManager.System(); + var lookup = entManager.System(); + + var found = false; + var worldPos = transform.GetWorldPosition(xform); + var count = 0; + + foreach (var compType in Components.Values) + { + inRange.Clear(); + lookup.GetEntitiesInRange(compType.Component.GetType(), xform.MapID, worldPos, Range, inRange); + foreach (var comp in inRange) + { + if (Anchored && + (!xformQuery.TryGetComponent(comp, out var compXform) || + !compXform.Anchored)) + { + continue; + } + + count++; + + if (count < Count) + continue; + + found = true; + break; + } + + if (found) + break; + } + + if (!found) + return Inverted; + + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/NearbyEntities.cs b/Content.Shared/Random/Rules/NearbyEntities.cs new file mode 100644 index 0000000000..0754750bc4 --- /dev/null +++ b/Content.Shared/Random/Rules/NearbyEntities.cs @@ -0,0 +1,58 @@ +using Content.Shared.Whitelist; + +namespace Content.Shared.Random.Rules; + +/// +/// Checks for entities matching the whitelist in range. +/// This is more expensive than so prefer that! +/// +public sealed partial class NearbyEntitiesRule : RulesRule +{ + /// + /// How many of the entity need to be nearby. + /// + [DataField] + public int Count = 1; + + [DataField(required: true)] + public EntityWhitelist Whitelist = new(); + + [DataField] + public float Range = 10f; + + public override bool Check(EntityManager entManager, EntityUid uid) + { + if (!entManager.TryGetComponent(uid, out TransformComponent? xform) || + xform.MapUid == null) + { + return false; + } + + var transform = entManager.System(); + var lookup = entManager.System(); + var whitelistSystem = entManager.System(); + + var found = false; + var worldPos = transform.GetWorldPosition(xform); + var count = 0; + + foreach (var ent in lookup.GetEntitiesInRange(xform.MapID, worldPos, Range)) + { + if (whitelistSystem.IsWhitelistFail(Whitelist, ent)) + continue; + + count++; + + if (count < Count) + continue; + + found = true; + break; + } + + if (!found) + return Inverted; + + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/NearbyTilesPercent.cs b/Content.Shared/Random/Rules/NearbyTilesPercent.cs new file mode 100644 index 0000000000..465ac8dc5c --- /dev/null +++ b/Content.Shared/Random/Rules/NearbyTilesPercent.cs @@ -0,0 +1,79 @@ +using Content.Shared.Maps; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Random.Rules; + +public sealed partial class NearbyTilesPercentRule : RulesRule +{ + /// + /// If there are anchored entities on the tile do we ignore the tile. + /// + [DataField] + public bool IgnoreAnchored; + + [DataField(required: true)] + public float Percent; + + [DataField(required: true)] + public List> Tiles = new(); + + [DataField] + public float Range = 10f; + + public override bool Check(EntityManager entManager, EntityUid uid) + { + if (!entManager.TryGetComponent(uid, out TransformComponent? xform) || + !entManager.TryGetComponent(xform.GridUid, out var grid)) + { + return false; + } + + var transform = entManager.System(); + var tileDef = IoCManager.Resolve(); + + var physicsQuery = entManager.GetEntityQuery(); + var tileCount = 0; + var matchingTileCount = 0; + + foreach (var tile in grid.GetTilesIntersecting(new Circle(transform.GetWorldPosition(xform), + Range))) + { + // Only consider collidable anchored (for reasons some subfloor stuff has physics but non-collidable) + if (IgnoreAnchored) + { + var gridEnum = grid.GetAnchoredEntitiesEnumerator(tile.GridIndices); + var found = false; + + while (gridEnum.MoveNext(out var ancUid)) + { + if (!physicsQuery.TryGetComponent(ancUid, out var physics) || + !physics.CanCollide) + { + continue; + } + + found = true; + break; + } + + if (found) + continue; + } + + tileCount++; + + if (!Tiles.Contains(tileDef[tile.Tile.TypeId].ID)) + continue; + + matchingTileCount++; + } + + if (tileCount == 0 || matchingTileCount / (float) tileCount < Percent) + return Inverted; + + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/OnMapGrid.cs b/Content.Shared/Random/Rules/OnMapGrid.cs new file mode 100644 index 0000000000..bea841872e --- /dev/null +++ b/Content.Shared/Random/Rules/OnMapGrid.cs @@ -0,0 +1,19 @@ +namespace Content.Shared.Random.Rules; + +/// +/// Returns true if griduid and mapuid match (AKA on 'planet'). +/// +public sealed partial class OnMapGridRule : RulesRule +{ + public override bool Check(EntityManager entManager, EntityUid uid) + { + if (!entManager.TryGetComponent(uid, out TransformComponent? xform) || + xform.GridUid != xform.MapUid || + xform.MapUid == null) + { + return Inverted; + } + + return !Inverted; + } +} diff --git a/Content.Shared/Random/Rules/RulesSystem.cs b/Content.Shared/Random/Rules/RulesSystem.cs new file mode 100644 index 0000000000..1957beab51 --- /dev/null +++ b/Content.Shared/Random/Rules/RulesSystem.cs @@ -0,0 +1,39 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Random.Rules; + +/// +/// Rules-based item selection. Can be used for any sort of conditional selection +/// Every single condition needs to be true for this to be selected. +/// e.g. "choose maintenance audio if 90% of tiles nearby are maintenance tiles" +/// +[Prototype("rules")] +public sealed partial class RulesPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = string.Empty; + + [DataField("rules", required: true)] + public List Rules = new(); +} + +[ImplicitDataDefinitionForInheritors] +public abstract partial class RulesRule +{ + [DataField] + public bool Inverted; + public abstract bool Check(EntityManager entManager, EntityUid uid); +} + +public sealed class RulesSystem : EntitySystem +{ + public bool IsTrue(EntityUid uid, RulesPrototype rules) + { + foreach (var rule in rules.Rules) + { + if (!rule.Check(EntityManager, uid)) + return false; + } + + return true; + } +} diff --git a/Content.Shared/Random/RulesPrototype.cs b/Content.Shared/Random/RulesPrototype.cs deleted file mode 100644 index 20961af8e7..0000000000 --- a/Content.Shared/Random/RulesPrototype.cs +++ /dev/null @@ -1,141 +0,0 @@ -using Content.Shared.Access; -using Content.Shared.Maps; -using Content.Shared.Whitelist; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Shared.Random; - -/// -/// Rules-based item selection. Can be used for any sort of conditional selection -/// Every single condition needs to be true for this to be selected. -/// e.g. "choose maintenance audio if 90% of tiles nearby are maintenance tiles" -/// -[Prototype("rules")] -public sealed partial class RulesPrototype : IPrototype -{ - [IdDataField] public string ID { get; } = string.Empty; - - [DataField("rules", required: true)] - public List Rules = new(); -} - -[ImplicitDataDefinitionForInheritors] -public abstract partial class RulesRule -{ - -} - -/// -/// Returns true if the attached entity is in space. -/// -public sealed partial class InSpaceRule : RulesRule -{ - -} - -/// -/// Checks for entities matching the whitelist in range. -/// This is more expensive than so prefer that! -/// -public sealed partial class NearbyEntitiesRule : RulesRule -{ - /// - /// How many of the entity need to be nearby. - /// - [DataField("count")] - public int Count = 1; - - [DataField("whitelist", required: true)] - public EntityWhitelist Whitelist = new(); - - [DataField("range")] - public float Range = 10f; -} - -public sealed partial class NearbyTilesPercentRule : RulesRule -{ - /// - /// If there are anchored entities on the tile do we ignore the tile. - /// - [DataField("ignoreAnchored")] public bool IgnoreAnchored; - - [DataField("percent", required: true)] - public float Percent; - - [DataField("tiles", required: true, customTypeSerializer:typeof(PrototypeIdListSerializer))] - public List Tiles = new(); - - [DataField("range")] - public float Range = 10f; -} - -/// -/// Always returns true. Used for fallbacks. -/// -public sealed partial class AlwaysTrueRule : RulesRule -{ - -} - -/// -/// Returns true if on a grid or in range of one. -/// -public sealed partial class GridInRangeRule : RulesRule -{ - [DataField("range")] - public float Range = 10f; - - [DataField("inverted")] - public bool Inverted = false; -} - -/// -/// Returns true if griduid and mapuid match (AKA on 'planet'). -/// -public sealed partial class OnMapGridRule : RulesRule -{ - -} - -/// -/// Checks for an entity nearby with the specified access. -/// -public sealed partial class NearbyAccessRule : RulesRule -{ - // This exists because of doorelectronics contained inside doors. - /// - /// Does the access entity need to be anchored. - /// - [DataField("anchored")] - public bool Anchored = true; - - /// - /// Count of entities that need to be nearby. - /// - [DataField("count")] - public int Count = 1; - - [DataField("access", required: true)] - public List> Access = new(); - - [DataField("range")] - public float Range = 10f; -} - -public sealed partial class NearbyComponentsRule : RulesRule -{ - /// - /// Does the entity need to be anchored. - /// - [DataField("anchored")] - public bool Anchored; - - [DataField("count")] public int Count; - - [DataField("components", required: true)] - public ComponentRegistry Components = default!; - - [DataField("range")] - public float Range = 10f; -} diff --git a/Content.Shared/Random/RulesSystem.cs b/Content.Shared/Random/RulesSystem.cs deleted file mode 100644 index 58d67c268e..0000000000 --- a/Content.Shared/Random/RulesSystem.cs +++ /dev/null @@ -1,247 +0,0 @@ -using System.Numerics; -using Content.Shared.Access.Components; -using Content.Shared.Access.Systems; -using Content.Shared.Whitelist; -using Robust.Shared.Map; -using Robust.Shared.Map.Components; -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Random; - -public sealed class RulesSystem : EntitySystem -{ - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly ITileDefinitionManager _tileDef = default!; - [Dependency] private readonly AccessReaderSystem _reader = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; - public bool IsTrue(EntityUid uid, RulesPrototype rules) - { - var inRange = new HashSet>(); - foreach (var rule in rules.Rules) - { - switch (rule) - { - case AlwaysTrueRule: - break; - case GridInRangeRule griddy: - { - if (!TryComp(uid, out TransformComponent? xform)) - { - return false; - } - - if (xform.GridUid != null) - { - return !griddy.Inverted; - } - - var worldPos = _transform.GetWorldPosition(xform); - var gridRange = new Vector2(griddy.Range, griddy.Range); - - foreach (var _ in _mapManager.FindGridsIntersecting( - xform.MapID, - new Box2(worldPos - gridRange, worldPos + gridRange))) - { - return !griddy.Inverted; - } - - break; - } - case InSpaceRule: - { - if (!TryComp(uid, out TransformComponent? xform) || - xform.GridUid != null) - { - return false; - } - - break; - } - case NearbyAccessRule access: - { - var xformQuery = GetEntityQuery(); - - if (!xformQuery.TryGetComponent(uid, out var xform) || - xform.MapUid == null) - { - return false; - } - - var found = false; - var worldPos = _transform.GetWorldPosition(xform, xformQuery); - var count = 0; - - // TODO: Update this when we get the callback version - var entities = new HashSet>(); - _lookup.GetEntitiesInRange(xform.MapID, worldPos, access.Range, entities); - foreach (var comp in entities) - { - if (!_reader.AreAccessTagsAllowed(access.Access, comp) || - access.Anchored && - (!xformQuery.TryGetComponent(comp, out var compXform) || - !compXform.Anchored)) - { - continue; - } - - count++; - - if (count < access.Count) - continue; - - found = true; - break; - } - - if (!found) - return false; - - break; - } - case NearbyComponentsRule nearbyComps: - { - var xformQuery = GetEntityQuery(); - - if (!xformQuery.TryGetComponent(uid, out var xform) || - xform.MapUid == null) - { - return false; - } - - var found = false; - var worldPos = _transform.GetWorldPosition(xform); - var count = 0; - - foreach (var compType in nearbyComps.Components.Values) - { - inRange.Clear(); - _lookup.GetEntitiesInRange(compType.Component.GetType(), xform.MapID, worldPos, nearbyComps.Range, inRange); - foreach (var comp in inRange) - { - if (nearbyComps.Anchored && - (!xformQuery.TryGetComponent(comp, out var compXform) || - !compXform.Anchored)) - { - continue; - } - - count++; - - if (count < nearbyComps.Count) - continue; - - found = true; - break; - } - - if (found) - break; - } - - if (!found) - return false; - - break; - } - case NearbyEntitiesRule entity: - { - if (!TryComp(uid, out TransformComponent? xform) || - xform.MapUid == null) - { - return false; - } - - var found = false; - var worldPos = _transform.GetWorldPosition(xform); - var count = 0; - - foreach (var ent in _lookup.GetEntitiesInRange(xform.MapID, worldPos, entity.Range)) - { - if (_whitelistSystem.IsWhitelistFail(entity.Whitelist, ent)) - continue; - - count++; - - if (count < entity.Count) - continue; - - found = true; - break; - } - - if (!found) - return false; - - break; - } - case NearbyTilesPercentRule tiles: - { - if (!TryComp(uid, out TransformComponent? xform) || - !TryComp(xform.GridUid, out var grid)) - { - return false; - } - - var physicsQuery = GetEntityQuery(); - var tileCount = 0; - var matchingTileCount = 0; - - foreach (var tile in grid.GetTilesIntersecting(new Circle(_transform.GetWorldPosition(xform), - tiles.Range))) - { - // Only consider collidable anchored (for reasons some subfloor stuff has physics but non-collidable) - if (tiles.IgnoreAnchored) - { - var gridEnum = grid.GetAnchoredEntitiesEnumerator(tile.GridIndices); - var found = false; - - while (gridEnum.MoveNext(out var ancUid)) - { - if (!physicsQuery.TryGetComponent(ancUid, out var physics) || - !physics.CanCollide) - { - continue; - } - - found = true; - break; - } - - if (found) - continue; - } - - tileCount++; - - if (!tiles.Tiles.Contains(_tileDef[tile.Tile.TypeId].ID)) - continue; - - matchingTileCount++; - } - - if (tileCount == 0 || matchingTileCount / (float) tileCount < tiles.Percent) - return false; - - break; - } - case OnMapGridRule: - { - if (!TryComp(uid, out TransformComponent? xform) || - xform.GridUid != xform.MapUid || - xform.MapUid == null) - { - return false; - } - - break; - } - default: - throw new NotImplementedException(); - } - } - - return true; - } -} From a0052c5b0996dd88a4ed2d4fd5c8c15a030e8e93 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Sun, 14 Jul 2024 10:08:39 -0400 Subject: [PATCH 067/118] Prevent virtual item storage and popups (#30020) * Prevent virtual item storage and popups * fix typo * add comment --- Content.Shared/Interaction/SmartEquipSystem.cs | 11 ++++++----- .../Inventory/VirtualItem/SharedVirtualItemSystem.cs | 8 ++++++++ .../Prototypes/Entities/Virtual/virtual_item.yml | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Interaction/SmartEquipSystem.cs b/Content.Shared/Interaction/SmartEquipSystem.cs index bba294db28..4feb0445f8 100644 --- a/Content.Shared/Interaction/SmartEquipSystem.cs +++ b/Content.Shared/Interaction/SmartEquipSystem.cs @@ -62,21 +62,22 @@ private void HandleSmartEquip(ICommonSession? session, string equipmentSlot) if (playerSession.AttachedEntity is not { Valid: true } uid || !Exists(uid)) return; - if (!_actionBlocker.CanInteract(uid, null)) - return; - // early out if we don't have any hands or a valid inventory slot if (!TryComp(uid, out var hands) || hands.ActiveHand == null) return; + var handItem = hands.ActiveHand.HeldEntity; + + // can the user interact, and is the item interactable? e.g. virtual items + if (!_actionBlocker.CanInteract(uid, handItem)) + return; + if (!TryComp(uid, out var inventory) || !_inventory.HasSlot(uid, equipmentSlot, inventory)) { _popup.PopupClient(Loc.GetString("smart-equip-missing-equipment-slot", ("slotName", equipmentSlot)), uid, uid); return; } - var handItem = hands.ActiveHand.HeldEntity; - // early out if we have an item and cant drop it at all if (handItem != null && !_hands.CanDropHeld(uid, hands.ActiveHand)) { diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index cd0863ec88..8b9c052c8d 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Hands; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Popups; @@ -43,6 +44,7 @@ public override void Initialize() SubscribeLocalEvent(OnBeingUnequippedAttempt); SubscribeLocalEvent(OnBeforeRangedInteract); + SubscribeLocalEvent(OnGettingInteractedWithAttemptEvent); } /// @@ -72,6 +74,12 @@ private void OnBeforeRangedInteract(Entity ent, ref Before args.Handled = true; } + private void OnGettingInteractedWithAttemptEvent(Entity ent, ref GettingInteractedWithAttemptEvent args) + { + // No interactions with a virtual item, please. + args.Cancelled = true; + } + #region Hands /// diff --git a/Resources/Prototypes/Entities/Virtual/virtual_item.yml b/Resources/Prototypes/Entities/Virtual/virtual_item.yml index ed74243550..088de6a6da 100644 --- a/Resources/Prototypes/Entities/Virtual/virtual_item.yml +++ b/Resources/Prototypes/Entities/Virtual/virtual_item.yml @@ -5,4 +5,5 @@ noSpawn: true components: - type: Item + size: Ginormous # no storage insertion visuals - type: VirtualItem From b6115b672aa6a67e693c8ac21ada4083f5eb0871 Mon Sep 17 00:00:00 2001 From: CookieMasterT <124045269+CookieMasterT@users.noreply.github.com> Date: Sun, 14 Jul 2024 16:09:41 +0200 Subject: [PATCH 068/118] Add petting cyborgs (#30037) added petting borgs, adjusted interactions --- .../interaction-popup-component.ftl | 14 ++++++ .../Mobs/Cyborgs/base_borg_chassis.yml | 1 + .../Entities/Mobs/Cyborgs/borg_chassis.yml | 45 +++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index 55be1fb3b9..10773d6de8 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -60,12 +60,26 @@ petting-success-honkbot = You pet {THE($target)} on {POSS-ADJ($target)} slippery petting-success-mimebot = You pet {THE($target)} on {POSS-ADJ($target)} cold metal head. petting-success-cleanbot = You pet {THE($target)} on {POSS-ADJ($target)} damp metal head. petting-success-medibot = You pet {THE($target)} on {POSS-ADJ($target)} sterile metal head. +petting-success-generic-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} metal head. +petting-success-salvage-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} dirty metal head. +petting-success-engineer-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} reflective metal head. +petting-success-janitor-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} damp metal head. +petting-success-medical-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} sterile metal head. +petting-success-service-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} dapper looking metal head. +petting-success-syndicate-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} menacing metal head. petting-success-recycler = You pet {THE($target)} on {POSS-ADJ($target)} mildly threatening steel exterior. petting-failure-honkbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BASIC($target, "honk", "honks")} in refusal! petting-failure-cleanbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy mopping! petting-failure-mimebot = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy miming! petting-failure-medibot = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} syringe nearly stabs your hand! +petting-failure-generic-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy stating laws! +petting-failure-salvage-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy drilling! +petting-failure-engineer-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy repairing! +petting-failure-janitor-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy cleaning! +petting-failure-medical-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy saving lives! +petting-failure-service-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy serving others! +petting-failure-syndicate-cyborg = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} treacherous affiliation makes you reconsider. ## Rattling fences diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 6656a7aadb..2618207b7a 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -150,6 +150,7 @@ - type: Lock locked: true breakOnEmag: false + unlockOnClick: false - type: ActivatableUIRequiresLock - type: LockedWiresPanel - type: Damageable diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml index 075ac534c6..3a17869dc8 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml @@ -29,6 +29,11 @@ node: cyborg - type: Speech speechVerb: Robotic + - type: InteractionPopup + interactSuccessString: petting-success-generic-cyborg + interactFailureString: petting-failure-generic-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisMining @@ -85,6 +90,11 @@ access: [["Cargo"], ["Salvage"], ["Command"], ["Research"]] - type: Inventory templateId: borgTall + - type: InteractionPopup + interactSuccessString: petting-success-salvage-cyborg + interactFailureString: petting-failure-salvage-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisEngineer @@ -133,6 +143,11 @@ access: [["Engineering"], ["Command"], ["Research"]] - type: Inventory templateId: borgShort + - type: InteractionPopup + interactSuccessString: petting-success-engineer-cyborg + interactFailureString: petting-failure-engineer-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisJanitor @@ -189,6 +204,11 @@ access: [["Service"], ["Command"], ["Research"]] - type: Inventory templateId: borgShort + - type: InteractionPopup + interactSuccessString: petting-success-janitor-cyborg + interactFailureString: petting-failure-janitor-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisMedical @@ -248,6 +268,11 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepHoverBorg + - type: InteractionPopup + interactSuccessString: petting-success-medical-cyborg + interactFailureString: petting-failure-medical-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisService @@ -296,6 +321,11 @@ access: [["Service"], ["Command"], ["Research"]] - type: Inventory templateId: borgTall + - type: InteractionPopup + interactSuccessString: petting-success-service-cyborg + interactFailureString: petting-failure-service-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisSyndicateAssault @@ -325,6 +355,11 @@ noMindState: synd_sec - type: Construction node: syndicateassault + - type: InteractionPopup + interactSuccessString: petting-success-syndicate-cyborg + interactFailureString: petting-failure-syndicate-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisSyndicateMedical @@ -357,6 +392,11 @@ - type: ShowHealthBars damageContainers: - Biological + - type: InteractionPopup + interactSuccessString: petting-success-syndicate-cyborg + interactFailureString: petting-failure-syndicate-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg - type: entity id: BorgChassisSyndicateSaboteur @@ -390,3 +430,8 @@ damageContainers: - Inorganic - Silicon + - type: InteractionPopup + interactSuccessString: petting-success-syndicate-cyborg + interactFailureString: petting-failure-syndicate-cyborg + interactSuccessSound: + path: /Audio/Ambience/Objects/periodic_beep.ogg From f6d827f5d98c772b38c8fdc960be2f0a4026c6bf Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 14 Jul 2024 14:10:48 +0000 Subject: [PATCH 069/118] 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 d06bda3324..f0ef8806ad 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Terraspark4941 - changes: - - message: Updated the engineering section of the guidebook! - type: Tweak - id: 6419 - time: '2024-04-22T08:58:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26851 - author: eclips_e changes: - message: Slimepeople can now morph into a "geras"--a smaller slime form that can @@ -3812,3 +3805,12 @@ id: 6918 time: '2024-07-14T10:26:56.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29904 +- author: HahayesSiH + changes: + - message: It is now possible to pet cyborgs. + type: Add + - message: Clicking on cyborgs and opening the strip menu no longer unlocks them. + type: Tweak + id: 6919 + time: '2024-07-14T14:09:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30037 From 35cd013e88091311fb2c179aa8523f9d68f78bc1 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 14 Jul 2024 15:11:40 +0000 Subject: [PATCH 070/118] make ninja shoes magboots (#28586) Co-authored-by: deltanedas <@deltanedas:kde.org> --- Resources/Prototypes/Entities/Clothing/Shoes/specific.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index 4ae752345a..80d5eab249 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -121,6 +121,7 @@ - type: Clothing sprite: Clothing/Shoes/Specific/spaceninja.rsi - type: NoSlip + - type: Magboots # always have gravity because le suction cups - type: ClothingSpeedModifier # ninja are masters of sneaking around relatively quickly, won't break cloak walkModifier: 1.1 From 3b85b1e43e16a8d183fca4438e8d0eabb57900dc Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sun, 14 Jul 2024 17:12:25 +0200 Subject: [PATCH 071/118] make scarves eatable again (#29959) --- .../Prototypes/Entities/Clothing/Neck/base_clothingneck.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Clothing/Neck/base_clothingneck.yml b/Resources/Prototypes/Entities/Clothing/Neck/base_clothingneck.yml index d2fffb8153..d7f04f49bc 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/base_clothingneck.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/base_clothingneck.yml @@ -38,3 +38,4 @@ - type: Tag tags: - Scarf + - ClothMade From 17c23f11c5c798814c2d948af02f958e6384a779 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 14 Jul 2024 15:13:31 +0000 Subject: [PATCH 072/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 37 ++++++++++++------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f0ef8806ad..0b965b1970 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,27 +1,4 @@ Entries: -- author: eclips_e - changes: - - message: Slimepeople can now morph into a "geras"--a smaller slime form that can - pass under grilles, at the cost of dropping all of their inventory. They can - also be picked up with two hands and placed into duffelbags. - type: Add - - message: Slimepeople now have an internal 2x2 storage that they (and anyone around - them) can access. It is not dropped when morphing into a geras! - type: Add - - message: Slimepeople now have slightly increased regeneration and a slightly meatier - punch, but slower attacks. - type: Add - id: 6420 - time: '2024-04-22T10:03:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23425 -- author: FungiFellow - changes: - - message: Syndi-Cats are now 6TC, Insulated, Available to Syndies, Can Move in - Space, Open Doors, and Hit Harder - type: Tweak - id: 6421 - time: '2024-04-22T12:18:28.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27222 - author: Tayrtahn changes: - message: Ghosts can no longer trigger artifacts by examining them. @@ -3814,3 +3791,17 @@ id: 6919 time: '2024-07-14T14:09:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30037 +- author: deltanedas + changes: + - message: Fixed ninja shoes not working as magboots. + type: Fix + id: 6920 + time: '2024-07-14T15:11:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28586 +- author: lzk228 + changes: + - message: Scarves are eatable again. + type: Fix + id: 6921 + time: '2024-07-14T15:12:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29959 From b7d3964c5672bc3fe0ee683ad168cb3f8d74b335 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 15 Jul 2024 00:07:48 +0200 Subject: [PATCH 073/118] Fix AccessLevelControl breaking (#30045) #29987 did an oopsie This broke the ID computer, station records, and maybe some others too. --- Content.Client/Access/UI/AccessLevelControl.xaml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Client/Access/UI/AccessLevelControl.xaml.cs b/Content.Client/Access/UI/AccessLevelControl.xaml.cs index 9f09eceec0..12487b2e5c 100644 --- a/Content.Client/Access/UI/AccessLevelControl.xaml.cs +++ b/Content.Client/Access/UI/AccessLevelControl.xaml.cs @@ -21,6 +21,7 @@ public sealed partial class AccessLevelControl : GridContainer public AccessLevelControl() { RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); _sawmill = _logManager.GetSawmill("accesslevelcontrol"); } From eb3b2ae01a1fcefa82f1e05e969c990e60e75b82 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 15 Jul 2024 16:32:12 +0200 Subject: [PATCH 074/118] Update host key for changelog RSS (#30068) --- Tools/actions_changelog_rss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/actions_changelog_rss.py b/Tools/actions_changelog_rss.py index 01ca7852cc..5c696f5b01 100755 --- a/Tools/actions_changelog_rss.py +++ b/Tools/actions_changelog_rss.py @@ -35,7 +35,7 @@ RSS_FILE = "changelog.xml" XSL_FILE = "stylesheet.xsl" HOST_KEYS = [ - "AAAAC3NzaC1lZDI1NTE5AAAAIEE8EhnPjb3nIaAPTXAJHbjrwdGGxHoM0f1imCK0SygD" + "AAAAC3NzaC1lZDI1NTE5AAAAIOBpGO/Qc6X0YWuw7z+/WS/65+aewWI29oAyx+jJpCmh" ] # RSS feed parameters, change these From c0593fb32808de845d26f851d7c7b02953039039 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 15 Jul 2024 16:55:05 +0200 Subject: [PATCH 075/118] Fix invalid UI hover/click sounds breaking client (#30067) fixes #29561 --- Content.Client/Audio/AudioUIController.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Content.Client/Audio/AudioUIController.cs b/Content.Client/Audio/AudioUIController.cs index ef903672fd..16e1edd252 100644 --- a/Content.Client/Audio/AudioUIController.cs +++ b/Content.Client/Audio/AudioUIController.cs @@ -54,7 +54,7 @@ private void SetClickSound(string value) { if (!string.IsNullOrEmpty(value)) { - var resource = _cache.GetResource(value); + var resource = GetSoundOrFallback(value, CCVars.UIClickSound.DefaultValue); var source = _audioManager.CreateAudioSource(resource); @@ -77,7 +77,7 @@ private void SetHoverSound(string value) { if (!string.IsNullOrEmpty(value)) { - var hoverResource = _cache.GetResource(value); + var hoverResource = GetSoundOrFallback(value, CCVars.UIHoverSound.DefaultValue); var hoverSource = _audioManager.CreateAudioSource(hoverResource); @@ -95,4 +95,12 @@ private void SetHoverSound(string value) UIManager.SetHoverSound(null); } } + + private AudioResource GetSoundOrFallback(string path, string fallback) + { + if (!_cache.TryGetResource(path, out AudioResource? resource)) + return _cache.GetResource(fallback); + + return resource; + } } From b35539db4a800559926a6e998b7f38e5cfc9365e Mon Sep 17 00:00:00 2001 From: Simon <63975668+Simyon264@users.noreply.github.com> Date: Mon, 15 Jul 2024 21:14:37 +0200 Subject: [PATCH 076/118] Fix some markup related obsolete warnings in research and anomaly related systems (#30072) Fix some Markup related obsolete warnings in Research and Anomaly related systems --- .../UI/DiskConsoleBoundUserInterface.cs | 1 - .../UI/ResearchClientBoundUserInterface.cs | 1 - .../UI/ResearchConsoleBoundUserInterface.cs | 1 - .../Research/UI/ResearchConsoleMenu.xaml.cs | 4 +- .../Research/UI/TechnologyCardControl.xaml.cs | 2 +- .../Anomaly/AnomalySystem.Scanner.cs | 40 +++++++++---------- 6 files changed, 23 insertions(+), 26 deletions(-) diff --git a/Content.Client/Research/UI/DiskConsoleBoundUserInterface.cs b/Content.Client/Research/UI/DiskConsoleBoundUserInterface.cs index da008ca04c..c14a8c5bd0 100644 --- a/Content.Client/Research/UI/DiskConsoleBoundUserInterface.cs +++ b/Content.Client/Research/UI/DiskConsoleBoundUserInterface.cs @@ -1,6 +1,5 @@ using Content.Shared.Research; using Content.Shared.Research.Components; -using Robust.Client.GameObjects; namespace Content.Client.Research.UI { diff --git a/Content.Client/Research/UI/ResearchClientBoundUserInterface.cs b/Content.Client/Research/UI/ResearchClientBoundUserInterface.cs index 07dd35a005..a0a2b58e88 100644 --- a/Content.Client/Research/UI/ResearchClientBoundUserInterface.cs +++ b/Content.Client/Research/UI/ResearchClientBoundUserInterface.cs @@ -1,5 +1,4 @@ using Content.Shared.Research.Components; -using Robust.Client.GameObjects; namespace Content.Client.Research.UI { diff --git a/Content.Client/Research/UI/ResearchConsoleBoundUserInterface.cs b/Content.Client/Research/UI/ResearchConsoleBoundUserInterface.cs index f29e66baae..2a9782045b 100644 --- a/Content.Client/Research/UI/ResearchConsoleBoundUserInterface.cs +++ b/Content.Client/Research/UI/ResearchConsoleBoundUserInterface.cs @@ -1,6 +1,5 @@ using Content.Shared.Research.Components; using JetBrains.Annotations; -using Robust.Client.GameObjects; namespace Content.Client.Research.UI; diff --git a/Content.Client/Research/UI/ResearchConsoleMenu.xaml.cs b/Content.Client/Research/UI/ResearchConsoleMenu.xaml.cs index b364b83312..77ebe6740c 100644 --- a/Content.Client/Research/UI/ResearchConsoleMenu.xaml.cs +++ b/Content.Client/Research/UI/ResearchConsoleMenu.xaml.cs @@ -81,7 +81,7 @@ public void UpdatePanels(ResearchConsoleBoundInterfaceState state) public void UpdateInformationPanel(ResearchConsoleBoundInterfaceState state) { var amountMsg = new FormattedMessage(); - amountMsg.AddMarkup(Loc.GetString("research-console-menu-research-points-text", + amountMsg.AddMarkupOrThrow(Loc.GetString("research-console-menu-research-points-text", ("points", state.Points))); ResearchAmountLabel.SetMessage(amountMsg); @@ -98,7 +98,7 @@ public void UpdateInformationPanel(ResearchConsoleBoundInterfaceState state) } var msg = new FormattedMessage(); - msg.AddMarkup(Loc.GetString("research-console-menu-main-discipline", + msg.AddMarkupOrThrow(Loc.GetString("research-console-menu-main-discipline", ("name", disciplineText), ("color", disciplineColor))); MainDisciplineLabel.SetMessage(msg); diff --git a/Content.Client/Research/UI/TechnologyCardControl.xaml.cs b/Content.Client/Research/UI/TechnologyCardControl.xaml.cs index f547457203..292ed0ebe0 100644 --- a/Content.Client/Research/UI/TechnologyCardControl.xaml.cs +++ b/Content.Client/Research/UI/TechnologyCardControl.xaml.cs @@ -23,7 +23,7 @@ public TechnologyCardControl(TechnologyPrototype technology, IPrototypeManager p DisciplineTexture.Texture = spriteSys.Frame0(discipline.Icon); TechnologyNameLabel.Text = Loc.GetString(technology.Name); var message = new FormattedMessage(); - message.AddMarkup(Loc.GetString("research-console-tier-discipline-info", + message.AddMarkupOrThrow(Loc.GetString("research-console-tier-discipline-info", ("tier", technology.Tier), ("color", discipline.Color), ("discipline", Loc.GetString(discipline.Name)))); TierLabel.SetMessage(message); UnlocksLabel.SetMessage(description); diff --git a/Content.Server/Anomaly/AnomalySystem.Scanner.cs b/Content.Server/Anomaly/AnomalySystem.Scanner.cs index 39c0d08b55..65d79de60c 100644 --- a/Content.Server/Anomaly/AnomalySystem.Scanner.cs +++ b/Content.Server/Anomaly/AnomalySystem.Scanner.cs @@ -141,7 +141,7 @@ public FormattedMessage GetScannerMessage(AnomalyScannerComponent component) var msg = new FormattedMessage(); if (component.ScannedAnomaly is not { } anomaly || !TryComp(anomaly, out var anomalyComp)) { - msg.AddMarkup(Loc.GetString("anomaly-scanner-no-anomaly")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-no-anomaly")); return msg; } @@ -149,14 +149,14 @@ public FormattedMessage GetScannerMessage(AnomalyScannerComponent component) //Severity if (secret != null && secret.Secret.Contains(AnomalySecretData.Severity)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-severity-percentage-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-severity-percentage-unknown")); else - msg.AddMarkup(Loc.GetString("anomaly-scanner-severity-percentage", ("percent", anomalyComp.Severity.ToString("P")))); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-severity-percentage", ("percent", anomalyComp.Severity.ToString("P")))); msg.PushNewline(); //Stability if (secret != null && secret.Secret.Contains(AnomalySecretData.Stability)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-stability-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-stability-unknown")); else { string stateLoc; @@ -166,54 +166,54 @@ public FormattedMessage GetScannerMessage(AnomalyScannerComponent component) stateLoc = Loc.GetString("anomaly-scanner-stability-high"); else stateLoc = Loc.GetString("anomaly-scanner-stability-medium"); - msg.AddMarkup(stateLoc); + msg.AddMarkupOrThrow(stateLoc); } msg.PushNewline(); //Point output if (secret != null && secret.Secret.Contains(AnomalySecretData.OutputPoint)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-point-output-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-point-output-unknown")); else - msg.AddMarkup(Loc.GetString("anomaly-scanner-point-output", ("point", GetAnomalyPointValue(anomaly, anomalyComp)))); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-point-output", ("point", GetAnomalyPointValue(anomaly, anomalyComp)))); msg.PushNewline(); msg.PushNewline(); //Particles title - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-readout")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-readout")); msg.PushNewline(); //Danger if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleDanger)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-danger-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-danger-unknown")); else - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-danger", ("type", GetParticleLocale(anomalyComp.SeverityParticleType)))); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-danger", ("type", GetParticleLocale(anomalyComp.SeverityParticleType)))); msg.PushNewline(); //Unstable if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleUnstable)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-unstable-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-unstable-unknown")); else - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-unstable", ("type", GetParticleLocale(anomalyComp.DestabilizingParticleType)))); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-unstable", ("type", GetParticleLocale(anomalyComp.DestabilizingParticleType)))); msg.PushNewline(); //Containment if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleContainment)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-containment-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-containment-unknown")); else - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-containment", ("type", GetParticleLocale(anomalyComp.WeakeningParticleType)))); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-containment", ("type", GetParticleLocale(anomalyComp.WeakeningParticleType)))); msg.PushNewline(); //Transformation if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleTransformation)) - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-transformation-unknown")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-transformation-unknown")); else - msg.AddMarkup(Loc.GetString("anomaly-scanner-particle-transformation", ("type", GetParticleLocale(anomalyComp.TransformationParticleType)))); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-transformation", ("type", GetParticleLocale(anomalyComp.TransformationParticleType)))); //Behavior msg.PushNewline(); msg.PushNewline(); - msg.AddMarkup(Loc.GetString("anomaly-behavior-title")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-behavior-title")); msg.PushNewline(); if (secret != null && secret.Secret.Contains(AnomalySecretData.Behavior)) @@ -224,14 +224,14 @@ public FormattedMessage GetScannerMessage(AnomalyScannerComponent component) { var behavior = _prototype.Index(anomalyComp.CurrentBehavior.Value); - msg.AddMarkup("- " + Loc.GetString(behavior.Description)); + msg.AddMarkupOrThrow("- " + Loc.GetString(behavior.Description)); msg.PushNewline(); var mod = Math.Floor((behavior.EarnPointModifier) * 100); - msg.AddMarkup("- " + Loc.GetString("anomaly-behavior-point", ("mod", mod))); + msg.AddMarkupOrThrow("- " + Loc.GetString("anomaly-behavior-point", ("mod", mod))); } else { - msg.AddMarkup(Loc.GetString("anomaly-behavior-balanced")); + msg.AddMarkupOrThrow(Loc.GetString("anomaly-behavior-balanced")); } } From 33a303236c010fd3a5bd41ad449ae7447ae817f2 Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:18:33 +0300 Subject: [PATCH 077/118] Make addgamerule command process only valid game rules (#29912) * addgamerule command processes only valid rules * Update * English moment --- Content.Server/GameTicking/GameTicker.GameRule.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Content.Server/GameTicking/GameTicker.GameRule.cs b/Content.Server/GameTicking/GameTicker.GameRule.cs index 2a33d01bd0..c10f302347 100644 --- a/Content.Server/GameTicking/GameTicker.GameRule.cs +++ b/Content.Server/GameTicking/GameTicker.GameRule.cs @@ -324,6 +324,13 @@ private void AddGameRuleCommand(IConsoleShell shell, string argstr, string[] arg foreach (var rule in args) { + if (!_prototypeManager.HasIndex(rule)) + { + shell.WriteError($"Invalid game rule {rule} was skipped."); + + continue; + } + if (shell.Player != null) { _adminLogger.Add(LogType.EventStarted, $"{shell.Player} tried to add game rule [{rule}] via command"); From 09a05955d7d409cac1b4be93b5c26bb52c010408 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 15 Jul 2024 19:19:40 +0000 Subject: [PATCH 078/118] 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 0b965b1970..b709a84f1f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Tayrtahn - changes: - - message: Ghosts can no longer trigger artifacts by examining them. - type: Fix - id: 6422 - time: '2024-04-22T22:46:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27249 - author: Tyzemol changes: - message: Slimes no longer absorb all items used on them @@ -3805,3 +3798,10 @@ id: 6921 time: '2024-07-14T15:12:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29959 +- author: Winkarst-cpu + changes: + - message: Now addgamerule command processes only valid game rules. + type: Fix + id: 6922 + time: '2024-07-15T19:18:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29912 From 911a94dba95e0b0ef4ae1fffc8a8c16853f49942 Mon Sep 17 00:00:00 2001 From: Simon <63975668+Simyon264@users.noreply.github.com> Date: Tue, 16 Jul 2024 03:04:31 +0200 Subject: [PATCH 079/118] Add missing command description to replay_toggleui (#30071) --- Resources/Locale/en-US/replays/replays.ftl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Locale/en-US/replays/replays.ftl b/Resources/Locale/en-US/replays/replays.ftl index 7a7e551b3e..4722f4c56b 100644 --- a/Resources/Locale/en-US/replays/replays.ftl +++ b/Resources/Locale/en-US/replays/replays.ftl @@ -41,3 +41,5 @@ replay-verb-spectate = Spectate cmd-replay-spectate-help = replay_spectate [optional entity] cmd-replay-spectate-desc = Attaches or detaches the local player to a given entity uid. cmd-replay-spectate-hint = Optional EntityUid + +cmd-replay-toggleui-desc = Toggles the replay control UI. From 927cf7799fc45ef5726e995020de1af6b710ea29 Mon Sep 17 00:00:00 2001 From: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Date: Tue, 16 Jul 2024 02:17:18 -0500 Subject: [PATCH 080/118] Remove uses of AllObjectives (#30077) Remove the uses of AllObjectives --- Content.Server/CharacterInfo/CharacterInfoSystem.cs | 2 +- Content.Server/Dragon/DragonSystem.cs | 4 ++-- Content.Server/Objectives/Commands/ListObjectivesCommand.cs | 2 +- .../Objectives/Systems/HelpProgressConditionSystem.cs | 4 ++-- .../Objectives/Systems/ObjectiveBlacklistRequirementSystem.cs | 2 +- Content.Shared/Mind/SharedMindSystem.cs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Content.Server/CharacterInfo/CharacterInfoSystem.cs b/Content.Server/CharacterInfo/CharacterInfoSystem.cs index df8718a022..cb2216b5e3 100644 --- a/Content.Server/CharacterInfo/CharacterInfoSystem.cs +++ b/Content.Server/CharacterInfo/CharacterInfoSystem.cs @@ -36,7 +36,7 @@ private void OnRequestCharacterInfoEvent(RequestCharacterInfoEvent msg, EntitySe if (_minds.TryGetMind(entity, out var mindId, out var mind)) { // Get objectives - foreach (var objective in mind.AllObjectives) + foreach (var objective in mind.Objectives) { var info = _objectives.GetInfo(objective, mindId, mind); if (info == null) diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 96ca8d3614..e626edeb26 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -225,7 +225,7 @@ public void DeleteRifts(EntityUid uid, bool resetRole, DragonComponent? comp = n return; var mind = Comp(mindContainer.Mind.Value); - foreach (var objId in mind.AllObjectives) + foreach (var objId in mind.Objectives) { if (_objQuery.TryGetComponent(objId, out var obj)) { @@ -247,7 +247,7 @@ public void RiftCharged(EntityUid uid, DragonComponent? comp = null) return; var mind = Comp(mindContainer.Mind.Value); - foreach (var objId in mind.AllObjectives) + foreach (var objId in mind.Objectives) { if (_objQuery.TryGetComponent(objId, out var obj)) { diff --git a/Content.Server/Objectives/Commands/ListObjectivesCommand.cs b/Content.Server/Objectives/Commands/ListObjectivesCommand.cs index 97fc943269..88dcdcedf6 100644 --- a/Content.Server/Objectives/Commands/ListObjectivesCommand.cs +++ b/Content.Server/Objectives/Commands/ListObjectivesCommand.cs @@ -33,7 +33,7 @@ public override void Execute(IConsoleShell shell, string argStr, string[] args) } shell.WriteLine($"Objectives for player {player.UserId}:"); - var objectives = mind.AllObjectives.ToList(); + var objectives = mind.Objectives.ToList(); if (objectives.Count == 0) { shell.WriteLine("None."); diff --git a/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs b/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs index e4455c0381..e0a56149b3 100644 --- a/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs +++ b/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs @@ -59,7 +59,7 @@ private void OnTraitorAssigned(EntityUid uid, RandomTraitorProgressComponent com if (!TryComp(traitor, out var mind)) continue; - foreach (var objective in mind.AllObjectives) + foreach (var objective in mind.Objectives) { if (HasComp(objective)) removeList.Add(traitor); @@ -88,7 +88,7 @@ private float GetProgress(EntityUid target) if (TryComp(target, out var mind)) { - foreach (var objective in mind.AllObjectives) + foreach (var objective in mind.Objectives) { // this has the potential to loop forever, anything setting target has to check that there is no HelpProgressCondition. var info = _objectives.GetInfo(objective, target, mind); diff --git a/Content.Server/Objectives/Systems/ObjectiveBlacklistRequirementSystem.cs b/Content.Server/Objectives/Systems/ObjectiveBlacklistRequirementSystem.cs index 8fe7e7e203..0671c6b67e 100644 --- a/Content.Server/Objectives/Systems/ObjectiveBlacklistRequirementSystem.cs +++ b/Content.Server/Objectives/Systems/ObjectiveBlacklistRequirementSystem.cs @@ -23,7 +23,7 @@ private void OnCheck(EntityUid uid, ObjectiveBlacklistRequirementComponent comp, if (args.Cancelled) return; - foreach (var objective in args.Mind.AllObjectives) + foreach (var objective in args.Mind.Objectives) { if (_whitelistSystem.IsBlacklistPass(comp.Blacklist, objective)) { diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index bf1065c1b1..ba365daf15 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -370,7 +370,7 @@ public bool TryGetObjectiveComp(EntityUid mindId, [NotNullWhen(true)] out T? if (Resolve(mindId, ref mind)) { var query = GetEntityQuery(); - foreach (var uid in mind.AllObjectives) + foreach (var uid in mind.Objectives) { if (query.TryGetComponent(uid, out objective)) { From 2e3d2db97edffc726e8f09418e3827a88d102b1a Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:27:37 -0400 Subject: [PATCH 081/118] Revert "Change wristwatch meta description" (#30070) Revert "Change wristwatch meta description (#30036)" This reverts commit 919b3ac9e64a18990bd8dbf21eceae782e2b3f77. --- Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml index 6359f659b5..7fbb4aecf6 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml @@ -2,7 +2,7 @@ id: Wristwatch parent: BaseItem name: wristwatch - description: A cheap watch for telling time. How much did you waste working on this shift? + description: A cheap watch for telling time. How much did you waste playing Space Station 14? components: - type: Sprite sprite: Objects/Devices/wristwatch.rsi From db3f304f4b5d6ec94b2ba997ca9680886e8bcd11 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Tue, 16 Jul 2024 07:29:31 -0700 Subject: [PATCH 082/118] Replace EntityPrototype.NoSpawn with EntityPrototype.HideSpawnMenu (#30082) NoSpawn Co-authored-by: plykiya --- Content.Server/Holiday/Christmas/RandomGiftSystem.cs | 2 +- .../Clothing/EntitySystems/SharedChameleonClothingSystem.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Holiday/Christmas/RandomGiftSystem.cs b/Content.Server/Holiday/Christmas/RandomGiftSystem.cs index ee542572d7..4603f45ed8 100644 --- a/Content.Server/Holiday/Christmas/RandomGiftSystem.cs +++ b/Content.Server/Holiday/Christmas/RandomGiftSystem.cs @@ -95,7 +95,7 @@ private void BuildIndex() foreach (var proto in _prototype.EnumeratePrototypes()) { - if (proto.Abstract || proto.NoSpawn || proto.Components.ContainsKey(mapGridCompName) || !proto.Components.ContainsKey(physicsCompName)) + if (proto.Abstract || proto.HideSpawnMenu || proto.Components.ContainsKey(mapGridCompName) || !proto.Components.ContainsKey(physicsCompName)) continue; _possibleGiftsUnsafe.Add(proto.ID); diff --git a/Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs index fced03bfab..f5df04037e 100644 --- a/Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs @@ -78,7 +78,7 @@ protected virtual void UpdateSprite(EntityUid uid, EntityPrototype proto) { } public bool IsValidTarget(EntityPrototype proto, SlotFlags chameleonSlot = SlotFlags.NONE) { // check if entity is valid - if (proto.Abstract || proto.NoSpawn) + if (proto.Abstract || proto.HideSpawnMenu) return false; // check if it is marked as valid chameleon target From 93e4bfcfb3bf1aec9483361a5b7304fe9cfca67d Mon Sep 17 00:00:00 2001 From: Jezithyr Date: Tue, 16 Jul 2024 15:50:17 -0700 Subject: [PATCH 083/118] Remove Geras from Slimes to address combat balance (#29731) Removed Geras Removed Geras --- Resources/Prototypes/Entities/Mobs/Species/slime.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index caa3690e5d..6d5c8697f4 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -53,7 +53,6 @@ - type: Damageable damageContainer: Biological damageModifierSet: Slime - - type: Geras - type: PassiveDamage # Around 8 damage a minute healed allowedStates: - Alive From 21d48ca5c485a1cc0a8f5008acbac8249adc2fff Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 16 Jul 2024 22:51:25 +0000 Subject: [PATCH 084/118] 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 b709a84f1f..c7c2a9731b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Tyzemol - changes: - - message: Slimes no longer absorb all items used on them - type: Fix - id: 6423 - time: '2024-04-23T08:48:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27260 - author: Rainbeon changes: - message: Suit sensor vitals now function again. @@ -3805,3 +3798,10 @@ id: 6922 time: '2024-07-15T19:18:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29912 +- author: Jezithyr + changes: + - message: Removed the Geras ability from Slimes + type: Remove + id: 6923 + time: '2024-07-16T22:50:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29731 From 8db252e7dc0c5b9386e7ca79b72adf279ec316e7 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:26:02 +1200 Subject: [PATCH 085/118] Nerf & standardised slip times (#27879) * standardised slip times * puddle and gib soap * banana peels * cleaned yaml by shifting to component * error slip * error slip intersect * intersect ratio return * error and omega soap changes * SlipocalypseClusterSoap 2 tc cost --- Content.Shared/Slippery/SlipperyComponent.cs | 4 ++-- Resources/Prototypes/Catalog/uplink_catalog.yml | 2 +- Resources/Prototypes/Entities/Effects/puddle.yml | 1 - .../Entities/Objects/Consumable/Food/produce.yml | 4 ---- .../Prototypes/Entities/Objects/Devices/pda.yml | 4 +--- .../Objects/Fun/Instruments/instruments_misc.yml | 2 -- .../Prototypes/Entities/Objects/Fun/error.yml | 7 ++++--- .../Entities/Objects/Misc/spider_web.yml | 2 -- .../Entities/Objects/Specific/Janitorial/soap.yml | 15 ++++++--------- Resources/Prototypes/Entities/Tiles/bananium.yml | 2 -- Resources/Prototypes/Reagents/cleaning.yml | 2 -- 11 files changed, 14 insertions(+), 31 deletions(-) diff --git a/Content.Shared/Slippery/SlipperyComponent.cs b/Content.Shared/Slippery/SlipperyComponent.cs index b80a9b57e4..154ca6c51a 100644 --- a/Content.Shared/Slippery/SlipperyComponent.cs +++ b/Content.Shared/Slippery/SlipperyComponent.cs @@ -25,14 +25,14 @@ public sealed partial class SlipperyComponent : Component /// [DataField, AutoNetworkedField] [Access(Other = AccessPermissions.ReadWrite)] - public float ParalyzeTime = 3f; + public float ParalyzeTime = 1.5f; /// /// The entity's speed will be multiplied by this to slip it forwards. /// [DataField, AutoNetworkedField] [Access(Other = AccessPermissions.ReadWrite)] - public float LaunchForwardsMultiplier = 1f; + public float LaunchForwardsMultiplier = 1.5f; /// /// If this is true, any slipping entity loses its friction until diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 9bd10c8ef0..c9dc048cd3 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -784,7 +784,7 @@ description: uplink-slipocalypse-clustersoap-desc productEntity: SlipocalypseClusterSoap cost: - Telecrystal: 3 + Telecrystal: 2 categories: - UplinkDisruption diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index fecf9f19a4..62bb923a61 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -113,7 +113,6 @@ components: - type: Clickable - type: Slippery - launchForwardsMultiplier: 2.0 - type: Transform noRot: true anchored: true diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index a74e3450e9..b2375a2dbf 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -311,7 +311,6 @@ sprite: Objects/Specific/Hydroponics/banana.rsi heldPrefix: peel - type: Slippery - launchForwardsMultiplier: 1.5 - type: StepTrigger intersectRatio: 0.2 - type: CollisionWake @@ -388,7 +387,6 @@ path: /Audio/Effects/slip.ogg params: volume: -100 - launchForwardsMultiplier: 1.6 - type: entity name: bananium peel @@ -402,8 +400,6 @@ sprite: Objects/Materials/materials.rsi heldPrefix: peel - type: Slippery - paralyzeTime: 4 - launchForwardsMultiplier: 2 - type: entity name: carrot diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index bf0b7190b5..04b023248e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -257,9 +257,7 @@ borderColor: "#C18199" - type: Icon state: pda-clown - - type: Slippery - paralyzeTime: 4 - launchForwardsMultiplier: 1.5 + - type: Slippery # secretly made of bananium - type: StepTrigger - type: CollisionWake enabled: false diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml index 8cb3d88ede..243a816a47 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml @@ -162,8 +162,6 @@ sound: path: /Audio/Items/bikehorn.ogg - type: Slippery - paralyzeTime: 4 - launchForwardsMultiplier: 1.5 - type: StepTrigger - type: CollisionWake enabled: false diff --git a/Resources/Prototypes/Entities/Objects/Fun/error.yml b/Resources/Prototypes/Entities/Objects/Fun/error.yml index 8f3fc21137..e4b9af61e0 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/error.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/error.yml @@ -16,7 +16,8 @@ - ReagentId: Nutriment Quantity: 5 - type: Slippery - launchForwardsMultiplier: 5 + paralyzeTime: 3 + launchForwardsMultiplier: 3 - type: StepTrigger intersectRatio: 0.2 - type: CollisionWake @@ -28,14 +29,14 @@ slips: shape: !type:PhysShapeAabb - bounds: "-0.2,-0.2,0.2,0.2" + bounds: "-0.4,-0.3,0.4,0.3" hard: false layer: - SlipLayer fix1: shape: !type:PhysShapeAabb - bounds: "-0.2,-0.2,0.2,0.2" + bounds: "-0.4,-0.3,0.4,0.3" density: 30 mask: - ItemMask diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml index 9561fa3538..02feda953f 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml @@ -108,8 +108,6 @@ - type: Transform anchored: true - type: Slippery - paralyzeTime: 2 - launchForwardsMultiplier: 1.5 - type: StepTrigger intersectRatio: 0.2 - type: Physics diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml index 5678de6baf..efb93a8868 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml @@ -21,8 +21,6 @@ sprite: Objects/Specific/Janitorial/soap.rsi storedRotation: -90 - type: Slippery - paralyzeTime: 2 - launchForwardsMultiplier: 1.5 - type: StepTrigger intersectRatio: 0.2 - type: CollisionWake @@ -129,8 +127,8 @@ - type: SolutionContainerVisuals fillBaseName: syndie- - type: Slippery - paralyzeTime: 5 - launchForwardsMultiplier: 2.5 + paralyzeTime: 3 + launchForwardsMultiplier: 3 - type: Item heldPrefix: syndie - type: FlavorProfile @@ -154,8 +152,8 @@ layers: - state: syndie-soaplet - type: Slippery - paralyzeTime: 5 - launchForwardsMultiplier: 2.5 + paralyzeTime: 1.5 # these things are tiny + launchForwardsMultiplier: 1.5 - type: StepTrigger intersectRatio: 0.04 - type: Item @@ -196,7 +194,6 @@ - type: SolutionContainerVisuals fillBaseName: gibs- - type: Slippery - paralyzeTime: 2 - type: StepTrigger - type: Item heldPrefix: gibs @@ -221,8 +218,8 @@ - type: SolutionContainerVisuals fillBaseName: omega- - type: Slippery - paralyzeTime: 7 - launchForwardsMultiplier: 3 + paralyzeTime: 5.0 + launchForwardsMultiplier: 3.0 - type: Item heldPrefix: omega - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Tiles/bananium.yml b/Resources/Prototypes/Entities/Tiles/bananium.yml index c9a6ec2844..fa8cfdd001 100644 --- a/Resources/Prototypes/Entities/Tiles/bananium.yml +++ b/Resources/Prototypes/Entities/Tiles/bananium.yml @@ -44,8 +44,6 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: Slippery - paralyzeTime: 2 - launchForwardsMultiplier: 1.5 - type: StepTrigger intersectRatio: 0.2 - type: Physics diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml index da02fc666d..a6b53be688 100644 --- a/Resources/Prototypes/Reagents/cleaning.yml +++ b/Resources/Prototypes/Reagents/cleaning.yml @@ -77,8 +77,6 @@ meltingPoint: 18.2 tileReactions: - !type:SpillTileReaction - paralyzeTime: 3 - launchForwardsMultiplier: 2 requiredSlipSpeed: 1 superSlippery: true From 8d99961a00ebabb5f8e4cb82fd2fc6873acc748f Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 16 Jul 2024 23:27:09 +0000 Subject: [PATCH 086/118] 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 c7c2a9731b..e0f8aef124 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Rainbeon - changes: - - message: Suit sensor vitals now function again. - type: Fix - id: 6424 - time: '2024-04-23T08:57:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27259 - author: Ghagliiarghii changes: - message: Security can now find replacements for their trusty Combat Knife in the @@ -3805,3 +3798,11 @@ id: 6923 time: '2024-07-16T22:50:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29731 +- author: K-Dynamic + changes: + - message: nerfed paraylze timer of all slippable objects (including soaps, water + puddles, and clown-related items) + type: Tweak + id: 6924 + time: '2024-07-16T23:26:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27879 From 13bec7a0e98e4ce850efced1fddb9d9ac4e5b1d5 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Wed, 17 Jul 2024 00:35:18 -0400 Subject: [PATCH 087/118] Sign Resprite (#29806) * Redone signage * Signs * ok this thing now * alright ig? * big data * cryo sign * new sign --- .../Structures/Wallmounts/Signs/signs.yml | 190 +-- .../ServerInfo/Guidebook/Service/Chef.xml | 1 - .../Structures/Wallmounts/signs.rsi/ai.png | Bin 400 -> 406 bytes .../Wallmounts/signs.rsi/ai_upload.png | Bin 0 -> 513 bytes .../Wallmounts/signs.rsi/anomaly.png | Bin 399 -> 515 bytes .../Wallmounts/signs.rsi/anomaly2.png | Bin 454 -> 0 bytes .../Wallmounts/signs.rsi/arcade.png | Bin 3131 -> 3126 bytes .../Wallmounts/signs.rsi/armory.png | Bin 391 -> 423 bytes .../Structures/Wallmounts/signs.rsi/ass.png | Bin 385 -> 519 bytes .../Wallmounts/signs.rsi/atmominsky.png | Bin 626 -> 0 bytes .../Structures/Wallmounts/signs.rsi/atmos.png | Bin 486 -> 466 bytes .../Structures/Wallmounts/signs.rsi/bar.png | Bin 388 -> 398 bytes .../Wallmounts/signs.rsi/barbershop.png | Bin 444 -> 481 bytes .../Wallmounts/signs.rsi/biblio.png | Bin 339 -> 397 bytes .../Wallmounts/signs.rsi/bridge.png | Bin 484 -> 475 bytes .../Structures/Wallmounts/signs.rsi/cans.png | Bin 0 -> 445 bytes .../Structures/Wallmounts/signs.rsi/cargo.png | Bin 352 -> 445 bytes .../Wallmounts/signs.rsi/cargo_dock.png | Bin 407 -> 476 bytes .../Wallmounts/signs.rsi/chapel.png | Bin 354 -> 533 bytes .../Structures/Wallmounts/signs.rsi/chem.png | Bin 431 -> 461 bytes .../Wallmounts/signs.rsi/chemistry1.png | Bin 450 -> 0 bytes .../Wallmounts/signs.rsi/chemistry2.png | Bin 401 -> 0 bytes .../Wallmounts/signs.rsi/cloning.png | Bin 418 -> 446 bytes .../Wallmounts/signs.rsi/commander.png | Bin 370 -> 434 bytes .../Wallmounts/signs.rsi/conference_room.png | Bin 356 -> 406 bytes .../Structures/Wallmounts/signs.rsi/court.png | Bin 431 -> 0 bytes .../Structures/Wallmounts/signs.rsi/cryo.png | Bin 0 -> 3065 bytes .../Structures/Wallmounts/signs.rsi/data.png | Bin 0 -> 408 bytes .../Wallmounts/signs.rsi/deathsposal.png | Bin 461 -> 470 bytes .../Structures/Wallmounts/signs.rsi/dock.png | Bin 432 -> 477 bytes .../Structures/Wallmounts/signs.rsi/doors.png | Bin 467 -> 480 bytes .../Wallmounts/signs.rsi/drama1.png | Bin 0 -> 627 bytes .../Wallmounts/signs.rsi/drama2.png | Bin 0 -> 588 bytes .../Wallmounts/signs.rsi/drama3.png | Bin 0 -> 578 bytes .../Wallmounts/signs.rsi/drones.png | Bin 405 -> 0 bytes .../Structures/Wallmounts/signs.rsi/eng.png | Bin 432 -> 418 bytes .../Wallmounts/signs.rsi/engine.png | Bin 471 -> 446 bytes .../Structures/Wallmounts/signs.rsi/eva.png | Bin 387 -> 517 bytes .../Wallmounts/signs.rsi/examroom.png | Bin 494 -> 490 bytes .../Structures/Wallmounts/signs.rsi/gravi.png | Bin 458 -> 423 bytes .../Structures/Wallmounts/signs.rsi/hydro.png | Bin 0 -> 479 bytes .../Wallmounts/signs.rsi/hydro1.png | Bin 428 -> 0 bytes .../Wallmounts/signs.rsi/hydro2.png | Bin 421 -> 0 bytes .../Wallmounts/signs.rsi/hydro3.png | Bin 448 -> 0 bytes .../Wallmounts/signs.rsi/interrogation.png | Bin 395 -> 441 bytes .../Wallmounts/signs.rsi/janitor.png | Bin 552 -> 434 bytes .../Wallmounts/signs.rsi/kitchen.png | Bin 0 -> 486 bytes .../Wallmounts/signs.rsi/laundromat.png | Bin 397 -> 467 bytes .../Structures/Wallmounts/signs.rsi/law.png | Bin 367 -> 396 bytes .../Structures/Wallmounts/signs.rsi/mail.png | Bin 346 -> 418 bytes .../Structures/Wallmounts/signs.rsi/mats.png | Bin 0 -> 391 bytes .../Wallmounts/signs.rsi/medbay.png | Bin 313 -> 533 bytes .../Structures/Wallmounts/signs.rsi/meta.json | 1372 +++-------------- .../Wallmounts/signs.rsi/miner_dock.png | Bin 462 -> 0 bytes .../Wallmounts/signs.rsi/morgue.png | Bin 341 -> 535 bytes .../Structures/Wallmounts/signs.rsi/news.png | Bin 3095 -> 3096 bytes .../Wallmounts/signs.rsi/prison.png | Bin 320 -> 373 bytes .../Wallmounts/signs.rsi/psychology.png | Bin 582 -> 576 bytes .../Wallmounts/signs.rsi/reception.png | Bin 3103 -> 3069 bytes .../Wallmounts/signs.rsi/restroom.png | Bin 0 -> 515 bytes .../Structures/Wallmounts/signs.rsi/rnd.png | Bin 390 -> 448 bytes .../Structures/Wallmounts/signs.rsi/robo.png | Bin 413 -> 481 bytes .../Wallmounts/signs.rsi/salvage.png | Bin 3109 -> 3061 bytes .../Structures/Wallmounts/signs.rsi/sci.png | Bin 473 -> 570 bytes .../Wallmounts/signs.rsi/science1.png | Bin 516 -> 0 bytes .../Wallmounts/signs.rsi/science2.png | Bin 422 -> 0 bytes .../Wallmounts/signs.rsi/security.png | Bin 473 -> 426 bytes .../Wallmounts/signs.rsi/shield.png | Bin 402 -> 0 bytes .../Structures/Wallmounts/signs.rsi/space.png | Bin 515 -> 527 bytes .../Wallmounts/signs.rsi/surgery.png | Bin 428 -> 430 bytes .../Wallmounts/signs.rsi/telecoms.png | Bin 466 -> 431 bytes .../Wallmounts/signs.rsi/toxins.png | Bin 424 -> 541 bytes .../Wallmounts/signs.rsi/toxins2.png | Bin 433 -> 0 bytes .../Structures/Wallmounts/signs.rsi/vault.png | Bin 0 -> 458 bytes .../Wallmounts/signs.rsi/virology.png | Bin 468 -> 519 bytes .../Wallmounts/signs.rsi/xenoarch.png | Bin 0 -> 449 bytes .../Wallmounts/signs.rsi/xenobio.png | Bin 609 -> 490 bytes .../Wallmounts/signs.rsi/xenobio2.png | Bin 569 -> 0 bytes .../Wallmounts/signs.rsi/xenolab.png | Bin 408 -> 0 bytes .../Wallmounts/signs.rsi/zomlab.png | Bin 6115 -> 958 bytes Resources/Textures/Template/signs.png | Bin 0 -> 1013 bytes Resources/migration.yml | 16 + 82 files changed, 279 insertions(+), 1300 deletions(-) create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/ai_upload.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/anomaly2.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/atmominsky.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/cans.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/chemistry1.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/chemistry2.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/court.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/cryo.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/data.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/drama1.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/drama2.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/drama3.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/drones.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/hydro.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/hydro1.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/hydro2.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/hydro3.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/kitchen.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/mats.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/miner_dock.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/restroom.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/science1.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/science2.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/shield.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/toxins2.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/vault.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/xenoarch.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/xenobio2.png delete mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/xenolab.png create mode 100644 Resources/Textures/Template/signs.png diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml index 9aac49a6bd..c6ecb5fd30 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml @@ -243,6 +243,15 @@ - type: Sprite state: ai +- type: entity + parent: BaseSign + id: SignAiUpload + name: ai upload sign + description: A sign, indicating an AI is present. + components: + - type: Sprite + state: ai_upload + - type: entity parent: BaseSign id: SignArcade @@ -273,11 +282,11 @@ - type: entity parent: BaseSign id: SignAnomaly - name: xenoarchaeology lab sign + name: xenoarcheology lab sign description: A sign indicating the xenoarchaeology lab. components: - type: Sprite - state: anomaly + state: xenoarch - type: entity parent: BaseSign @@ -286,7 +295,7 @@ description: A sign indicating the anomalous research lab. components: - type: Sprite - state: anomaly2 + state: anomaly - type: entity parent: BaseSign @@ -299,21 +308,38 @@ - type: entity parent: BaseSign - id: SignAtmosMinsky - name: atmospherics sign - description: A sign indicating the atmospherics area. + id: SignBar + name: bar sign + description: A sign indicating the bar. components: - type: Sprite - state: atmominsky + state: bar - type: entity parent: BaseSign - id: SignBar - name: bar sign - description: A sign indicating the bar. + id: SignKitchen + name: kitchen sign + description: The heart of the home. And disease. components: - type: Sprite - state: bar + state: kitchen + +- type: entity + parent: BaseSign + id: SignTheater + name: theater sign + description: Would it even be Space Station without drama? + components: + - type: Sprite + layers: + - state: drama1 + map: [ "base" ] + - type: RandomSprite + available: + - base: + drama1: null + drama2: null + drama3: null - type: entity parent: BaseSign @@ -396,24 +422,6 @@ - type: Sprite state: chem -- type: entity - parent: BaseSign - id: SignChemistry1 - name: chemistry sign - description: A sign indicating the chemistry lab. - components: - - type: Sprite - state: chemistry1 - -- type: entity - parent: BaseSign - id: SignChemistry2 - name: chemistry sign - description: A sign indicating the chemistry lab. - components: - - type: Sprite - state: chemistry2 - - type: entity parent: BaseSign id: SignCloning @@ -427,19 +435,20 @@ parent: BaseSign id: SignConference name: conference room sign - description: A sign indicating the conference room. + description: Where work happens. components: - type: Sprite state: conference_room - type: entity parent: BaseSign - id: SignCourt - name: court sign - description: A sign labelling the courtroom. + id: SignCryo + name: cryosleep sign + description: Just like that? You're gonna chicken out? components: - type: Sprite - state: court + state: cryo + - type: entity parent: BaseSign @@ -461,18 +470,27 @@ - type: entity parent: BaseSign - id: SignDrones - name: drones sign - description: A sign indicating drones. + id: SignRestroom + name: restroom sign + description: A sign indicating where you go to... What do you do here again? components: - type: Sprite - state: drones + state: restroom + +- type: entity + parent: BaseSign + id: SignMaterials + name: materials sign + description: An omen to the juicy vault of steel, glass, and plastic that lays before you. + components: + - type: Sprite + state: mats - type: entity parent: BaseSign id: SignEngine - name: engine sign - description: A sign indicating the engine room. + name: power sign + description: Where the powa happens. components: - type: Sprite state: engine @@ -544,7 +562,7 @@ parent: BaseSign id: SignHead name: head sign - description: A sign with a hat on it. + description: An official sign indicating the dwellings of a Nanotrasen-certified head of department. components: - type: Sprite state: commander @@ -556,25 +574,7 @@ description: A sign indicating a hydroponics area. components: - type: Sprite - state: hydro1 - -- type: entity - parent: BaseSign - id: SignHydro2 - name: hydro sign - description: A sign indicating a hydroponics area. - components: - - type: Sprite - state: hydro2 - -- type: entity - parent: BaseSign - id: SignHydro3 - name: hydro sign - description: A sign indicating a hydroponics area. - components: - - type: Sprite - state: hydro3 + state: hydro - type: entity parent: BaseSign @@ -606,8 +606,8 @@ - type: entity parent: BaseSign id: SignLawyer - name: lawyer sign - description: A sign labelling an area where the Lawyers work. + name: law sign + description: A sign indicating the presence of the (typically absent) rule of law. components: - type: Sprite state: law @@ -639,15 +639,6 @@ - type: Sprite state: medbay -- type: entity - parent: BaseSign - id: SignMinerDock - name: miner dock sign - description: A sign indicating the miner dock. - components: - - type: Sprite - state: miner_dock - - type: entity parent: BaseSign id: SignMorgue @@ -740,36 +731,27 @@ - type: entity parent: BaseSign - id: SignScience1 - name: science sign - description: A sign indicating the science area. + id: SignServer + name: server sign + description: Ever heard of Big Data? This is it, chump. The biggest. components: - type: Sprite - state: science1 + state: data - type: entity parent: BaseSign - id: SignScience2 - name: science sign - description: A sign indicating the science area. - components: - - type: Sprite - state: science2 - -- type: entity - parent: BaseSign - id: SignShield - name: shield sign - description: A sign with a shield. + id: SignCans + name: canisters sign + description: A sign indicating the auspicious presence of gas canisters. components: - type: Sprite - state: shield + state: cans - type: entity parent: BaseSign id: SignShipDock - name: docking sign - description: A sign indicating the ship docking area. + name: evac sign + description: A sign indicating the where the evac shuttle will (likely) arrive. components: - type: Sprite state: dock @@ -812,12 +794,12 @@ - type: entity parent: BaseSign - id: SignToxins2 - name: toxins sign - description: A sign indicating the toxin lab. + id: SignVault + name: vault sign + description: A sign indicating the vault. Who knows what secrets lie inside? components: - type: Sprite - state: toxins2 + state: vault - type: entity parent: BaseSign @@ -964,29 +946,11 @@ - type: Sprite state: xenobio -- type: entity - parent: BaseSign - id: SignXenobio2 - name: xenobio sign - description: A sign indicating the xenobiology lab. - components: - - type: Sprite - state: xenobio2 - -- type: entity - parent: BaseSign - id: SignXenolab - name: xenolab sign - description: A sign indicating the xenobiology lab. - components: - - type: Sprite - state: xenolab - - type: entity parent: BaseSign id: SignZomlab name: zombie lab sign - description: A sign indicating the zombie lab. + description: The final remains of a shut-down Nanotrasen research project that aimed to harness the powers of Romerol. I wonder how that went... components: - type: Sprite state: zomlab diff --git a/Resources/ServerInfo/Guidebook/Service/Chef.xml b/Resources/ServerInfo/Guidebook/Service/Chef.xml index e0692b889b..79eb81468c 100644 --- a/Resources/ServerInfo/Guidebook/Service/Chef.xml +++ b/Resources/ServerInfo/Guidebook/Service/Chef.xml @@ -54,7 +54,6 @@ Ask Botany for what you need, without a botanist, you may need to grow more plan - ## Gathering Milk: Alt-Click on a Cow with a container in your hand. (Beakers, Buckets, Milk Jugs, ect.) diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/ai.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/ai.png index 6cee540a6b2b727d219e49585e6395cebeaf0f46..e532ec039e84e8d2b1b2fb7892852f9b98749e39 100644 GIT binary patch delta 380 zcmV-?0fYXK1C|4jBYyw^b5ch_0Itp)=>Px$P)S5VR9J;$U>NCu5uYTNvG;#!S@iAf zR;+g6bO4vJ_kS)SaRv@v0g5gE@%aP8w|6hGIs&T$V3zYq$Wd%L419X=2&*GlaA`pH z`Q1f6WLvBpw*_wAw|6fw2p|LHxGfBK7x}<_Lw^h)Ry|Q6KyDNeqmL*D zp!=jEEry{YEry`jkO%>i(f|x}%vyq>2AkNB2m!Lw05(8Q8XzhP(0$S|YYA3Iphp8S zS&^(XfXy;o`UrsmPXk1S0HqGW2Zl~vKr1jbLI4?5q{T3#+I(POU|?XFeMEqvW7ZOs zv_WcUksJc4Hgz8ul;gHAD93GqI|ODaIZ;J&2rw{EH#d-#24EpDU=BbBun-|9WN@~M zh2+&4*tq#9a~Tr&_4O0OyN5T4Zx#Re`~kxO#QG3h^!)hz0jt`<*)c(O1jV*P0j{pu aC;$Lc%#;2PWaqa400006vn?+s3+*ijKpB+p_~B;Eq-anyK=CnAGz+S>l!x77X+BHBVFdFm`$rOv(v~o@) zQ*8uo8&E1Mbi@8|ER5$VSj?us#!Oh(0FkKO`8knHS#9eafjVv{0(EW2jet`Z=t{4E z+XdDsSO$cN_iqRQIu%vAUCmjiA^Ri*ep;|jIk4{ny}LZbWxa-h@-f^dRt7G)j+=0* z0pR=6@xxfFE6xTYnSw}Y{c{6=`y1dKb{FL2busbW>ciRqk#NqjO=|xAS>Dm{1&N}Z UI1{IdNB{r;07*qoM6N<$f`aX^cK`qY diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/ai_upload.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/ai_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..91256aa1df71351761153db05f3f6ef7c1ed1207 GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9J=WS36F_KoET(6rn^!Q5vYANWlTp`Ude4taSDne1x1KbQVVlH%Q9? zC|p1VO=Kk^ifBRsV|K^;nGHrlg4bBy-I@2^%-FJlzm6l*Vs|{*{}kc&{!Zg;2meh&zEb$U@ za*DU*Co}}8phT)0o|KD}#E1n@LK~Tl&=;fP#6`}DOk@%Rt{AHTX$kom6Ol`>xB{l$ za}wL&x!@E)iB(ctuU%^g3rM31v$?(&>JR|RA_f4ArVF`%vWPL7F6t{_c1OuSP$7-t z#u*p9Es((EOoc8|hxa`oO$2Px$y-7qtR9J=WSG`WdFc3ZvLs6yvEC?Z$ zy$@h{$==6k=4^SAZkdzEV9#RZ0kTsGAr?p^1Y21+%Q5HVj%26=-_q9S=KFm2-N^y? z>$vC(M(f>aDx&iBf#eDbh}OH)@_Gr2+qBSpG^7Yp0DqF--`$KRM?5~gkRmQa zf8d;4M;fv!1|8|ay`kp?1%%)dn$kd`axkUo2$JARvROwO5|!KU`@`18inIn(8ZgR$ zjhu|dK+-_hspLN!;_4?e6 zCiOk=_WlXS=Ocd-`f!aEs;z5MPW?p!u%2i#f8u3T+{q57{s6xyftv+t68ifPp%REj zF-|yl?D_(SJmN!?0Ut<6na;-~8Sp`6K??RHbSGX`#bX^4QgQclv;eHDYq~_`mVkE1djudBYy!_NklZq}6n(9_WbaamAr}A81Ucm&^BSQTphaz ze9k`_H5vyO%hmDu`+y?LS>mqmVLux+ns{m>DY6_^XWP7V-T@Nlf@PrGmMF6PLY!Nw)&`cW1I_|{)0Q{_XNM&*nx(z+YID{ll6`;RMWddj7sBxQ; zw5kFkrZy0vTD5*5r7|(*G(G~#LG)hV62>swdSe5w@3E`E^*!uc=KT3@`G5f@rCY6j T45emh00000NkvXXu0mjfsm!cw diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/anomaly2.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/anomaly2.png deleted file mode 100644 index 73d94ac95e45de566b4003a5605a00de2f3c55ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)Px$fJsC_R9J=WmN9C>FcgOWmMq;1p`albkdW!nGuTk5x804vB49G9BuFQ4~G&e^1hr3=I13x@iiS%@+p~gSXe0T94Yn z*?e)hUw$J`vrgt*3hbtLwGgAGN%Azq^GDbTAn_wSOrL6F8UZe8A8#*D7L2v$(gIM8 zi%n4(V-73FbwIRNfQ+x53+6Db`EJ_=s@dmh1~>G;r2v-#Zs=8ju5FPK0C3En%+)O@ zHbn_>zBN_>R72pn+_dDn#zp`()d@h&T3wCa0hq(UrNBB`RScQKu#Q&XQfPy;F2hkU zE>AZ>kn%JGm!cAD9e{K#!>(JP1wfhY1hL}J9EFU!J2X6PK{}4FVF#rGn07*qoM6N<$g2_n27ytkO diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/arcade.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/arcade.png index 9f36d43776ffe216cb3fec73d7ba255228a107be..7cb18443529fbb6b7988d25d9e9bc151055e5cf0 100644 GIT binary patch delta 478 zcmV<40U`do7`7OYBe63>3V#8*NklO060@3NC8OR>yOC?qrinQPJgt&TOAvh6%n_b zYRU32P9O?gE%Iycu_2Iv)FP7kbH0T0AwbZ!#QuxGHJfAuxD{vnL?j=8p zk8}4WG%iD_1us{5$z!zzNQBaPn(ZNslTt@jA%*}gSgvv{aZ`97g%sN`2l8KiGFzNS zk59$F*~T~>caW}MD)RyBfx~tKR>!W@fK-HWg0n#d>}1sTV3L1-lGD+zk7ob)0jmA$ UD-)6l>;M1&07*qoM6N<$f*?ZN$N&HU delta 482 zcmV<80UiFf7`qsdBMtxrXF*Lt006O%3;baPu^~kYe*hq3NK#Dz0D2|>0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600BoyL_t(oh3(ccYlA=(2k^gJ zhkS!Ne^~+<6!b$#>*5y7>e9V|4*3KQg}7&NO>lED!4Hu@G6pPe zPsfY(G)9QV0qgS@wx=VTXtzJWwQMeD$O>KtPhtR0=)<*a1aSmiQ@L8g1aZXGHwJJ* zpXFW41_1Uc3|RpH1aZV_=oujZT~oQGrhlUqK-snfz}2>>b>@4_iGy>@KQc8$Qv;Re{Yk3>d13Cx% Y0`B|4(ES~6X8-^I07*qoM6N<$g4z$qcmMzZ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/armory.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/armory.png index 671e57aa5cf295495ae5f9c8f377b847a3f772cb..3f237ec04663cd1dce749f3c7705b3232cacfa80 100644 GIT binary patch delta 398 zcmV;90df9^1E&L!BYyw^b5ch_0Itp)=>Px$VM#gMU!!>bNB+(RMf60d;?R29TcIpc5MZif#2DZ^`F+eYZ>_KGE0L;V6J6! zX1rK{BQQ4r9x9km07eEP3qa;i70gMm48$GxK)Un&{9H6?oquEJagn?)uBwEfdBIrG zTrt4d^=M9qFZW`_<5CDQ04*Maq(C{SY5=tO;63&W#)J2_0Z7A1Fs*ZH(^za3ltkg* zV!jEWmR11-W7!OsmMTe=gutcQLhny9XA|13LhZo0tF88-N!m&I7UNJKs77;1d4yI+msvhya?? z0m0a-(n_z%RNIKeIgs0BoP=Z7uS!fYK-zlK2n^nfyWc7RiBfaP>-h01U_0UT0iaE) soPx2Kn6cmaV-iDD@CO+4e*wTdO#Gy)!DZ)300000Ne4wvM6N<$f>`so0ssI2 delta 365 zcmV-z0h0cw1BU~UBYy!-NklAP&|3{(x-WKOMLR2~pR%AYecfX_@U*SjdQ z_RfGzzM7Y3m0_(_2aN&{O=o2z*slQ`_gi@H;hY0A!+Q^7Oc>JwsR1Mq@Rk19oiYkw zIxB+@QtCe%pk{8uR3)1*Re$3wsP6k$0Z2KHF9IMs?zgbkf`~%tNncuRWvDz*56;Y? zZ;a7Q6$elaL_`5d;Hqt3sg^*zkh=M(0Ej5M3hEb_CSCnnK4{Pf7`T^%m5Zlq00000 LNkvXXu0mjfp|hf= diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/ass.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/ass.png index 0dfa8a04f5cd9b305f3aa331f0894bd8c2e3a9ec..9d57ebe7e9a44b6ff917562f4475bd464aa620c3 100644 GIT binary patch delta 494 zcmVPx$!AV3xR9J=WSFvitFc7_#u7N;sGCEtp zqcMRj#aq6>U9;y8{007l>|NV0$X2=(g7Ij`7LREN6#4<_P|lT4r?aIbbZFlaN$2=I zo$gLPfWM9#$vB%YPM0EjTR*Z~cM`cjnZjT+KAZfw-vI!eIDZkW03;tzrkX8VMy-VD zDsRkt{UHuD5k?PiJI|Jp_Hqu~bA!PFG#C~nJfm0nYk=T+0ICwxs z68rVeUE$;b1m-ZL zQywCC&g3x^Z(dyJL&RXO&6K=BhHUAi;-smhlS4zO|HYPc+0yGAC1*?h6@ z6X5mvNgG4EIGZo_AL9+`rgaJ~I776XXd!M*PU@z`+vAH9fPXA9ME4V|&5e`iGs>8O z-z1CdVC5Hq@R$0!ZV;%FYJV2>^gq2`IX*Ms(3V;M(a-x{eYY_x(Qy=yM&P z1polvx1Y$X5@2bZAg@XY&QLe)!8i1LEY~a28^U@IsGtg>8(fW5aEeHqF!cOyh*NM1 ziX!qcdybQaOnMou*2+Zs-^ZnkNH*Y3QS+V_ZfU~|# zmLYO}DYak#i0^OIrPHo2B%X{?k$yUb@)&^#%Q#%Jn6I>MKo$g zoZe%6ya)iiO{_56;}nJIB!zfVe0LpXCxFguA7f5XobzAq_Tm5r4)5m~la@eH0HG0} zF&~&ie;xtbL!Aprkq=P-dZOzzz_8~CJB}fbV_B^T0%#Sb81=wD4LZ@7^}P%-Z#T?b z)`#dVpy_I+ORpW;*$P>C1BV0HF#7T#h}ojd)3S>xItS)Ku#H<2``(iL`n9iSS2c`& zlDRG!pIguipuKr2>)S{2`Fty**9&w1)8H}R12pzI4~DtJ;Z+;}7NHOTT%sC|^Ee(2 z;A0v}L-^WU0G~y5M3xQ^;~DmybI^_kpl8~{sQ1j4gdfE diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/atmos.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/atmos.png index 9441b32827891b83ec11770bb1a94bba35f4739c..ae31db348b28b877966c3e870f97c66aae2efacf 100644 GIT binary patch delta 441 zcmV;q0Y?7j1JVPKBYyw^b5ch_0Itp)=>Px$j7da6R9J=WmoZL-KoEw1jVF-eC0OVI z+=if@g^EMazS5RMP;nNOyk_44v~UxO=M|m>8M3UiFf3b`=$}w5limN@8JGp&uj^ti zxG!*yW%S(gUS5EGf%EMRuuHd__Xha*EAWSbdXPtr{#i3Z>r_%!#B1_N-r_i2r>7(lxFP({rEDQXEqGN8&1NmhtJ z#EmFb6#&e>4S()ENkb9?&>~z5whirF>n4XPyIFvsMx@Ga%!n=OfLzQcaRyu?yUxBC zjiUoBExe{BM>z|&Xb~V))uiUC?8b}6wrK3m3kFECVsgAvdhIlGFz&oy0C!9C6vn?)y+9^bk4!MJWh)1$6eUtm(6v%` z58fkn%?T=jxB=PNm|*hgl?mkp=>T?trr<}ZIyB!BjIH;6`27oT(|^}$>cHXne))-m z*XO5EAETRx89T-{p~0BB-9w<5libqI8V1)L*o6H(_w93`Iz%LKdq7HVk# zpkD#N*DE)1mw&?ArZqquHDA_ss>7jkAZ@FpmKosM*(K$`ltRzxhvPQ@bg5nIka|!5 z+Q>Qt0WS~_x}X|3)}nMnQW6Hd0Fwf>%uve=3<7Mw?Oi){Zjfhza=A&cvvEr6|73t+ z`7J3cfVtz?2AmWECWRS1X<3;8)O|+cWh{$EA z&}97?K=6p(8tuD90Yc9)(~qjqb8wnC^XGrdZ@TFNV)L;JSxBqh00000NkvXXu0mjf DFuK!I diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/bar.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/bar.png index e5fb2ab766ec9d9bc20e1325ca743d06dcb87ad8..8fdc8016af35f04020fb2b985d2e33c5f3615d67 100644 GIT binary patch delta 372 zcmV-)0gL{G1C9fbBYyw^b5ch_0Itp)=>Px$NJ&INR9J=WmoaX_FcgOWR_(yhMqLUA zhy-U~L9vu8aE4qVTee(*yF^O1o&h8dP*|dpAp-*)Xj0=ooBG)U2>$KqIsQM#)_XQ^ z>v}LH!zm8FjMg8tmlhzL;_&mr6-%gWnN)XWPLmrGjd!KXAo)huQ{#$fJh@G@eyEAWJuzyk2&Vn z04jtkTXPnG3?Xj^#~iRc11dy!Cb;HK05SyE9AIvNPu&5o8=x!4E@hbwpqg?aoa%rN zUDp{X^9p5N^=(~nE@mgOn)eO>oHnDb1k26I)U3P!sCNSDFv@xF0Mv?2dG7$WD?BId zt@w2e1Vewf;;&7E-RkeHSX&3$8VH8JF{jYT+tb$cn9F>a$Pn)KN9mqscYOn5ErutI S6ZrxF0000n7dE*9lrr)-Mb#f7OXeBvrmHe z)tfbk_2qiAJ0G7vfD4IA&M1NSw6H=vjRoOCLYZz^X9X8=YCY!CZy^IS+^l(>d-2jD_Nk)(R8b|MPG3)pM?w*bS$ zzH$brvr^ZAsqJBZn<6wJhI1G_qP{W`GD^_Ny#S^X8bBR^>i?Sp}&r0T0U#mClb%cxc~qF07*qo IM6N<$f^({(`~Uy| diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/barbershop.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/barbershop.png index d196072a32b0e63fa87efd8d4abe329dc2e4701d..b01a82717f781ae49f7efa4628cc1d0b824c7884 100644 GIT binary patch delta 455 zcmV;&0XY7=1K|UZB!2;OQb$4nuFf3k0004-NklFfje>$=hzcl$%*%F*ldBkAi#=iJ|H;r4Dl+xg{u0sv?z2!9d)ov%0B_FWiwP?WW? zQ+fVkxx&{yi0h#R)SV}>4`JXLJ5OR?yWS`OB@+nBxlYCajEhkS**VU42B1Pvn(BNq zfGjl%rui`&fI14B&|3pg5Vp>(0c1_dc&7lk+hbmJ#y~Yxynha4X#~f-0>(ufcC7XIluDH-Pg;{viY8ocvk z_Spa?i#jhvVcn7t{ao;{f+F7e!VsO*Eb=?$G7bF+_eAz002ovPDHLkV1gC1-G%@F delta 418 zcmV;T0bTy#1H1!}B!3BTNLh0L01FZT01FZU(%pXi0000RbVXQnQ*UN;cVTj607GSL zb9r+hQ*?D?X>TA@Z*OeDr{R1600BoyL_t(oh3(d{Zo)7S2H-zi2i|~AMMw;Zls*Ik z7Pcy^EbJh4=o56PM0OTds%$Kz;vtBX3`i(U@CF&!(xqpa)_;IVoJ)nc#ThK!cRt&( zk)|oi4C4;?_ki(amPLi}IG&5w zdW#3(cDUKdNzQndIGTkPx$M@d9MR9J;$U>NCu5uc=r6~ljOS#;+Z zcDryoK*fsTKdTr61E(P6mVbZG!0`JOc1K`!0L*d;4PMG^hk_S3K4WzR6D|$Z@HsK& zv5;cOzV`h@shhF8fnn9YgG8w%$pH)u3=B?{jyUD^weM$`v46XPA;YzSVbwm|>L_vm z0|Ns?n3Fw*7|h43_8nx%a3$U>oN0hwV89(fRumAMz-Zj`Rz*!yhsWUL}i&L*U{`m4U!>5}h zRLArJL^}XI@oepD-w(&gd{Pr3*&zU{mXWJxr%FeX6CqWj0M;HDFbB{)1kmFgnTD}p zAwX>NZNRf3&VuOsdj(0uCCcA003&)fs->1 RdN2S0002ovPDHLkV1iYwqFn$0 delta 313 zcmV-90mlA~1JeSKBYy!JNklHz|%z&f;@O zXD3IIZY~Z!gn?vs(syvvsipNNY0?Gz8h@&j39u1BlBHmjAPPd9 zua~!a6ol9w4<;kgHR^UC58wfeW0)%n!ruUJA+2x5Rsa|!Uu!n^fYlMGwqFI<7+^nL zBFR$y5sYFt069dPss&Kz0dfk^c z;6fILPx$l}SWFR9J=WmoZMmFcgM=5UNlsqNoc@ zbjZK~y5E=JA>5!V2Vlqm6D*b0h$>jm@p?4R|7k8MK!wmT*MA0}46eIeWB{3YnuMr}0BI5$Ly!PO18yAq3|>?r_L&q!Y|BL2hTJGk zLc~4;z`kXJKOdovhm;qUsEYtuZUKM~E*gsxK`0^t=v1|CJPCjo)OzD0%S&bZv{Y&s zt%HaUs%rC^v3e4UUqIOxQP#&AfGPu~GS0xzdww@iWjhEU-Un<*`##V%43n8-eAnyB siz>8@e7Sz-k4YC|wEL&}e$D>%0qM}{g%`-a761SM07*qoM6N<$f}h&W761SM delta 459 zcmV;+0W|*G1LOmcBYy#_NklZrE5Ji8YC?{}9jpPDp5NEJtU%-fh!c`8C z0&xP1!Uu3gL4n``Sjri!jI>3h)G2*}G)`eJ!FB?>3s#DF8pQ5s=I!kK0pMo;-R`;^ zR_lD1gL6`-KB!4sl@S_ZqvDfNzZxp$a zV3~8D5PAT9lwq^o{kp%|?%+q67C`3}G>ynXT2=sN$LHaSd=^;D4{Jou^#J04umq5n z6^bOpGH1B9g{e1!A7vnN5C^0Mpxpz^0z}S9sbz8#wJ2Ah*=(+D!L==9q!8K8N(*MIkqi+#CP`zZn_UqO+C^*oTLC33Ks&%i9;+SY~Npa9Zjw>Og%Nr<$p zu$a$u!|ADDv)$EFlTFAhkd~(soq8kXm|7K($>V@fBw?-jA_)-()PPVotqOGAZ5)tt z^BDmQk-~N1P&6_Q2<~t2Sl2~2l$?VCJF!yD!?pG=D(Dt ztj5&=&ii5N9p4Sr&D4inpOZiTEx*~#z5v`)xJ$h>xeovU002ovPDHLkV1j#+ B*vS9@ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/cans.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/cans.png new file mode 100644 index 0000000000000000000000000000000000000000..53cdbbb5c90e050ba1b4436e71db44fffdf2f450 GIT binary patch literal 445 zcmV;u0Yd(XP)Px$cS%G+R9J=WS20e+Fc2INFCfK9p@0XFCJNkJT;&nhUP+rrr1D#UD2?v{P@JU{ z;R{C*?aAb9pS=zO38sl+JK5RU@x}rEIxc*ZTYbi{s5|SpYAfe6t9&9bhm(L0V=tjq^JOeAHk?=S2xO%| zR*IAHIjIm_atHvE++!~>_R=f;IYcW!Qky;?HS%H;twJ<`tQ5|Si@J*@z%BtWWn9!9 z+kk8W6qKa58S+~RsJ22@3XHu3fa8?|);1())v&gni6jp!0k#KHWH-SoK}zG9>y=JO6{&e_%{6QKT2=A(PF1FE(<2Ar=?CSZdvJMu}$ zHzMgg;DT1oi9#*}nb358h^(|WWLG#(#g7lb-E|1PFuZ*LFRu}&;z3UYLY#aKs;w|+ n``qvRF)>M`ho9j3HT%aW%=??Ofo!l+00000NkvXXu0mjfD(Jv1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/cargo.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/cargo.png index bf0176ea97ecd8d2a47e095dba2082fae42236d8..0366a82ffa65b5fa94b2e2f5c7fa100be17d4169 100644 GIT binary patch delta 420 zcmV;V0bBmy0=)x}BYyw^b5ch_0Itp)=>Px$cS%G+R9J=WSG{V(Fc7|$%qb$6jDZdw zx_HSe6at2H%iuL$(-&|?`z<^hlD$t6FI_TZD0D2ri1r1pOBIZBO78sA6q*l=k#)ZB zlTNym0RB5}PIdYoU|U2luQZocfbRj`^#KM-H6|~#hR-ir1b->OkUzL?V{(J-Zbyo^ zwf)e>$T|M30)7iUj!~3mBBx0hv@0M91BlWL^7WGCG)gnJ2zCgPFo5waX4&TJC41Ja zyWoDLVCXnUeRad}vERenyFS_ltPqsRpPwE{VU#Tg><~!eDp@b0UBDd`mz*tta%vW& z?R)D2&IziE&VMrDcowtPOeX@kL>Wm+u2)OAS> zD9=c>O+kDfs0;CVpwJqIjw3#RP)Nc63a!b$zj-k!iydgp{sY_9?22#8>jhp_(5?;u O0000wIsxogL$v!7<9{71fF7`jIKV6b00`s6 zcz)PzSn=vyfU@;<0QM{3rnqzfB4Iq|wk#U}06N`XzQ3GL`Say`V#jg<(B)$61@K%4 zMB?)q(Cfe_1HadXu7jx*0N0`94N!Cly$!%;9G3#12Mpr`husE5BCiRxClUw-i^4J4 zU7(w*mXtC>7(XZMB4q<8bM^62E0J&-R9;;W%|Zi7Z3?tEqA{DTVAQs Y1IX`VC+9BnkpKVy07*qoM6N<$f|0b5xBvhE diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/cargo_dock.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/cargo_dock.png index df7ee4cf112dfcf787a8e68e4b007f2cf8eb35e6..4b07e410e29efd308e689ed7baa58261a4b0d6a1 100644 GIT binary patch delta 451 zcmV;!0X+Vf1Kb0UBYyw^b5ch_0Itp)=>Px$mPtfGR9J=WS37QlKoFfosS}|Hxr{{N zB8?l)0EK%BYHk4~+=7~dK7~00O_~%gkWxk#TG-xD7dOsOOqoZlbGyPH_019h08J#9>u+RjM6GkS zH|_VHD}Z7s9rV8ISS(*!0;Zr+Gg<;<`N#W6o&@8$N3d%^2KtyW_bTMt0&Fkt6&Tto z23*H#wHknY7vMPN z7UbYMwq6WanPx*icN=~k4p4mx{yL`E71iWc(*>&r!Zd?0&6>yRI+oN9)2um9ud@XJ zTqYc*0mp6ER-J-M0#p&E8B5UB1SEmKYzpWYF7rrgb36#UV71{AP;SFo2w0h>R#aUi tfe*FlzYzo6>W2vxF`NAdL!V~<_y+nJ*U2Bf#Bcxr delta 381 zcmV-@0fPSA1D6AkBYy#2Nkl%m0hK zU&wIz@&&Ri*VQ#(cq15(*AXm)47q&y0)ubfPO==Zd6GMWq+L8-H3S`iZXh-Qb0D%j zv5qF%0h=eeGk69h;*^6~sH6$c<2<{6O4uzkaPl(c|Nj95pLR1Tn91WWO-8WNU8 zX;vA*EQeVnqil%c7??aMl@UqV5S0%pXcXik;5h-Eriue}bq&bQ1-iNh3~vai8SrNL bC>R9*k|dwl&Ptjw00000NkvXXu0mjfPCc64 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/chapel.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/chapel.png index 635f00ec536f7a9666c491dc4439f7cc9fbc3c86..a862131d76c7f6531e0dc2919cecfc912678e916 100644 GIT binary patch delta 508 zcmVPx$&q+i}^Juvrmap2(aj0ksC$(iX6?Zl63J0DtcfvIt24C*R&H+h_m8 z-T6=wF|QiTBJ#ZFrv#XS29dTciUqN=u>-%f2`sOcCOXFK8fRBGsdf@ZuWuMV0#CO% z1`1?AjWDErc*Fq!c*H?S`?>a6Fc#45`KbqUQjwg`b9-w7R3RMgrk^`+U4V#bHz1&? z18ciLr7G6}kAFBuk?L&Jz43fM#LGoa9nc}9{mj&=qeoW!RPY7MY@3(P$#GsaG(mfxFRqL0|tTVUe% zMrH=OJs&iPKss)c1=AwKeF1=U++1IyI$#q}9-#(6YeQ}+wAIEA$y1rO|Of#Te0(BP`h0dS%_YV&w+aG@mQW=N` yK&3j}8J`8xaS;#XvETJ$B8sq2KZg2i_Ky$f4^UjzPI6lS0000!Q-+@gBQ&L3>*W#Z+M*wU-$E^UU!31Yz?d7xYdI;mFT!H4$q%QDXuS^Ks zE}`J;ZvM;Z*g;ezfH00AI4ftrbU-Fe@)Nl;8keAA>BP~mZ2<_*jJrT^1{C@;U;i!d a)aeS&q;JawR0B2u0000Px$he<`QWLXw%uC+#gdbL7W0e_77mfuC28y(cM72?|U z0F`+mc4#U-3&1s>6M&N7J<3|mhDZX?R2*fk03Zp(%~EqSmWl!R3NpSY8Gy}v7%L){ z2*6}o2nOKN14gD4<7=qAJ#cx=u$sqeRuiT+4+1D_1;KmLybwEbOev@bd|8j-hCTpV znGk@|v_SztDu1A2jRu%zJRP^PgH#Ny?7VY%OE6?( zH=^Pp<^XXjzTZ9|U$25D3DN289mm7dw^On64QQ>AuPs+e4xVMLptZKfe&>(L7$VyJ eQ?6gLe|-R(2 zu1bN|=U!or!iU32vU`8}Ak(?1xT_rc>uw>$Ls^nc=PbOb2!Fs|M)V)Mg)yZ7KP86! z4uOM15>OEUKpcehwjBVHV9q$5iSmd57Ty#;jaVrSRC`Tg2LRrhF97&N;vDx?0P2tk zV6YjTSibP43^t?R1ITnv(wO5fBm8AV(wK{9g*CunGa?Scldpc9&WM9hU zsjBE{DRgMh63aL7Ial}iMi=<&xY7mYi)9y!Gg7s<|q9;s1S)?G8MHAsAV7;1xPzC_e zL@3_^8#!NBb$hzz5Wf>mfQp>2O)(c(OTaVDv*ctzkw7ekFS%8KxXr+~0b|11gqI+< z3LuoBEK(zRo+ZY$4OSD{vKGa0KQ!BevjFc#BtkZ5o+YU2)~i4C79bl`gpY`z9f$$v zPAH?QTa-m=j9*khvpsm3O$TcUc=r>#o%|`seg3koJK)lQj6qmjfnv+wzI?#Iz`*bymm@G70JB^{-Hc+( z85kHCcm>2@OstMz!lsEDJ}1^ZtPY?jz?ue#0qt2PaCYUiGxT*pdzJ}`rRaQ809jE` zIqeKQ1SqkbYzI&i3{3|ZX^GCMab;I*l$5(?bj(m0BYyw^b5ch_0Itp)=>Px$cu7P-R9J=WS3OR{FckhkoFGkyNDN)T zLnSVd1F(3^0W$OkS-3+$51V$HNtpOLR90UFZ+DU+EP*at={3&>+ zfEuL8Sp9S%)ql||1-}iuj?s(oD8P6gxSU@hnob5IT7P`vW%cZT9sqv!^{UF-)!yFs z+bg2opMrH2Q2%zyUSz;hY`<;aS-l6iR?6OMz&87X2yjKfngSt16j^hiYDQ@;YrBvk zfL$WJ|Mkri$uasWFh)Qrg=ji)=FkUeE}@hnZGZD(q8^Lr&HfG3)$E8bz6ZBo0hZ*D P00000NkvXXu0mjfdSbsk delta 393 zcmV;40e1er1EK?vBYy#DNkl}?q+=yeUx9_8>ckX9@(Xli>fWUc)=eEqo%kjx1363LANhVczP=97>%Z%)YQl8B z+&2mEbRTgIZlVPP7EPsG#onU-9^3FLAU39XY zvBr+6(t)2!O@;^wl#sZ&5&(eDFLT%?-7x@w!!&k1adNf+-_ac*EIlHKiSR-NvMQmL9iTn9z5C? z_ZR|*aH3;KE`O93qOJjykmU|&UMUW~3-aKBW5-m>0Zxf+6`;v=+zNoZ7!{z0+dI5` zy!|Rj^j;S_C(dkYF*rAwYWAlAcTe;WW) nVmVSm0vrFFKmRT7)$1Dw6PJ$WJEk500000Px$Y)M2xR9J=Wmpx9yKoEr=2t~*dmX!u7 zC|u+KX?=tE2$nnN3^_v15O-FNU~b@+1Eg>P6*SQ*7Li308a7&-{Yz#Okl;1;Xtg_^ zcV>3Hz+cyeZqOTzx2_y*o*t#XlmOmny!8gRxV{O<&fA7zvwwP%LP!C)bN}w1?3`=; z`XYt6R84U4bG=_b`hyn7GR5_J(HuL8{G3*($HEv>+mI{*NAwNITz4AV(swKy4I zHeZ|^LJM#X2qOT8kjVvv6@X4uh@$|y8BT%FmZ1qkEYmDv01^P~pmj(gknO~wBIkha zz_AGn89)bNlYbjd04Na7089`nDckYjVTfMecS8o?<9&_Q^U}T@pG#H%yx#e9I!RC$ z@t)0N&Bsnw1zE%prsXc?+!kZqwaEbDsb^!`${L`X;U?QTfT+9*zU6>S{P)eIA1^~? zH*6b*Uf(}DwxYtcMBB&{@^@ZLL;EO=)h1K^znLbbSdh@;; zpyxTB1mL<@Oi@E30%lI*VM^9QtD`vHe`W?EN~Xq`6huT+T~h@hA}RZ0B1Y3(I+j$u q1ykOA6+q7qN6p*t@Za)Tv%UeErgobM5?7`G0000v(JayEL4o+TND`K29jta$~~_fd`W(B!h53 z-)*N&sy_}~ILXTVtf6a*MBDD}8i{v$pBx_^E@IszWA;_VTH)$5=H{Y1Vik7||5#}z z{~&A1<823YT}s3KH!`1KT++gDac6^wgO{J81k>hzjs-tBj;WiS7v|!evo=YwvXsp% z&u)>9BHN!|zd9e@Jv>`tZPJ{;505{ygC!md$pf8m2*h7g)Vw*l=?zC$ZaY&Vr>mdKI;Vst0R3#IGynhq delta 330 zcmV-Q0k!^?1LOjbBYy!aNkl^wfOymL>3JWR^VBr}o zJb)F2g^>$TcnCM4FroGoHd=|Oxa__qF-E50x4aqNXBMEtzoXZ*V7=L0Z3q_gNXemm zxZdophtma8<}7j|fw4DKiWoEnkut}AHDd{wF1HwaBjuVtD}Qo@V7lDegs>CP1{zDC z0=G2Q0zRdkBZ!>=BJp(1ofPdJ&}}%=#$-34?>e>TrqC`yU483_P5Xe|14){3U$qy| z#`xXQIpJ?Op>3M21=wuItq7V!U5Bs# cmUrlI17y8!23K}i(*OVf07*qoM6N<$f_B4_)Bpeg diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/court.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/court.png deleted file mode 100644 index fbb8c50593e43a54c2f61f5a8d97fe98bdc090d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{&lP)gv`SZXI&h7d?+=Mz}li!a~{=o{Fl z&J)<#1wu#}NT;QW&!GN?zYOci&F;?KWkAMtasTgTX7^@mNyYYm0p13qqm{_#^8LXJ z0OIZLYtm?SqQwu}HQezY#0>z&JLivuJ=UN2H4`E;0v1p1uDAL7%AAWT!slKy`T5<) zED;AV?6=V z5Z(X~DYXcTHuX^~3z2DH?m6#zGXU54x`j|>{eb%-Djk3kC=I}EJfxu(cplK30=S|a z)61>tTN9Z8=;hH)TZ9;pm%D)u;L^LNx1z~x7YzV$wB+iGiG;Y<%ln%5)hzE%mR9*u Zd;%Sq$86x@y|e%T002ovPDHLkV1gIT!BhYM diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/cryo.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/cryo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0fc6d71683852e419285e836efa71b6e34a3e1 GIT binary patch literal 3065 zcmVf6Xi@@54ZTQ_E-Enz5K6$1 z03tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUFWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il z#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|>%+C|c55>;RS}qbKr-&IQ zTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bf ze_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l90Z_aBhs|Iw0E)7{bq;-T z9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g z$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL1(`yIK=_}U_z%PWq}jQa ziQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{wo%_#%{(V=tO#a9gB!7-$ zM?^BX5>d|Vn*3S!?g~$*UQipUP zL&zMmg;!4Do9IA%up=Rh?=qPj=x&RGBx1dpI68aT- z2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3O zju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvDRIYI4MQ`g1<+DyrL=EogS06Xii({|v`U^zjmmKqDIK93(F5q| z^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6bsWa4l)YH_rsduU0(?DsM zX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5oYvCT^3%%Fs?s{6^;Da# z?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR{dFa}^}2()GkV5)QF?`X z?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJuZ@h2VvIHzbs0S}Rx=JT z&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lghs_<#1?IcWhb_<+P8LFo z28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wuZrx~o$A)4PXj5p@WAm%6 znJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVPgQJ7Uq0M2^(ZDg$vDWbh zi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%562@eae34a)26HyS+zks@6 z$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWkUW(I*6U24LW8oFzvR(TOpMEs5_rp_~TJ^wNN(wM(bC zZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f)7E}wKr~0SXrM^xJP1~RL zDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N5;bK**^9Ef#WdN^)PTf9 zvR*Qp{o-l7TcBI8wqSIn=gRt3(5j`Y zdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7we(PI{6^cd0H#WFzsN0Cz zDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8%%N=0R?Jr6*6Z8cw;d=~ zF3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~E ze(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H9s-9XhaP{M`0e$>L5F*f zu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe@An_mJyvsE<#^c%!il02 zpHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf_v}A;-u3*k3(gmgUSwVD zy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+fub#UWaP88_{E^}7QP*$Y zNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw%>L5Kn>ODH}V8MesW8ASP zKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j|6Kdbc>FRj6+1Ql zT=e|YubW?}zu5oM?q%DiJqyhfA?sPY& z^JVSI=wtmV^?J~mhocD|pN7`vr~M89Y8iwSfSC_R6Kit-@ce)^1&DjqLoOnxyiYj= zHoBY-jcYCgf|MDsk>>|m)7}Aq-z>C&SWQ7R9teHq_DD9j1}L{jEer*u6(CDuX@8m* zf;j`C&OhK_4P2X>sxH$7_9+j&Y-$R&5Jw**XFK70_e*eFx&-v+Z9Z2 zCm~hFyTG+>o&gd-G#(&J;-59Z+HCLh{rq^@@!SbuF$YR9YY8w1Fc zB{5c;3IMR$RE=vBbq3%gWG7;mlaU0#B2;}DRpTick^ZYs=gT^Jelhy2w&`*{pnQK5 z>I3CDaN6(S`2jgsK+B`hP+12 zBTN##?;L^{&t7t{X;%9xGa+?X!;?cD5nr9vrHu?OsA&i3N>Acuv*GF}IUx{DV#pMh$D7h61#zc!y<)!@{_hc`fVEcW5bKai!VNf6f#&TOi}3c-H>A45U@za z?4r!CbnQ`5^n;HxZq8Z&=R-dz+4Gd}qPgg&ebxsLQ00>{K Aj{pDw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/deathsposal.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/deathsposal.png index 28975a1b12b7eb516409bfe62fd84cf92e4a0b63..1fa88f63afa4f524eba589a462e26b11a459faf4 100644 GIT binary patch delta 445 zcmV;u0Yd)G1J(nOBYyw^b5ch_0Itp)=>Px$kV!;AR9J=WS21gYKotI3x&{KpbTnJQ zQ6!M1xaAkvHM{f=+#hKEfqU1u7rIH8LJ>!yTO3mf6#4_~5T0DrJL7q^E$uhu<>`Ij zz4z{&5BTdilQ|d5RiTUM`SHGy>q16u&gQthn)W8&@3sI?G=GU`6hP$D*}Qe}weNrh zvGkeIctSsGBF;rG>Dc)x>j?!61!Vzi-+^rz007%Eu=br{1%y!s&ou!6o@*kEvS9@z zX!X{e*=;&Lz`ck z0zT)bfFef3ye+DM#&7k-a#h&ZH~iOZZ+yJJA$i)=<~9Ri1opcvM&pT=^Ui{pW`i1p nlacPhBzt{noQ}SIH2cRVKoGWbYj>5E00000NkvXXu0mjfr|Qy8 delta 436 zcmV;l0ZabY1I+`FBYy#uNklygFqg@6vv2Jch%c9CLx*1b=UpBnVsErfWK}hvX0ey zQw}Ba^l&THIg^Q-izUu4=Gx->-4*~!8AJns#OI4;=j5U9Ab*I`)-jXmj2?v$r=pLB z@VxJQLVz(%2_WkRuq^|j?~Dr&CpkRV1ORxhi8#r}1z=fGiN;9|mKDkX!fn`Q z6z(8OE8+UPF9!e)UQ-TGo0eo009CQU07Riy-3dwnyr9b3YXbyP3fnTYb^!2OPr@Gq zpc{TbF$Z+cet&HMos2&Uz_yI)zzL$X@|wgU`1cmTM*xj!DjbIpdgG%?GHs-JK3 zcZ4+ z%YnvU>T10y?aQnB->kO1zrBJz-U;giVFdQOEhf|1AT9enh*GKzgeEK&hAvFPx$mq|oHR9J=WS37FMKoETiX$^)Tr?fkR zN+AqxLOP!yY2E7vK7nrFK5cx0bRtc_7?lQhR_Pc+AO}#YG2{J6yE_UglGjMukKWsz z&+Y(!9al}A)7iZ4is=3I*~oR%L_Qo(aC0G@P+tjYV;@l7z^)u*$0o!me1+pHL0pFJNa-(Ix(!0Lpj!ydie9;q delta 407 zcmV;I0cif+1F!>-BYy#RNklZq}6n(9-bnj9rLoNWK>d-TQgh(23KZsy|8!1D165``;{2$N%e+*3c@3=8d*lc$v zp8#*KFM}}#oty3MbpP>#rmCHS2T_RQ>TZz4%(O^T)kyckiGM(zNj$8c2j>_GD15I! zwGv%Ic_y{ZC40-6+_!k1Nd!@-FG|J+)(Z4N1z)^B{SB_qROT1VI$)pogzRD|jpt9h{Sl)&xpf=&uBzZPkWLS+sn% zu-*bH=>qL+rPx$nn^@KR9J=WSFuWwFB^XcTz){(+nQdm z3pRorDFb$w@(c%pA8=M1a>?vwHd(RI*Cd-v=DpdOSu((1$ARkQbT;3aB6@v(Ai0iI z+^$<=SW2Ejwd)h9}OnoZq@+M zh(z=RF!IrOGMF3yj!(|mD=FfT`p8D)y8g%%Q1CrRo3JQrZCfn?j9kaD?>X>2M_UA$ z0)Ledo6r^zg|2iziG!aJ;Cl|D&_$M4Qu0N*+Dm}423X|XCnMy^b;KGA$nvUn+AS<9 za%KZvhNhUbXGjjhufsO@mPz0_uVjrOTQCRkfQGps@gx zD^?d;HBgjwd&TP7TNPmH)C9&gU>m{{V1K>MDw=OEYAvz{fScu$P=NFV7U^o|3YM)! z_NuP2nt~(_+BVGc3P~I&3)iXu{sfA$?wt??X%|otiPqG&%ua^hU+Q!=Z~TiZ{%>|L zzCJ%tygZWg0eJ%3%^LT2m(~Pa-=@Mna#*lEm{jj?!s+PON3(x?0|e0A(CR<*X$$}W N002ovPDHLkV1hKG!$kl9 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/drama1.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/drama1.png new file mode 100644 index 0000000000000000000000000000000000000000..af0d276d5c0d73da964edf56eb88e80b2428eedd GIT binary patch literal 627 zcmV-(0*w8MP)Px%ElET{R9J=WS3OSaKoI^wP*4PfkbnaqfoP$kvAj~Q-~+rW2cW>6yHId|R2;xp zh_sO#s?Z{kH~=6;(R(RUyaI}3*0bYrY?B}g_?l$LyYqeXvtt?f=~&Z@M;CbiD#GVG zpR*v~=mPJX`@q(2Zo5C7{hmE6M?M_`|KEHOo&X|0JZU+b-J1Xa%&6to^uG+WN1g?M zm&b`GVqG5Qk#jP;Hz_#Qh&AEd&iw;Q2DXoZodf?67Xbjc90CA({RFAa5Saj-c9J`~ zIadXmQ44=xC;0c2XP{I7&j2SjahONh9pujAu&|Gxryv>$;8ANejZEM&klL*D4DSIc zpwI(a+MLtNAYy_xg$JbVqW{ZVJNE{aS_yr9IH=C%N-D^qQ;=Qk!{%+#g42 z24;l%At&r=@kHdrWdT&)f=)YeDeUzVuQXJ5X(Q5Eqb3Xe*XjXEWok2Y+C?H-^L=!V zM9__qPzTZd?XW;jps}ktBT+KlJeadT=glUe22Dg6xrCgAwFZ#{H7Jj)4!MR;WndXJ zdKXZK(~Otv$OMJw{8v8LQ2jEBL+>i_HT401&dZ`bZ!ADUyM9uz+`kBo1!x(m+P{h)`!WeQ2AlPMXa8F2Kj0Bix0MGb%MV|dtLwl N002ovPDHLkV1m5b9z_5E literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/drama2.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/drama2.png new file mode 100644 index 0000000000000000000000000000000000000000..538374ce404d406c0a81951dc09b15d291f6daeb GIT binary patch literal 588 zcmV-S0<-;zP)Px%21!IgR9J=WS3OU|Fc5tp7&?@y3*`qO!46ZGs*$>N?p!hTCp4R-4&f(w;s<2x z*hr4DFqO_Au~q_>3OaOP2t#nNFV1I+K!Ufl=dzwYUNt&upO6S69&2~GYy618Te zg2aC2>=MZV0O1_M@r#B8U{IhE!Z|Fv3)o!%fN=cCE`Y)cP-*$B4?gR|8rQ)+hJn>7 z!MFke08ypmI{2)Q$#4Nz1ONb61egpLl}MB$@CjE0ST3j9*m60I36()^515)tI6kk9thAWk1OO(w~OR9*~P=Woi|!2;xNCV+o(SPA!5W z@faPQ0e3g^c#O(AusRs^m{D$7J(XKcesOh)w}-FC$Vi~k%6?ExB+`;oygsir0+rqZ z*`V~8R=J2ODXd_x^_!4;3@y8>9VOM4eW3c)Z87;v6QEGf zIZY@D()n2^O~9l`-u$fy(294BA3p_&dtkEy8m;`js{+gJVzbi6e%FVIN@DlvBhXK? ae|!LaZ!HcAeT=sN0000Px${7FPXR9J=WS3OI^P!zpN9UQc{Sf_$e(6Muu(m;2o{)OfTxD=Oc`3vb^$S7`s z7qU1x)J?&ugIJeRD|E1+L%h%XzLJ+TqM&EV`#$HL`|gDR{B>;U23s9?|1QFZYmrkC z(CWbZ&LP0=LG|RTIl$YqC_)f`24{AsL2cH%_rk@x;$e$3~bQIEGx<9LQnjFkWi=Eqi~xQ-I)$TJ1d4W<(IDt+i5}PhybO7P@JsyrA`f7(Pfme44LF5VKXg{{)Fjxzqo6$<$ zEkc$k8iFRHA)+2Xvl>MK@nqfDHMi=hb~v`jr-- zb0ly5MgnxXT_t`z3zRyrngi4u`LQblXVin$TpasdKPFT}_4Fy^U$cLF0B@x-sd=Ud Qi~s-t07*qoM6N<$f{wWXvH$=8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/drones.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/drones.png deleted file mode 100644 index 3d7e65f7a57fd46dadbdee861e15d71d43057f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmV;G0c!q&<>lg6GEvYYyw+YQ5Rty*)vyHYho#1l#Dv z3UNIYM5-2X-UIH_Z72{|R5!->syh4$J7ru$`yNv7K{fSx@$Kv`7al%OmslT51C{1>$SYpoan zJ^;k`=-eM)eKZKbDLL7CUEbXe_?-P%K5Nz|xTu5#!@|^000000NkvXXu0mjfUV61R diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/eng.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/eng.png index 2d12b080fc7cb40ed8ad81b42f7159274b9008c8..5a70940bd90814ff369ed54aecc486c030d27145 100644 GIT binary patch delta 393 zcmV;40e1ed1EK?vBYyw^b5ch_0Itp)=>Px$TuDShR9J=WmoZMmFcgM=5GSAmk{RFt zc&P%MB~uQOwIgc|ktt^ZqAunDFkmS|xk4GLSGlfVJ3eIx0FjkY>30A1a|;m_9WL&+;S@CkR9@ZA+(drdzh?sgi2B6- z=z&C9-BYy#RNklZvcK%X?($;UsXaqLlT4gKp zvSx3>wKW0jTYpf@BLq>T-WesR@O3U#Td}@oO4?Whj1m>RxjvgO006W30*n$uZA$(0jfu7$rD%?78`G`5kwB0(uCjDG;W_MXmq<002ovPDHLkV1m+) Bz`Xzf diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/engine.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/engine.png index 2c4f14d70771827b0096a605673649f6b68153e1..629680bfea85b70e0e38e41d12c97aa1df7c3312 100644 GIT binary patch delta 421 zcmV;W0b2go1HJ>0BYyw^b5ch_0Itp)=>Px$cu7P-R9J=WmpyKSKoEtWqnscVkw}po zAlo4Fa}_EMLF+PY4nf5Ma*8C#MeqUa!blYM2_iWKnrIC>3$u$YOUY|2GYjvVVOR#> zuWM!t&J*mXGI}Y@UM#>o!T$CJxDNfzn;KYe%n(KZGJm@FH-9I+FU=5_+zCUOhblu5 zC2YLPh+iS42|E&!K3nb+0p@c_8&UCf;T zOxe4d10GGNn-ds46%rUH05Yxe_@Ejm>47Sbja`1S9sv4%;L`)%Pl1oQ6F?9p_a(}qO96xWaI z>%{;-n>B5*)C1fgLUFxPw)LX`r0@6cFfw%hs0!E`u4~xs6YmP>+AfM-M!F%zB_kO- z6+b=zcUKZTyH-2k<5MsdH+2gj$%a#v$7pJE>^whAbRGzQ`&Qhi*}r}O$ZykGbfFR7 P00000NkvXXu0mjfXso;= delta 446 zcmV;v0YU!01J?tPBYy#&Nkl&^D` z8wVe6uY*1YC)b

FM|mscI|dN#J7deGWoAjv0}vMwC`o0Dn@1n0do%9;_^1kf#Oa zyJz-)RselRo)*Zn!m3m(08a}5ZCPkM-#sJG3IMPw6$>EG3KM;!OB_T9pxtZ)Ltr-n zh|&sD)kp#tjvpflTu4=$vE#=k8&?N7h|omm_%Rw?!trA)R|~Ty&k96o#md5DfFy8{ zX9bq4g^9A!Wq;=hboazn0i>$2TrJS(vJ*9Bg66q>V=_RLR-MSG_5gllgrm_;*oTlJ z1XR&+d=AAuiY$PG2+eLMQ3)t|DMA(m3jk=NqzoAK-x*?;;M$r5KppQEngn1Q`4n*W z9w4LCkoqn7rl$bF#h!l-a%9?L-v^|sjY9zDNYZz%*f$xV6n_DTUVtNjC{5XpCj%sb o+jc(-C4r0m$eKUDmfv;PH&+e1E0c-@S^xk507*qoM6N<$g7$&LfdBvi diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/eva.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/eva.png index 2db7d42645646bfbda6aa0634d6129076b12aa60..3e5d2db3c327eb11dd23129738481b66359c3f89 100644 GIT binary patch delta 492 zcmVTBYyw^b5ch_0Itp)=>Px$zez+vR9J=WS21eCFcf_)T?>Wcc67FY zM`Hq6O17N9U9;x~Ie~BBy=#4fZl+5i1dWDl@tB%Gp$Bl6epj|6>nk>NXdi?a$<}-N z`g+m_{yHxDI_Jw(Jr>d1%afMts*l{C&TxA_8BBgU9sr=$iGR=vAo9s{Hkcd$u5a$> zQ4wK`K;O*6z(c(7mG&$zA&Sa4Ub){Y?M4A6BzwdAq+g@yP~KNFZ@QVX-S*}P*{_7)R3EUfcokEQ3U7&5#dlc<$#Pa z$k_tq#1ci-OMgxwryLkXfGDa~=9|`4Zr`Lk>-w_=06#O5Bhmfo-m`&~gvmN;ML=gp z)J9uR6qWMbSpvF)(BNU*Yg>8)Yr$v%qFBE_Z>m1lWwlFj zfGk#aLXO+@L3>x9FIRQ=@F?GA2jlbO9pd#_sSk`vcsd?h0$kS?XfMZiZJ@wd8I4_- il>4o=I{Nj}>>poLtOnrvSizD2000015QSetiWIqlRVf5g?85300;^FML`qeu zjn83JyK-rQIyWwI2n(dzm2(GoPPNO%KPzS?IED49LA%WR7|mz|47zpQ^<9|Fmj{W# z^y59~5j>pDmxr&%Z!~SkGB;Ww-H(D04}D3Rw!`P!gauI46@Su~QSi<^E3;=%)RiO! zAE2l!lv$24%S8|@0N-%4+nzk5sJ90$85^yzSg%~%w4FPr^b85WngKu(#qOCOQzwQD zU=5Ne78$buY-x+S!e+O1rnV}aaV1y4mo=71^c`s0j$L{&z@;X<8i1YuPx$q)9|UR9J=Wm$7ZbFc3w5f=pn`g@F`q zk}C{k0jvy`5{VQEWe)5Pwbpc0Q+v-p*MY_2z`Q z^-UP!%R|=l0$fUWr%YOi7yz)6>xL~)2~tH~dvAb+h#{!hx8jBqc3zHY+HIXB1vOx| zj*0+(y&YmRC1syKMJEH8p?9S~Pys;%0FbI~OBJ<(1gAhyfh1E^JIPc9vXW~gnL4nW z^V)RO9^g>h?|*&NnSwm!uto>@=l49V$GRd=j&Jq{1JsKu2qGirwBK~iIV-uY_QQ`H zL!hn)T{;^;$PoluZo|j<6Q+~#U_jf?FT8GE!f(S%>G}Z{B1WE4bsX&{+qo`qKg(_( z4Zs!9b;eD*S@CShUI6w&Nv4pebO2;KDhm_^9mOC3+e#Tjxa>fA1iLOFR%azN%dIaB zF8!K1;EjOR8q>)*Xd`tg$rQBKPTO_%_>Ng;t8GCZCpiF^XKcBI#zVjfYM}N2Sx;7yb>!}B zwJlhzv0hDpyIu-G;5+7ioaAO5C;3q#st^RegD^_XI*ignoWm$B$oalwQ0D;8>{GJ* z7%D^XFzEsKc7H3+@;J$j8~`2{>x2FD{MiKfp@HudVs0lLAzN*mFGF%UZ!&fm_?j%& zgi2KfWJy(-NwP*8k*3Da=>xy-Wpr@@^O4$7MdPR^0(L0>FCEtvwwU6Dge~+dLP$R00000 LNkvXXu0mjfuWjKb diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/gravi.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/gravi.png index 21eb2e861365f25fd830d1a6ed79432e56bb494f..811d40aa898442b5812200188dfc94181c9d14d3 100644 GIT binary patch delta 398 zcmV;90dfAy1E&L!BYyw^b5ch_0Itp)=>Px$VM# zc&P$COQs$oYe!ZNktt^ZsxIjPU}&TaBql#coO&traF5&$YJo@rC%gZ%)HHB!%n z{P?)5#lG19xa^EW>%a?u=69a)6rAs(^q^%>V!Z delta 433 zcmV;i0Z#s>1Ih!CBYy#rNklj)B4c9T&*{km(vFr@0^@xafp5NrG=8G{vLlb0ih=42sTz8+v zp<)MQiJB%>5XL!>R!1=2q2BJsoeLNM&ZTM$5VaI(b^NtE8Nwwetg0Ytsq);n2gRvN z&oIt`(Gi)(M1R;tF1R!-;|MU`Dc@NRy=>dcI08R+Cx_mr9~c8fEk)lR#wf_q5Vl;Z zCsN%P;6y5b0O_lK-g&r8Wdz`R;CKVL9>*r&R;?JgmK@`qau3K7^>#Oo*+5%0qN2>f zc&FR}D9(#AAN#`H0fZxQ7RXg0bZbl}>ppPCR0+3ic`EEK09hP@IaWayhuF`|`SZW! b4?Xk^O1HJogTRu!00000NkvXXu0mjfxwOf~ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/hydro.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/hydro.png new file mode 100644 index 0000000000000000000000000000000000000000..f23fa7960de10d47971976cec74d3a8d0b36374b GIT binary patch literal 479 zcmV<50U-W~P)Px$nMp)JR9J=WS36F`FccgR6cn(cVL8A`aE5K7SjrW0245kayIdh>$Q2?vO2ZjI z;s8Js!4@efmSW}Lc>T|=K!Rx!|MKQNd&Uaz*KuMST&=M^RG{YveJmq^)f(IL8{p!4 ze(<3OKHu~tv;;)(+xtuB$8(aP=ACoi%i~5%;?%UjC-a;npcz9>66ajg_lyL5Kr=RZ z#vq!2nzc_AbT|uLz{?f@K#CLq1I-w!hN0%2GUkV%3h=T;)v)os=G|WKs$t{%!3i7# z!30Fff$!~*vkyIxK?KC!$|MBj;2~$gXhc_cz+$O4A~|CLSMc}O4L+U%jK~JL5pU2NQ6?ma$L8eq04c9~gRIu?*L>4x~si^!l;i`C}rJm>+%z)34b-z5xFW V+gU*~Gv5FJ002ovPDHLkV1l>A(Sra0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/hydro1.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/hydro1.png deleted file mode 100644 index b20654fcd64d131182ac3e9f7bc4a124e5e44d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN~oP)15QSetT7x0TDdomASiE;_+#2ZGOF+0iaSr z+yIdIe6h4P2Y|_RMyFDUd)Y%KU+#Mj;xK^kIj#5V-X{exG2gCTL`jP6+BJgc6@bir z7>1=t@7#9@FeFA;|U_J@KEApHy4l;tG=)aDcq1`vnA4GdSTA&8O`QIgg$B2ZVc zGSGyv5i0|Is&fXK=@w&7Hacg3OlTg6F-M~h!RP?2zkpUkF&-2k%S-D8h&1{TC;=$N zx}#VRG-K0x!72mItyql3dVvkloM>%ZFK27k0*H$XO*-A=;}j=WL!kR&lZ*k9zF@W4 zRsQpfSj}4N=lcuU$D6c2kgfyQ%NdjD%xa$}MM+A%fmG6Fq3_0|_&h1QqtRQlfBgal Wgr_VU2}0li0000*4}gCFZQ z(nest^bjQ}q9pwW0U)hK;5ZE20qhQi_Q3ic0XqZ8@=`ibG#VwT15QSetT7x0TDecanQV4^akj^JaTKBqvPM{m8PaB=Uok$Z1LZu;{RXWBH$N`jU zV6&Rt9a(D!w96nUyj8h#N#npfZQOdH$0&yv_5fNs>c zoHd|A6lEiZ$dVXE**O2#>nZ3H2~&D>i6fvx_)>2G0HV;I6~Jc{PVR(7*|0r;*3J%4 zZx3D~aZ(C=>h}Urer=!XL8V_uVPHMToB$H(C!TsuXN9Y2Spn24r>eJAxU~I>0n~O% z6>qD2={tZJz$KfPx$b4f%&R9J=Wmpx9zFc5{G5eJ~4N=>zO zE|7D$jUwkZ+a*FN*XP&^xTd1rR1~?v(BQ>uJc;cXgal98!to^Uo6-1Zfxj-XHrWAG z%IKN#VgWjUDgX}!%ohMN0}%wU=1&F8tzH?3JMM+p%q1B}GJl(K-1k_3RAWg7jZ(?q z$pTo*IJP2IY!4g&JSLiJQ3vC+sPP8i1qnUCY3?V?{j_Qx8gt6-0S?5E*#fywF?E~l zJdS9TVj(1%s48Stz?z@OG3WI>05|*4a&w=>W}gJ$%T{5pq5xuz8l{r5j|SKSwHtsl z@*A)kT2w;|;D2*BjDajt0c-558rn^WM9+-0RjeLd;?`D$pPMg1k7>yb@>9Qnt!B(r*G6$c0%%h?sM*~H#( z=6?GA8&R&fWyszKmJfiGY&dCAV`1ig=N}UnqJTfZm>K^I0Nw$)rqN&S8O%Wd0000< KMNUMnLSTY$BEIGT delta 369 zcmV-%0gnE;1B(NYBYy!>NklNL^(hY5DJAXfQ-*o58Tcq%dQ@%B1s zV{mYHIG%pKzrf5Q<3xnT^UEN_)7U1=jH+%#0L~gLM&^tHw13)fH#a>&M0o$)WTFWG zm>EO_rBwGXgwR3lw`Yi4m}G#eZs4rB@RAp=7hg2UIy4*ndYg5WKV?Zof-`||t) z{B<0Sb*|Rfg(7;mHFH@7tk&3_UI4Sjbn>cDv68YtzWhJpuH+yX_Pg}g+ zGg4qemPn^rs-nh5xkZDW0-E;_IOe>pXYX1D7w{c8xB!+5fbJhCD`_3j_M_Tdz>Yv! zNo2{V&1jh=a(`5u32Xt>-+E1;Ys1k0!3BiI?-Wp0vR{yB$<06D;R0U-b3tgZ1n6+5 zB7!Pvq$29u=^ml$F8hX81oUD?}s{ zhSn2N+W_-rm|TlIM%$SCe&)r5ikME{!FDzK$2$zQs}Zi$#nrt40000U$B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ri3I-Ae0uQ)%Qvd(}9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0gOpRK~z}7V_+ERfDxC3rF;B;YFTo8=R%zJuz%pPTwdLbL0DXYV$0vY ze89lK!0;cJBUo@*uApv472op;h{2dx9l?Z6lZb>8RpS|-c~~95%*sYp2jDZ0gh5#~u^?`>B=dQh`z5_xX-dd4xkkv*#Smcq717KJj6;<%>jRZ|H7(x^?`>Bp$_u!M21X< zI>NxofXU zDrl${0*nI@1<01RL4(^!OO&BK%LJb7kV{AOsG&*-Fn=>KVXYI8Q$M+70KqiypMima zjg^t%$4~rq0JG2UG|9}NoTb@@yj4Jhi<+L-fz5(&so7x?dhc{2*>>Ukw*K8C30M*H^rW{-2 Ry#N3J00>D%PDHLkV1hwp<^KQx diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/kitchen.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/kitchen.png new file mode 100644 index 0000000000000000000000000000000000000000..322d62d8d2e6d584d30d7ae572accb2eb7545983 GIT binary patch literal 486 zcmV@P)Px$ph-kQR9J=WS20e*Fcf_t7#KpuLODPsm^*fH)cekUU=@=|P3I!>`Vku4q&jOw@5_xDbBIQ7+h-mZ% zF#QRPF^`5#lgim1Y?_$a{it&9i)Yis^d~T`Egq>5SqJP{3I(3BT4#95YM1Or0Xi#5 z)>HQfjRKn9z!l%BfI8%bg3ijQT@h(5hyi&m*sg$1H-66t>^{qO>k*L?7E%Emy}z9*ib`3eaIW53t_sD={>dW<}M~m@L4AM~(m;MDjYP zBZGAUBE%h1pIVNP#sXwN=;H280Fjd)03eAY0APz~B!I|?6hQUN72s?_SKM7dqY$K7 zfh3L;4^STPE`NaHEPCMAZUJRLA~nr<6HsTD-VzbTzRo%?0`kM9+MOJ8F*9TA@Z*OeDr{R16009_DL_t(og=75x|3AY(0>)7X40;Fj&00Z`3yabs z7|C`(->en?cXK>txN!LjS(Y2<>M*$ekjCo>f)41uy^~>OXn!GD4hUb}&rquBPCW;- z-`LGyD5J!1{>eQ!jSW<4xYEu6!~mK(V8@rcL^;5NN0~Mb81N84cL2;HT;eo!fT4^M z!~E@=7#J8B7*>WBqR7$Q0mzoa0J0;7zXQ-6LH8&?b_4?h14e-~d0f zfOF7V*7`(VS!p>37obj++Eof}uqmRk*49om%dVYB$=3ja<$LqPtbo6+=DV9a2(^rk zikAwogU|v`70eglq(CGA#Qdd#x#(Sic+eKqh}`l%6~LLN&fFVjfU)Ul4_nn(%qQ;w zn7lVZROtcHYCQqLCyTua9CbuZ+qs07w1Zw63f zHe>Z?YAt12l>5K)$0UZR;17!VzW_b~E8>Vp*tMzJ P00000NkvXXu0mjf!-lYR delta 340 zcmV-a0jvIu1MdQmB!3BTNLh0L01m_e01m_fl`9S#0003YNklL5?9F@MB4z(`9J!xD5pa;ShD zckbG2>Nx;p8M2RwQBPF|&=QO~VAKIbIRKOcNXhG@Px$TuDShR9J=Wm$7cbFc5}+s?JnV6)_@Z zVCceV3c0LOhrT zxOj6)JR`tw>E-~Blupa_#@ZlDVm<&RkWLhE@)Go&1!{lt3>0}<2fa2MvQLqx2&0ud zfbFgXkp3`HK~!VeKa9HLk^#OU&;n^1_fanZ6Nrs53xI2C1;D8VYyg`YK-JAl@g1NO zpqYH~em)DZTz_vcp9S@EdFjSk1E|5&pkcH^mc(_rm5JInVMze;KOn1J6O1Dgz;;)n z$kSHgaq)SQld!Am>6S^&36qSw;$ZAy%m0hK zU&wIz@&&Ri*VQ#(cq15(*AXm)47q&y0)ubfPO==Zd6GMWq+L8-HB4lgOhqu@4j>o> z$YAp%ccRph5@jSg00uk*60wSJ-!PwKvq+8tU0nmL7H!`!pMODD*MRm8kWn_oa0JY9 z8D&F~9Y9tTz$}6}f?UhVb^y!~*;PT}Q@Nyq!Ik|u=2Y3b~ z!X1I^7;*|Jk~yOQmL7cbAVIC*$bdpq-2u9~24v>~U0nl)Hw4rSc(Z&Ii~<0xBw52O SxfuBX0000Px$K}keGR9J=Wmpg8QKoExiL_R@WM8bu0fNW!7`z%x(g4ShP4nf6P>>!%;0qnvn zQQ#}sg*6s2JNp0JKR9W-*F(H=4Ti|v#owf>LlGB7yUao-Kb-&qk)SSf);?WC&c3_>Y?+(D z1_1#0^4j2ZVh7=0X#^MnMu1-da9xIhjth}#!BH~x^5qTSlbws6e+)d9o4x~)K*R+C zk=*~&)3n?62d4^ITr|l=CQ=g{YL? l_M8`!CPe@6H*r_9QCGiqcA-lz9ku`f002ovPDHLkV1hR8tX%*A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/medbay.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/medbay.png index c9c6e1362a7f973039ffd199b7a7c4827b7dc6ab..e57571f6821a78822ed0771ed2c4c228a22933ec 100644 GIT binary patch delta 508 zcmVPx$&q+i&v)+V8iT>0x4D!O+kefw7D5X^<`Z_KePG~w z$as#x_u#WFxNxiMjOW__ti`Jq;?hKIdUG-bpgjh@*XemifF^S;TmaA>n;?1tsOCP~ zB8^y8?u_S1BX)4VEkrATx_KB2aN#127yuxR7`Si|#-cOCRTuM&=g9c}cREiahAla^N#R(T_W}S=Rlv6Yy#Ul4ES9VDh7dRm zT|JOz0U!uqAHpBWz-(Fq=vM)&Wk^a22T5V~=A_mYsC9>ot^?mg8nJ`Hlt%2d)39!; z!q9Y7GeA@EaIs*`dDyoWF1znX)>a`!}BGZ1rxD2I~ y7!93X{UwF5fRs{u?{|Kfs1Uu~zhwF}``0H01pc!c)+ho10000!{?0v delta 287 zcmV+)0pR|X1i1o`BYyz^Nkl%l|Kt z-@$PH%0;p)H`LK*hHwnC0D7E`mIK4a0c6(&mn2+`aDlvKx5 zaRAJ)4CiQu8GDy980zT58!0e0x*Sc4;*&40FfcGMFqn($FfcGcLgxIHiwuT3`V2Gn zE@jAYj)wDz1td9Of?yGfL+lU7!+mV1qYoD+1&~}4!h_ZpNfH;E8V)ej(I-0>80zRV lFg(PsX26@}qZnWm004RpTw$E^!8-r|002ovPDHLkV1hb+c!mG~ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json index 97be2aaa0d..a13df6f7d6 100644 --- a/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json @@ -5,1490 +5,490 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 4e0bbe682d0a00192d24708fdb7031008aa03f18 and bee station at commit https://github.com/BeeStation/BeeStation-Hornet/commit/13dd5ac712385642574138f6d7b30eea7c2fab9c, except numerical signs which were created by discord: brainfood#7460, states: 'survival' and 'ntmining' from https://github.com/tgstation/tgstation/commit/f743754ec3ef446c8172388431effa73aeddb7ff#diff-b429dd7fccbca60d740d4887c1077a178abf1efffe57e7ae2a0b607c8a9e2202, 'janitor' edited by forgotmyotheraccount on github, 'arcade', 'barbershop', 'direction_exam', 'direction_icu', 'laundromat', 'news', 'reception', and 'salvage' made by rosieposieeee (github)", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 4e0bbe682d0a00192d24708fdb7031008aa03f18 and bee station at commit https://github.com/BeeStation/BeeStation-Hornet/commit/13dd5ac712385642574138f6d7b30eea7c2fab9c, Job signs by EmoGarbage404 (github) with inspiration from yogstation and tgstation, 'direction_exam' and 'direction_icu' made by rosieposieeee (github)", "states": [ { - "name": "ai", - "delays": [ - [ - 1 - ] - ] + "name": "ai" }, { - "name": "anomaly", - "delays": [ - [ - 1 - ] - ] + "name": "ai_upload" }, { - "name": "anomaly2" + "name": "vault" }, { - "name": "arcade", - "delays": [ - [ - 1 - ] - ] + "name": "xenoarch" }, { - "name": "armory", - "delays": [ - [ - 1 - ] - ] + "name": "anomaly" }, { - "name": "barbershop", - "delays": [ - [ - 1 - ] - ] + "name": "arcade" }, { - "name": "ass", - "delays": [ - [ - 1 - ] - ] + "name": "armory" }, { - "name": "atmos", - "delays": [ - [ - 1 - ] - ] + "name": "barbershop" }, { - "name": "atmos_air", - "delays": [ - [ - 1 - ] - ] + "name": "ass" }, { - "name": "atmos_co2", - "delays": [ - [ - 1 - ] - ] + "name": "atmos" }, { - "name": "atmos_n2", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_air" }, { - "name": "atmos_n2o", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_co2" }, { - "name": "atmos_o2", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_n2" }, { - "name": "atmos_plasma", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_n2o" }, { - "name": "atmos_tritium", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_o2" }, { - "name": "atmos_waste", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_plasma" }, { - "name": "atmosplaque", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_tritium" }, { - "name": "zumosplaque", - "delays": [ - [ - 1 - ] - ] + "name": "atmos_waste" }, { - "name": "bar", - "delays": [ - [ - 1 - ] - ] + "name": "atmosplaque" }, { - "name": "biblio", - "delays": [ - [ - 1 - ] - ] + "name": "zumosplaque" }, { - "name": "bio", - "delays": [ - [ - 1 - ] - ] + "name": "bar" }, { - "name": "biohazard", - "delays": [ - [ - 1 - ] - ] + "name": "biblio" }, { - "name": "bridge", - "delays": [ - [ - 1 - ] - ] + "name": "bio" }, { - "name": "canisters", - "delays": [ - [ - 1 - ] - ] + "name": "biohazard" }, { - "name": "cargo", - "delays": [ - [ - 1 - ] - ] + "name": "bridge" }, { - "name": "cargo_dock", - "delays": [ - [ - 1 - ] - ] + "name": "canisters" }, { - "name": "chapel", - "delays": [ - [ - 1 - ] - ] + "name": "cargo" }, { - "name": "chem", - "delays": [ - [ - 1 - ] - ] + "name": "cargo_dock" }, { - "name": "chemistry1", - "delays": [ - [ - 1 - ] - ] + "name": "chapel" }, { - "name": "chemistry2", - "delays": [ - [ - 1 - ] - ] + "name": "chem" }, { - "name": "commander", - "delays": [ - [ - 1 - ] - ] + "name": "commander" }, { - "name": "conference_room", - "delays": [ - [ - 1 - ] - ] + "name": "conference_room" }, { - "name": "corrosives", - "delays": [ - [ - 1 - ] - ] + "name": "corrosives" }, { - "name": "court", - "delays": [ - [ - 1 - ] - ] + "name": "cryogenics" }, { - "name": "cryogenics", - "delays": [ - [ - 1 - ] - ] + "name": "danger" }, { - "name": "danger", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "deathsposal", - "delays": [ - [ - 1 - ] - ] + "name": "deathsposal" }, { "name": "direction_bar", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_exam", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_icu", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_janitor", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_food", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_hop", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_library", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_chemistry", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_eng", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_evac", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_supply", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_bridge", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_med", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_sci", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_sec", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_brig", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_chapel", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_hydro", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_dorms", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_cryo", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_gravity", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_salvage", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_solar", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] + "directions": 4 }, { "name": "direction_wash", - "directions": 4, - "delays": [ - [ - 1 - ], - [ - 1 - ], - [ - 1 - ], - [ - 1 - ] - ] - }, - { - "name": "dock", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "doors", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "drones", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "electrical", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "eng", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "engine", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "eva", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "examroom", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "explosives", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "fire", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "flammable", - "delays": [ - [ - 1 - ] - ] - }, - { - "name": "cloning", - "delays": [ - [ - 1 - ] - ] + "directions": 4 + }, + { + "name": "dock" + }, + { + "name": "doors" + }, + { + "name": "mats" + }, + { + "name": "electrical" + }, + { + "name": "eng" + }, + { + "name": "engine" + }, + { + "name": "eva" + }, + { + "name": "examroom" }, { - "name": "gravi", - "delays": [ - [ - 1 - ] - ] + "name": "explosives" }, { - "name": "hydro1", - "delays": [ - [ - 1 - ] - ] + "name": "fire" }, { - "name": "hydro2", - "delays": [ - [ - 1 - ] - ] + "name": "flammable" }, { - "name": "hydro3", - "delays": [ - [ - 1 - ] - ] + "name": "cloning" }, { - "name": "interrogation", - "delays": [ - [ - 1 - ] - ] + "name": "gravi" }, { - "name": "janitor", - "delays": [ - [ - 1 - ] - ] + "name": "hydro" }, { - "name": "laser", - "delays": [ - [ - 1 - ] - ] + "name": "interrogation" }, { - "name": "laundromat", - "delays": [ - [ - 1 - ] - ] + "name": "janitor" }, { - "name": "law", - "delays": [ - [ - 1 - ] - ] + "name": "laser" }, { - "name": "magnetics", - "delays": [ - [ - 1 - ] - ] + "name": "laundromat" }, { - "name": "mail", - "delays": [ - [ - 1 - ] - ] + "name": "law" }, { - "name": "medbay", - "delays": [ - [ - 1 - ] - ] + "name": "magnetics" }, { - "name": "memetic", - "delays": [ - [ - 1 - ] - ] + "name": "mail" }, { - "name": "miner_dock", - "delays": [ - [ - 1 - ] - ] + "name": "medbay" }, { - "name": "monkey_painting", - "delays": [ - [ - 1 - ] - ] + "name": "memetic" }, { - "name": "morgue", - "delays": [ - [ - 1 - ] - ] + "name": "monkey_painting" }, { - "name": "news", - "delays": [ - [ - 1 - ] - ] + "name": "morgue" }, { - "name": "nosmoking", - "delays": [ - [ - 1 - ] - ] + "name": "news" }, { - "name": "nosmoking2", - "delays": [ - [ - 1 - ] - ] + "name": "kitchen" }, { - "name": "surgery", - "delays": [ - [ - 1 - ] - ] + "name": "drama1" }, { - "name": "optical", - "delays": [ - [ - 1 - ] - ] + "name": "drama2" }, { - "name": "oxidants", - "delays": [ - [ - 1 - ] - ] + "name": "drama3" }, { - "name": "pods", - "delays": [ - [ - 1 - ] - ] + "name": "restroom" }, { - "name": "prison", - "delays": [ - [ - 1 - ] - ] + "name": "nosmoking" }, { - "name": "psychology", - "delays": [ - [ - 1 - ] - ] + "name": "nosmoking2" }, { - "name": "radiation", - "delays": [ - [ - 1 - ] - ] + "name": "surgery" }, { - "name": "reception", - "delays": [ - [ - 1 - ] - ] + "name": "optical" }, { - "name": "rnd", - "delays": [ - [ - 1 - ] - ] + "name": "oxidants" }, { - "name": "robo", - "delays": [ - [ - 1 - ] - ] + "name": "pods" }, { - "name": "salvage", - "delays": [ - [ - 1 - ] - ] + "name": "prison" }, { - "name": "sci", - "delays": [ - [ - 1 - ] - ] + "name": "psychology" }, { - "name": "science1", - "delays": [ - [ - 1 - ] - ] + "name": "radiation" }, { - "name": "science2", - "delays": [ - [ - 1 - ] - ] + "name": "reception" }, { - "name": "secure", - "delays": [ - [ - 1 - ] - ] + "name": "rnd" }, { - "name": "securearea", - "delays": [ - [ - 1 - ] - ] + "name": "robo" }, { - "name": "shield", - "delays": [ - [ - 1 - ] - ] + "name": "salvage" }, { - "name": "shock", - "delays": [ - [ - 1 - ] - ] + "name": "sci" }, { - "name": "something-old1", - "delays": [ - [ - 1 - ] - ] + "name": "secure" }, { - "name": "something-old2", - "delays": [ - [ - 1 - ] - ] + "name": "securearea" }, { - "name": "space", - "delays": [ - [ - 1 - ] - ] + "name": "cans" }, { - "name": "telecoms", - "delays": [ - [ - 1 - ] - ] + "name": "shock" }, { - "name": "toxins2", - "delays": [ - [ - 1 - ] - ] + "name": "something-old1" }, { - "name": "toxins", - "delays": [ - [ - 1 - ] - ] + "name": "something-old2" }, { - "name": "virology", - "delays": [ - [ - 1 - ] - ] + "name": "space" }, { - "name": "xenobio", - "delays": [ - [ - 1 - ] - ] + "name": "telecoms" }, { - "name": "xenobio2", - "delays": [ - [ - 1 - ] - ] + "name": "toxins" }, { - "name": "xenolab", - "delays": [ - [ - 1 - ] - ] + "name": "virology" }, { - "name": "zomlab", - "delays": [ - [ - 1 - ] - ] + "name": "xenobio" }, { - "name": "small_secure_red", - "delays": [ - [ - 1 - ] - ] + "name": "zomlab" }, { - "name": "small_secure", - "delays": [ - [ - 1 - ] - ] + "name": "small_secure_red" }, { - "name": "medium_secure_red", - "delays": [ - [ - 1 - ] - ] + "name": "small_secure" }, { - "name": "medium_blank", - "delays": [ - [ - 1 - ] - ] + "name": "medium_secure_red" }, { - "name": "medium_magnetics", - "delays": [ - [ - 1 - ] - ] + "name": "medium_blank" }, { - "name": "medium_danger", - "delays": [ - [ - 1 - ] - ] + "name": "medium_magnetics" }, { - "name": "medium_explosives", - "delays": [ - [ - 1 - ] - ] + "name": "medium_danger" }, { - "name": "medium_cryogenics", - "delays": [ - [ - 1 - ] - ] + "name": "medium_explosives" }, { - "name": "medium_electrical", - "delays": [ - [ - 1 - ] - ] + "name": "medium_cryogenics" }, { - "name": "medium_biohazard", - "delays": [ - [ - 1 - ] - ] + "name": "medium_electrical" }, { - "name": "medium_radiation", - "delays": [ - [ - 1 - ] - ] + "name": "medium_biohazard" }, { - "name": "medium_flammable", - "delays": [ - [ - 1 - ] - ] + "name": "medium_radiation" }, { - "name": "medium_laser", - "delays": [ - [ - 1 - ] - ] + "name": "medium_flammable" }, { - "name": "medium_secure", - "delays": [ - [ - 1 - ] - ] + "name": "medium_laser" }, { - "name": "goldenplaque", - "delays": [ - [ - 1 - ] - ] + "name": "medium_secure" }, { - "name": "kiddieplaque", - "delays": [ - [ - 1 - ] - ] + "name": "goldenplaque" }, { - "name": "security", - "delays": [ - [ - 1 - ] - ] + "name": "kiddieplaque" }, { - "name": "nanotrasen_sign1", - "delays": [ - [ - 1 - ] - ] + "name": "security" }, { - "name": "nanotrasen_sign2", - "delays": [ - [ - 1 - ] - ] + "name": "data" }, { - "name": "nanotrasen_sign3", - "delays": [ - [ - 1 - ] - ] + "name": "cryo" }, { - "name": "nanotrasen_sign4", - "delays": [ - [ - 1 - ] - ] + "name": "nanotrasen_sign1" }, { - "name": "nanotrasen_sign5", - "delays": [ - [ - 1 - ] - ] + "name": "nanotrasen_sign2" }, { - "name": "atmominsky", - "delays": [ - [ - 1 - ] - ] - }, + "name": "nanotrasen_sign3" + }, { - "name": "one", - "delays": [ - [ - 1 - ] - ] - }, + "name": "nanotrasen_sign4" + }, { - "name": "two", - "delays": [ - [ - 1 - ] - ] - }, + "name": "nanotrasen_sign5" + }, { - "name": "three", - "delays": [ - [ - 1 - ] - ] - }, + "name": "one" + }, { - "name": "four", - "delays": [ - [ - 1 - ] - ] - }, + "name": "two" + }, { - "name": "five", - "delays": [ - [ - 1 - ] - ] - }, + "name": "three" + }, { - "name": "six", - "delays": [ - [ - 1 - ] - ] - }, + "name": "four" + }, { - "name": "seven", - "delays": [ - [ - 1 - ] - ] - }, + "name": "five" + }, { - "name": "eight", - "delays": [ - [ - 1 - ] - ] - }, + "name": "six" + }, + { + "name": "seven" + }, + { + "name": "eight" + }, { - "name": "nine", - "delays": [ - [ - 1 - ] - ] - }, + "name": "nine" + }, { - "name": "zero", - "delays": [ - [ - 1 - ] - ] - }, + "name": "zero" + }, { - "name": "survival", - "delays": [ - [ - 1 - ] - ] - }, + "name": "survival" + }, { - "name": "ntmining", - "delays": [ - [ - 1 - ] - ] + "name": "ntmining" } ] } diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/miner_dock.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/miner_dock.png deleted file mode 100644 index a9444f1ed6c073171a40752b1ecb271846153888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmV;<0WtoGP)V}V><;;-Mn<@Gjzz3EmP=}j)4pzQy;;Gn++X2 z2Kor;B=vF)_T42RL-T{dJ`3rybkZ5P=)dc#%V0d6Zx0FZ^8C~qqxI!@I^W)XzeDRP zC^(VA=62Kyant2Q>k4VH4gy$ChPZziwc2z7n9f*4O76|<5GilqYiCP99BW<4Wdeni z$~glz1k21!NU6L4mXjgUV!aa-`2F$_80Qk0bq9bX%VjOeaO*M77 zlkTt2S8pHA0OsHUAnh2%A5w~tvF%j?JAgS8LeC6mfZpH@y}{r0(1Xegz@B`^loP-q z$MI1B*qPaiyeE<@M^l&3x{@^?XsX0T08=PbcFr9uTu^JAX33yK%}tgusQp0`9&A~08l@Px$(Md!>R9J=WSG#S)Fc5tSGJ!vZffQ~M z76!6_21vtF1E}x@YO;hjNTC5-Y6WKi11^{}DFV2N!WEptK7~AyG$qSGfaC!NKX<%) zyd%#P@YiwWnw-n!{!$L#t7pq+i@;ni_mkNzMx)W-&b8L4cYhxi35x(ZUx+)Wfm9}~ zxmC3e>T&s2y;&r#`C{MBQ<-2@ts8^X=cGuFbhw<`ZxI**0|^#SE>sMA3C3bp%HZkT=$t1DszEK zO#lE=)K(t=vVTH#Cy>hIXdr0}5u^}J-!x8oCJ7?wA`v8D8sjjH1In7`&O->E0W#t; zCPm%+&Ve@qKeZnK)UgeNcFyzPivV!QTUYqf<-0{*0*3{s|4d@gyAWOK?wfEPLJB># zsZ3DjqNxRCF03)h`8vMdl~Qj6Ol2u*WQ9VRqdAP`n0Mqpgyi097&1r%`SlDPTA!@< zizq8pry9_!6cZ{nL77uQY8&Em-xvTMpI)rBtyl5=;sLYiIEGg*>^{Hny4^Id;#LH- z)|gGly^7E&WQBs(+M4@aA0{S=!Mz{BKh6H}4Q`PM!~8Hs82|tP07*qoM6N<$f^cZ% Ay#N3J delta 315 zcmV-B0mS~71l0nNBYy!LNkl%l|Kt z-@$PH%0;p)H`LK*hX<4HKsGSLIhx_*%PR~F43M@0 zj1Oba*t?V@2a}u&V3wJS>!9!rb@Ul#>|M%WsH0Dkc_cdkW--h%nB_2WQk!oiMZrPa zg$xY87#JdL-82w_won>foLUYr)X^t97Z~d3GcY{FuV%oT<)dH}003M@Xv62T2p#|c N002ovPDHLkV1jAjf$IPO diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/news.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/news.png index 575d943c769404a914cfa4e57e3bfdf5668647fe..40b73c7c2d272b8ba2a332c70cc83a9a1ebd7ec6 100644 GIT binary patch delta 448 zcmV;x0YCni7?>E4Be63>3V#8dNklMv7FCj%16(h)|>~RknOV zx@PAO@&)+=_O9g%vY{@OD#VD?EsQCORH+|8hxVu;J~+Tqhx9EzbKv)UJ{uo!>9}fg zE>@eu6w%B6QOkAHL~hUKxV@VWCO;hy08r>eXax}YbT%JM4gjO^gn!I45!c*DCT1=f zk6i-7&i4kBZ-bciwF*!Na2*Q(kfeFVR^d8U=}*$Ubpq@X)WH#wPbW?SQ3PDa!g^@~ zK-m)1e%)tGK$7O#nM=?nN+bZ#uRryH?_>?5tRxMiOe9(?Kpjjsa2RDJG1*21sM$>- zRGY}V=0WEOaFL*`+J7}yI&DLByQwW_OVBF^)IJvxX(U<&gi&VXIPNWA$QdAkI0r6Q zz|Qw7Ip8{00Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600AROL_t(og=75x|3AY(0>)7X z40;Fjf6ZD!kqe8`A{fbbK;Ntt|95jdWw>zp3R#vL=;|=I{*cD&2!amizP*!SWoRK; z4hUb}&rquBJ`5cYzPcZ)qtL}^8UolX!{$(`J7C9`yKwgW?VA`9J^kP`0|Ntt2ahuC z91y;`A8rvo0CNOY9T2{{A1-d7tAp18l^U+Je|LbPj1oNPVLooZv76z-;l(pa1{> diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/prison.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/prison.png index a6fe5ca1f399fc26dd62ecf9ea2c53721ed143e2..cea5bba81a9159ce005092b40175b474d274dcc3 100644 GIT binary patch delta 347 zcmV-h0i^!G0`&rrBYyw^b5ch_0Itp)=>Px$FG)l}R9J=Wmp^WUFcijru5y43nV36e z<^r69HA3b#-4aEN;T*jHbEmBF)PWngL$T!id6r8|OWS-BvY(9oeSG%g0sMEU&|n2N z713Vc5(QLXGhms3ya$XR;-&yc{+xi^;V6h$NE6(X7h02TH-DpvP2KRi+p!!3T;gf; z%2T2O`vUghT_>$a_YcE*w+?l*1O7IAwI9NdZ^0x2O52^a-!1^4Re98Xe{%~U&i=^+ zv?|BcP1H6_=D@E>L$MgGffea$!8`EAbupU11F0}u2ciU&wxhHih1S8?<$j^{S$wwu z_{?qpF#55}cU0GA+YPPC)4m5v+hOWPjHNlr1cV&82csRh9P?XKH&G734AM~iD((jX tu~jXER^{}<*gStsd=UxwK_Gts-~$z+rB9h_#QOjM002ovPDHLkV1oKQq@(}< delta 294 zcmV+>0onfb0>A>0BYy!0Nkl1p=5FCd*Log4KAK(WBL%@w85Zqa$NvTqe zu{)zmrNJ-A19A_UmpGLV1tQ(;Sx$=FG`F0Nnb8b~1Z4bo%t8lt?dfuhz}xHdsK)5S zU3c#16o$VR-3=(xV4y>m zmP3FXz-ezlc*+4Z2T^z}A1xY9Yd zU%vsc*l&@-xND{JCy?Xp%m%Q*eI1H*r?pTi5K#dBWQ+ZlL$PMD-vYSR`(w|ROhZfp z_-U8I@cGjU=zp%>!T=phViaw`p;$YQZ9v=lP)g?xDkcljZ-JkBn`XocFm7*1VSvB3 zxXg&vJb<#+G!-bGH=6a>g5miNKxcEB(fOk+C~J)r#_a(=xWDQ8)<|I{YeKXI{zSIm z^eyOH6jP9rD`6kT2eRJB27fU?2&k!6sQ4-jB$nbBkbjibpB%tKr0C=TsTu`nDnU~T zuH_W~*Ye8s*>S&}8Xr=0A=;?v_d3;oNcb25uD08Z*z5jhy8rwvfU?$X)ExjDb?0`v zz4qJC^J7Y?1Ks1;@x(7VmIY76A1^Lh7H27ZquT9%^W*+|{HeHYTb9LH()li=vevY1 pJ2>`l{veq65VNB{DfDahsz1DeBc7o7_;~;T002ovPDHLkV1oT06Pf@3 delta 557 zcmV+|0@D4!1jYoAB!3BTNLh0L01m_e01m_fl`9S#0005_Nkl*gou>@NKReu4T8+?~4%Zf=5zTLW%()Z*r(Xv`Dyl$W=6m%Ap= zK2WZ?yWI1;_q|*$Yte$Wya1#ps9iBwndw=c9<{xjbC{i253;@mB z*{=?5Zte1~5yBXOo&5vnpjQ{iGj*5OPuBhzZ~XFTY%>C^u5UPvhxg-YU9a29ui0h- zv5jX1u$jZC)BMb?8hIJVaWoo@@@qn&pDP-30nl73nKYufC@DZO8om&v05ab&fFVoH zUbe}U_&_)TWPjLu-8ipHvTM#-!ay*WP(JcX0SuBN1v&~?2ZZ|X(+En17l1a!Od-UC zYlC%&0Q>sL2>^P%0GVTgVaBqK;pZZ)1Rx=(p-KhKO;MVA5&nFC%|K8RMy9}JuE#3{ zNYh{I4SH4tV(v{dca2y1JU}ymBx?dua^vfE?JdV>oIV=+Zif;oyfa2_)e--ry@09^y vjw8AEhbD=Hu$|>Y75r&dc2k{N_*VP}eB5SSzumj100000NkvXXu0mjfm~R7- diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/reception.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/reception.png index b16670d5b5f6bfffcc8dcbd3b1cb2798b2a7557e..3f3e6dfa490179644e10f24b4c621c1101ba025a 100644 GIT binary patch delta 421 zcmV;W0b2f_82uNJBe63>3V#8CNkl$r0^dM;*X9J>k`5^p;jMvg@tA}_p$Bj$1=*IRCrc%i_M0Tcd*7$`BlLj3jtkS_ zcsega5xqV?YPqgV)XCJ`Ej=efI=riD?pO>2P1EC0O)jka(`J9aoJ=P;^q{8 zjVYiYP2$sIcU#ZggB)jO=6>S#swG` zrRW3`Aj#7t*51A+44bBmukh_4?hOU*Z+656HE8i8iwj~Py zfY~H+7C-?x1wVzew|}8A0@Zhacz1J31>?fHSM68py}JO_QMNf?Hi=5f`CW7~Vgqzgcg5 zeeRLHJk{od#v(lKw&-+wt)Ad27#DIjsG)H(3O$(QA8*>}=o;*!*+0Gk5&ytAhM@W` P00000NkvXXu0mjfk4VUn delta 454 zcmV;%0XhEt7oQlABMtxrXF*Lt006O%3;baPu^~kYe*hq3NK#Dz0D2|>0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600ApWL_t(oh3(d{YQj(y#_@l) z4t;|=odN$IFqzH^2_Nt8wA_Hnbe{MZp9Eo)tGQ|DSYKBM5k~>f zZ?C)zA94X~&*kanRvo~JeE`NCs~*6yC2gtEKch^*o5`g^SLy>EmzX>Y? z6iG8CAOplR?6%s>mJ3Gx!EPS}VYFAP1Tg9km@OB;&($OLfobUK7LkY(`vhUM*H}zM wEcpaZNhyF@k5Yli)%`bx&hjd92GkDt27!L5&;k3efdBvi07*qoM6N<$f{HA-`v3p{ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/restroom.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/restroom.png new file mode 100644 index 0000000000000000000000000000000000000000..f5903a7d155910ffd43d1ce8f8fa252070a4990d GIT binary patch literal 515 zcmV+e0{s1nP)Px$y-7qtR9J=WSG`WdFcALu-6~ar6t+|>l`=+Er7kF2pCGK=`v!S}zCm_Y`UGqh z3lfSlMq+Em5>-NC13?(jA?Iu-P7?$OzQs;^x$nDkd}jlH9Xn-zjwjQ+Eu!1&OC{HS z8M!?e;pn8_n0&Kd0YI)2p%g&m{lTa)IRJFJJ(@})c6BcupPm^xcOA>fPUlZ6VDI2i zBAU;J5~1(eMt0m^r2q~h;)L7U)fVtoFcz>_riHPo9YMPdMa*Zz&$;i}@I4zr7!`=w%uagu3$S7u;78%ohEmg%P`axRJ@1YuP9Ef_5UkDx4~x+oPu(eo|kI#wYI zO;Gv`P)a!wrMrzxXfyEo@(e&<>F9SF#r0Rs$sdO{19|=i;A6exB!lZ%g^}QUwoxX? zA4ltzur7X2CDg&R;_09~rHm)j+&#Y#`*>qKJw715xspyswMsFSRk7>_VI)0^+m=^H z4kH1g<2cErvdf>zwu&66@eS~vAVx`5(e!k*l>pvY#OUHAGip347%zbcu@8uAzRiyK zxw~MqUZKPx$dPzh$^&Gl5<)DHNC>tvzy&9bqxc*mB=|SiN&oN8=d%O+ zb)EH1%GLHbhROc<&gf&DkgM&{yY#T|7Eb0>S)qI@jS!tbl7IQ_&6Sfm>Hgu#2yt$D z$u@E!1(H0p{x2hdt$DE9Ad3s@cbx%rbG28~0+2ZXmN@`iaLwE6Eu@$}1G<9U211Hy z04Vw_E)e-?1LDU4l02+UDdn8%X9JMA9yzxF0cH`J8qQ<@dh|eZJKBm>ghC2d#dnF7 z0g5)jY1Fp;z<(+OeFsh(Zgc>bb?(#PB~W_><@2|j6M&v}{nShH@MPTeoHGFMz4ekj zgz{D05ov6CZZrUjjtsK6XtZUn1{Y!Er**`@XSLJVr8Bbc17zM_YyG4gBIB)ieZ9tV zKI8H=^z!jMP1wLS_2 RHyr=~002ovPDHLkV1h%G%<=#L delta 364 zcmV-y0h9i~1BL^TBYy!+Nkl%m0h4 z|ITpv!X>gS*EP^%coWEp*AXm)47q&a5`*u?M6w*P*?&HRWS}`-HB4lgj0ODJ@RDJ( z|9q155exxh0L)^~L@$!{QXB%vzGev!r>_H$E!Q>BBg+i39e?nk{w#{+moHpG5u>>S z6dH{gbPe;PD)xY>U`hJ~;wAq9|~29V?Z@`X!ervb7Yu-Sh;JSvbardv@=ZskO_1IY0iRUJS{ zbxaippc@J+^<_L0y%?UHe*#Yjo{3&0mkVSiLRiteef~DMm}jCF3ZJG9@J#fAhXAr; z$Y~FdT@d*OpwbEqq!&U&IY8GykL+BaYoN#QhJcy@ZPx$n@L1LR9J=WSG`WdKnymBp{P>RE(jr& zy$=v&$==6k=5BeCZke0MV9yfe0kTsGAr{C<2)43dbh-NHF6n>--x9^XoIm?MTNi-8 zjtj||F4o6$1*%>j$XG0abg@20*AdL3+34V=Gthl>BngrL27kZ5yXo1BCIbL~ZMc1l-J#kh?Ku zN3o6~KoPQ^ntxqGFo7~}dr!@-A-E0eswTz7+0RY@;kKo3+qqDWpv+sc3pfqfD4I+? z614(YT9<^+Oz>IbeFR)3r1d`VCNNZF8bl2gP1YMO?y&LoOO;baXiqboinib+KWaeI zf=WPBvX9aw1XW;&e>4Fb*a>#V_B-X*z}||Nw@a8$CqW_nM7+I!!r}RFaw}%r&~ygo y)5+kwfQ@au2h$nS_d9<~Y!aiRe}nrq`^OjHz2*-*l-6Vb0000b>!47?Owx_2p%p&yW-qC?+c1A&{dqo+Ke z56BDhfJ_=Q7J-4}6+sO90~s=A@0bn+1KCk+Qa0M5zQvSCkSCI&3=H`17_}KJmaB7@ z0PnN6#u$yt#d3AN|M*0i7eT?5(Kt=-8cE!?IVtl3lXV(IAb(3N9;PpiHa8N7hxrbN z`7T)RLu&?HP$?eq9Hj3|fJ%`i_Npwtz1|79M6$#}84aLYpNI%#iLI>N+u`aYWJFB} z;Bsn`>uV|48K4uo>88EeS$^6ciLYi(B(Pqg#bBouNle8XpEo6*xF4+&m}E>j(q{k zyg-!3*xC&MAWCDlPtjWtr7_C9z;S=95CU)^L^2ob3{XlZuisyH(EKF#LclkAxll&q h)ME4JzvTl4d;wiAot?M?=JWsn002ovPDHLkV1n3Bv3LLg diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/salvage.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/salvage.png index 8c51238f897b6fad6fbeac1dd4f134034ccb4b0d..20b0eb577de574a673c40d2fcce02a7d6b63f42d 100644 GIT binary patch delta 413 zcmV;O0b>5881)yBBe63>3V#84Nkl5dr6opT#&aF^|GFD>9&?O7c07G^L z&%6bU@D|Jr>>bQAuypB=0jXmZA*+3XbZCwEGhAY%1hr>D=3<}EzW5LL>$({W?sqsX zW%Tko?4<addKq;w$}z*6rgF; z?XA>Y^RoaX1kY)k&3}~EF$-MBLXf2Ou*UY!=&y+|hki8vST;w;g&+7D0AeE&d{zG%0)}eH@P{ z-$n0KtQ>(#2y9GqkzB_^d(dO$crGU#YHU|M~{{5E7^wputLr00000NkvXX Hu0mjfi>ADk delta 460 zcmV;-0W<#f7o`}GBMtxrXF*Lt006O%3;baPu^~kYe*hq3NK#Dz0D2|>0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600A*cL_t(og=75x|3AY(0>)7X z40;Fjf6ZD!kqe8`A{fbbK;Ntt|3%&}WVn3!0$G;p>KZV-5sb&{2!alHeyEVaH*Y6d z4%j@&ok7yBpSlisu)mx^!LbvodUQFeJK(|oa=0A2Be2QQ!~rtOh73>cp2z9{bUCUz z0NID=7U7bknFC+|mOFHH4KU<}rvs4V9hr|ye~#*jaPuU0xEy-ffK8674nVd5n?=~< zs2&1;9<5+tk&A%S$N-z%@G1w8EgG<*m{dSD2T%frM+hK0VDlt*2G4**h9`H=Gsq|# zGHl;4pMik^QW{>qd;vo(O%frj2=)v}WME)mV0d!(Jj3P77Z^MP5>c`z%|Za#$1ob^ zG8mdWfD}L#2MlPV6y^xBY=;7hn&tEWqYfBw2LJ#JV8_sFOmsW|0000Px$^hrcPR9J=Wm$6QRP!xuLjf2LdwTm$( zy7K^(#IW}&x@O=G6VeQzOKo z=?^xUd%lM>58?S@y04s2;d+{90b^oSMC6SMZ83shdLA9TxLm0V^)q;GO4o% zRHk%^xqf&Aglo7%xlHaYcJQE9nU2h+yhPK^>eZZXc)P3D~Qf1kVfoy zxiQsa<<`tyvQ5_efIQ}I=lLE~rnKR$x4`sfs;7nVgMR?zy4Jzii0pytqcXnVp_KyLi zdARZDWktC5^b;z6n(8&x>u?yWyl2*8D;1hK#Eevj-Gme z9suP49Dpe!BSewl6eyN`0R}Hf>|K!PfSejg6Fa8rP~Mb$JO4fZ|NVb}8~!`)+BQt4 zvx5u4$NO6&N8{pTIy*ehKOq?JL>`b3yU|0Vh+dl$!8qcac7GC3BpIGZFO7TdJ9*X! ziX?M!(Otl1yhfZ;#5r{m(V7AsMUo*P;YC`Mh`O~l7)PK;GQ>HBpGE+V5zyBFz)vIV zh!_jd9S0?5lE_9_C-#i)pMofS?3T#2m&xDFg=0WRbCDgtz8YTy9J#v@A!ukS&Y5`u9I z=n$)HX)M}UKtMtOs7PcftFEYbLS-|BaU&9pLoj|qs5$J4P?oZ?nZl|ODX6=y-}yS* qRRpLh*98Fyv1{4$=fCAQ-0%gzXUoBQj%_gj0000Zq}6n(9_R;pCdj%16(h)|?%Y&`*UcW#gqaD(ifbAoQ!DpiOPsaqH$lryADANl#Q zjR{B@+P@HE$M5;Q?{5tJ^|-Nhyu7|0rULo=c(>x**}%j30*}wL(ct^t761-55@!Sm zKASI`6UR}2EDf>VG^py)va~>#RMb}02Fy*mAuH4j*xuUN5E;pded|hb8-Suc0Oev z!PlF{3EoSfs@pRXBt{U~*5G}s2YM_Z2@OVTbRX^U1@|IA5)w=*uw0cVq=tqU0h!$d ztLnA`WI>WDO{RdY;>q{y(_7Jpgfj^_ne-btdMy=TP?;2AN9Z<><)PKk+X6~H=Hp`&0a;+KLV$&aNk>KKy?*+JcMfQ8^`5`v zB(xIP@3!)Ddhn_=q2IfKF^rdmsV^qY_m}l{boHy*fBXO-!#dn{TP!620000U`J9^uJqlANQZhZph?s)^BAaCH_*(d1cRw&{qbUVjG?isF2bL3(o z$uFrL+TWr<^!xe!OZ)+U-L7m8o}OP$u|(eAUadMeHt}@3!~NqXSp0a{1Hj1!F$0j| zo9!-G8~|?b9^|bN;@b2Q#q&H%AUHEVTl$_6fFfQNDVlclem59E74L^>T>vQ#fFurB zy1>QseCJuRegsr2ixhd5tOFpuZ`u)6-CaQZIDp{nEGk1zseUqm6jwc`79c<@LfeM3 z8i49OaM_N&Mk>NQOGp)OGExMjw(d^&80BqZoi6iB8 Qod5s;07*qoM6N<$f)X>lga7~l diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/security.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/security.png index 7e27efa2b3220c9bd937bff71fa8694b5ad11231..2de5d34a5ee47c2512be0faa7c0baf09f092c63c 100644 GIT binary patch delta 400 zcmV;B0dM}<1F8d%B!2;OQb$4nuFf3k0004GNklQt%s z0(%Zxgvf2SV-=;$o+B5aPL+DA6nlf&%4isknejk=q~tZ2;paWuV;kVFqguMyf!m7c zS>aLzbl_^>ZUgcQa8^V_1qk`W2IPVdMZ}Hvz>?>U8`<~$WPbzf`+l-5?^6ZDASCCf z7wVy%?8c4MLp#|bE(dA~9)bH{T?kXChn7>do2`8U?-){$i+X5RJ#P{qp-&0QiBge( zx8rd}Bw~C!yf1~-dm!fVx9tHTU$YNP5rA|h#Jqd4n5{gm~6H!8L7SOnH z>U6#cA(u|M)PIt*(1AOEdj;p*I6GQxIUc~p#(OdX(%&V#e*Xs+*K=C8xe7}0WwT%{ zipFvH4WOOp;MO7_EVa~m4$RXq{NPwya^`6mHldQ{N|8K6%pdZ@IGMZb%lBNXYbyWZuVA4#Fn1Se74dED|dDl3|2EeGS zS&-&{@#X^841Z_{sff87pa~*s?gEe*PeRa~nUau202t9a=VPhqemM))eIWq7tT<}+ zwe>f}iVFZEm5GIhI@wtLxv#T2!+ zkal;qhP p6A95&%X{VCnr*tNq_)00{soO!Dbl$zmudh2002ovPDHLkV1l4Z*4qF8 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/shield.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/shield.png deleted file mode 100644 index bb88d2a770e7e6da59be40ee3d317eea2cd814d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)L*939?4&&cGh2Yn~udBHqB+yfKA|F)I_|3DTu@ zZB)VeLKRizU%+7b|L!=S0Y?3IP5LJ6_J`X&2Jf4%|*j zI$uCQnR@{4xX6ANpe~g$wxRSpU;V8j)cPq>PW0XYadPP_GEUE6e*!yVZuBewI}3HG zj5)VsdhY@Q(P}u{cFh8~$FQx3Z$nZBeEa+00Niv_z{xd`w+@`udWq99g9rmm=L>VM zcL)`l46s@+QJ2aXIEF>$fYqf!LtK|!gr{Q$Sybi-wxiWq0N_AUM9zRtX#*gB{l4mF w4S+aFoaci8*gqh?5@CRI&zy(Px$$w@>(R9J=WSG{V3P!v8bT?2t)I+`uu zC=$q0-0}o=%`SZbU!cB$d)K%Zx`i%mAB9|3Dsp$VhU=TYN0VG+` z*|YfqZ+jvxWs6MVxygFc6d-)h>HSw$jdBip?|Y8+S!o350{lfqi3Fx`U?fy4Kt@1; zBuEMXO#Vj;7y{pOAdLg9_(1}wrxZz6bYoHIGQXn)@OjJ+HAJB+^e#Wtkj4Szhq|+M z(Cz{NvDZ=PGJoQH&tW__tpg(gbTK5N-thu45~BIm0{Fd*_Fpv{H0T7Dby zHa<`7`-dlc0iw!AA!XHc}a$QX|G3H1#jKBQb1WXkYok(R!g#iDNLP* zx^ZO+XwFSQ-vLQhFt)4)gx~6$?XLB2@95X;XncKsK>4!ooe!iDIG>I%n=iCEG(nOT scsA%kdNP{&U{b%o2~S7Ael+{XH`1sDU^f#ERsaA107*qoM6N<$f-foOL;wH) delta 490 zcmV z(7b_rSKSNUq)VYl#y~eSS`i9;06U#X0rh zw>?i80zw#gwg0mG&`3tshk<9@3urvR50D=&N+mE&A}gUr0XhN>A|X-$mH4+7a1O%2 zLz+ZJ@n;F(mU1kX+wxjG^()`41jsn9HwEIUue5HxDUc=+)|;YS+n})u0JYWe)USvO z1FvGaOCA^n@PEUIh+8KGk|$L6I}4DtOypFKWGxp)!F@A%tnYkYlvAbVLU=L4k&j{6;Y{edxlHdrjTG#ec0R`v<(YjkkE&u=k07*qoM6N<$f;{@<;s5{u diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/surgery.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/surgery.png index 254ada76fd4d76c38965d88101b216d133fa576c..f24ba5c1b331d0d183373f349b8d7a87eb245fa7 100644 GIT binary patch delta 405 zcmV;G0c!rN1Fi#*BYyw^b5ch_0Itp)=>Px$Xh}ptR9J=W*D-E`Fcb#hzg12^$bi%# zOY0$0FTfQ%asYO?RAz^MxWf)Ol$(sAoN1i=Dq)FT_g0*rxR11ushbr7N#kjeD4)cQW#l`#b2 zeH`Dd?vX6!gnv2EvU}g-dHY0v9A7FVKqk}Hp1^gi3embG)IG$E0+6Eq_9yEmFEy$H z*eKffZAcxk51w=P{i+Z_%aH`I%dC0p?WS+s7t$rLGx?mMK6d2myqmu9W`2AbdOKi@ zL9&>Svgyc64P%UR?03GHG!g9T$M{~&{__Fi&cFzhmkx(J00000NkvXXu0mjfofEqF delta 403 zcmV;E0c`%R1FQp(BYy#NNkl8b{6#iO@TZc{^`v(Hz)G0U|l=}iHzYeXw9+)8m z9&xSSHzpud&~VmMgf5IqkUIsEGLxzI%Me%r!Rblcmr(|~5>(k{C*ap1qBcguS+DjU zaiuK%I{ZBXLVy2a6zJM?6`@@MkGSyb@J9xQwyDr=!jHQ*fR5W{C7@f^*$LQO$77h> z1404aQC!2~xjRmURuewn6DhgZ)iaVZlWR$t!6RPx$X-PyuR9J=WmoZMmFcgM=5GSAmQW)R> zc&SV|OQswmYe&`|!c)!yL|x1QU}&TaP~ z2G=DHxs0A0x0e@SUE*+e3)~dx=6wfz?%WVg05X4iNH-_FynnkPE`13(cFtMP3-DXI zicJtzJ2^)yIS+uSTGry+c~Jo7qM<5iC83pML$CmB^U%UH&V`r+C`9cvcU8eQ)=Huf zH9EaH9e|R3Af{Z#A#)bM6bLESI2s@XLUD{S>EuR4MpT7Z<75ESoYS0U0iYv@>3mrM zQq8jfr0To@3V%^URPE0tqqqnn*Hk=M$F60s}I)$!~g&Q07*qoM6N<$g7eq8 A%K!iX delta 441 zcmV;q0Y?6>1JVPKBYy#zNklZrE5S&C&UXaqYB^O9*`3;uL2S5}QRCz!O z7YKjAk@AL!l_(-nQ|1L}oFd*6U*VnE@df6*7derI`Q))x#6#C5%sJB7?|&u04Y!z2X00*zy>7lD zIy2D3>-#4*yZzaBfn#Gadm2uFkpET^H{1d+6QM1jN`5X2fny_$ePa>Y0-EH_EC{iP zSj_YqSGx&`EC4`Ol#1L9w?|?ijeTTAS&P+yb_S;7QEiP9RzjkLvGnL9=Bfgurm`+Q zLX>dLCz>%jFn{uaDB;>ObAFQUW=t21K11dl@JQ92$O3Z?_h{8=?5mhT1W1PyS(uJT z*zERdpA{wCaBFPa#!e_AWI!?JYTsvO7z^l2bddn5`4G?&aLG8nih$~6()rCslrz(Q z(Ds4Au>t%vUEtV?NJ!<3$Qs6q1w@vbgjrE4(rP9EXfk_&krk^6SG`>J%~cbf0*I{M jUx7|3{`|N6h8w;C$9BhYDO7v+00000NkvXXu0mjf@*2&$ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/toxins.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/toxins.png index 6c28bfde0033b911a4a60d8c897cef911abd6c47..cf11ed6155f27279e02623f7c3f3879089a18a8e 100644 GIT binary patch delta 516 zcmV+f0{i`_1DynrBYyw^b5ch_0Itp)=>Px$*GWV{R9J=WS20V&Kp1_BL#5C*i-=H% z4nluG$dbK3pp#QGXS-k0Epsw;>JM;kD1`igK!*+%L|keDqFWvGi1!$#Ar(O6*H;&f z$qDxlPf`)5ssUvyw`>bu>=fF(*nwqR$}y_>lmg1gXY(;!(=W8UrjOZtTq>d!0Wxw? z#J36npj>6$)dRrUF#=}uF~ES)bf33vmqzW?*A~DBPqc#X^I}J7lL##f_|yk1!75xA zNa?u>*9cgWw}0taQYnB^AFu?j=_3jw0LWKJc zA4BD3l%*L4-A<$JCAg-KEX|~Szw^a}7txsg6RKCUf4l>P;QUXv+9CJ=0000wB+v&H(a6d^1v0Lw&*9gFk>c|_k|hwfd3bH0!*nG(ca>;OQ0~m7Cg)G9UW6YobmX8|s0TS=0(+1jEN&o-=00>D%PDHLkV1k_dv}6DP diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/toxins2.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/toxins2.png deleted file mode 100644 index c2c35212d0b5bce15bd13d83f7fac3f65358fb13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmV;i0Z#sjP)9C7{yTsj_60h4%-%7b zK4T(^|A5+|yah0p-w*rQAHbylt}9!I-TrVMV({|()a%jva<@O6Z{NQlxd<|k(*&pO zO)tdEHi+Z`>th}SP-G1E+sEEMR)DTS`{WDj4Dk8-0m%j8G(oh8006310ML3aGKM%! zFn@b+8u!{2fN~HmBB)wvb23)7(jY#WaR%s`TFFJHna?tKWng{GTNxlDY6}UhcL=)- zLU#$^u>?QKoDtg&84ZApDDm_hG7~`nmsuDh?+gIVmjlfiP-N`)W`IQILlnFOk_&wp z4XGDFOF$6%eiOb8odCuPTrj|pay$ya6)T;gokO_HSNck( zBvmU7V^+yg0ZcOhs94!*H_Nq;oR?s>xzlN%qxspOd$Y}FS6Bhev))&6n&4#V^XI?i blO}xwSDT$DhFH7M00000NkvXXu0mjfS!KEb diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/vault.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/vault.png new file mode 100644 index 0000000000000000000000000000000000000000..33572ca25b572fe3f99f904a89906766308ad606 GIT binary patch literal 458 zcmV;*0X6=KP)Px$gh@m}R9J=WmqAX0Koo|5jcE*xgmj}TU9j)~-S!6M2!vfZ14rl?%8v91cmuW` zzy%9k*$p8j65^(Adf9N@Yi+LHfSu@r?HI6#|NpG62Mrl zPsZXJmsggyc~#^nvx5{u3P9%O&23{W@Lgl% zh*xHZ#=P^+NCV9|^Vk4WnFB3LP#3Ma_*iA?W6lQP2Ic^YV%NY_8U#R@4#`*>AdMV^ ziG{#-5hj*4L~j791uD$GMW+ow8Hb7W?Z0Z?=m54CW3$S!-R+gVftG0!0D`DrW#-%6 zo)wGT2e^;4ZqBKX(HjvrbJFim^$o1?6`?Zv1HdEx%d50g5Cw)>}4pJxC10LxCfy$yt^^8f$<07*qoM6N<$f|7RA A(f|Me literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/virology.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/virology.png index b83297d037c3c92d58d919e5fd167280daea92c2..232d9a74b553fcb8edbb9d42a46a2940b721df4e 100644 GIT binary patch delta 494 zcmVPx$!AV3xR9J=WSG#S)Fc7^2nLw5c0V&)h zDhy-+t-w+PsPG1!LmQ;<04lkH7YN{jNs}Ugi#S}tDU>tG(@{FfDgq=A5cHwQ_wFkS z;IHGRZ*ZkH=eda9^)t&A6|hp9bDG^lk|bA?TWjHT{9r|}0)LQvoj+VnjyRY%R>W;= zg2eJt6|mdpP^x0^-Pn3j0TdjO%1^+$V66}C;)*ZXknxGfe`AAA&5iZlTh+f6;P_8;~5DCJy5FR5>q7ftsXOP zk^n!`Rqm|AihpQxBP3|O;N~?tzW!hc(B0akz465`0JM4H&+EgW2Qd3-Ru6?CHgB{5 z3R(q@Y(J?AMhkF#z&*p<2>Zay0x+v-_oIZqha}Y^?gLzV#hRzJ&$aCs#2(<c3@)c4_LB1WwJ6LA$|dYl(88R z{SFW#jFF1?g)R(HCZ;Hoe}IvRy$c=StSF5VpNZ6=yd}mt-MxFhJOe!N-|^HIu-NP_ z_Z0YeA2-%$e7V@{E}w5-$W7r@TnUNkanwlSr7cNr3Zy#mB7YEO5vH%B#+YZX%(vv# zb$QPfYywn72?+q0otH>;VxL^J9zhjUEH?#0+&V{Oi-%dnBI2w-S>D_fRskg>l#mFs z$V&xh0@Qh!MNmQ_HwEIs1i2{?^o8A{n9d0Rz^XU5Yb7Ms`>j=?9K%t8Jp+WGFA(&_ zuYH;iR}#(yNPqe^ta@`myJlq&upR08@0|vd`xST{0S#PrkJ~-qX+*2u97;%}Izg%v zTYPq2a?|k%ki4V-5dyB~&$VOkyMTyP&zoyRPBY+h$#hEKp6j?10+cKsOsxCS4A8o4 z&+GlRdm{pX!^zlnJec5cGPT7ya3)aKebo!Px$dr3q=R9J=Wm%mQKFc8K+5JOR=rd<$1DtjIv^5VUZk<8ipB-t{jkHMZL$^&$# z5<)CsO9-~IaFLbTjsFcG_!jGA$M?I-ot*%GT^Hvj`D$~F<*0pq(E2h0@YUv+Tqjs0 zi(uzcNQe)ih0p?!^ZUD-$;}yO=-O^_-Q&}X7UI(MfKB9#GvrkY#@Xar(|$$(8|77s zGHZ}msrMe<0OP1_vJe%3q6ZL^1upv^s-KfYY6Jwho$M!i{)qw8aS8erH)Q!Oa z08ZXNwOy#J0b<>L-T*G5Y}s^;@vC@!yT)=piw5=f{)xl$;pD5>*acEZEax+)-Z!bt r8b~3vb3gOPM1=_U{w>q5*}uL31);w6U&E9Z00000NkvXXu0mjf{$tIP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/xenobio.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/xenobio.png index 0d9336c01a19f7967bb4e2b70feb77d2b778b4ee..4f99ab19c3da09dae0f756c6b902996445ea472b 100644 GIT binary patch delta 465 zcmV;?0WSXG1nL8jBYyw^b5ch_0Itp)=>Px$q)9|UR9J=Wmp@CxKp4g!#i3GYn?*#Z zLk6KAAOuP}_XA{dO6P3(B-uKrQzt)wb4#K00~9(qSP*fE7m&KuK`&gcm-1dNsGtvo zgnKXd{O)}(e-8NTIyn~ftl_>cqj`F-^eP4Ltl_?W-bSn4GJiJDSO&IZN(dzYH^08R zFgE9Ue0otroR!@m&ippM!NBWlo6hD7OruRc9^0{lKBWMn23{YNXsrzp#C=S$Iojux zGSF zC4%Uv5&$>XHGiuOKn5{^sayj2S}qAyr1yZR&-Z~&sxCjImC#BK_Je?5%H?cZ@fl?XV zD?ea=K+qT1{X!}mcB>Ry#o1;dHtH-$XO)Qv1QJMjx4PQ#Xht)N6Sl~n#*8$+=iJw5 zF7Vm0V|vl)4d}f{e*gSt56Bq0XeT~o6Y7K;>gEnvP2ko7)_RlBOghc7i$}gDUgjZ;>h3l zL|28K#o1cZD4^YH79wO(u7^#M=0#+xU`#<6cqI?3E~V@-r;PX7TC;RZ?eqrJK0U+U z{z2s*>q6l9=>f^FsdhflM&R*&jlKN??Uk%9Mw2Da23lx`h4&szvb$U3bo9?hv;X)5 XTzo~p=G`P)jOX>HZ z5DkELdeo4*AcI}xP!>ZQt`|3SpxiYA`z71mg5StQLlU! zIgoKL@CiJGH<-!%0L+OzUGNdkNJA9?iOP16QVO6ooxkY;G*HTO_jpqg53m zxTv&|zF6&qW#XW8!LVPC%us&v@j){tmr+~pLKz}^W_K|5jJtb&n$3;Rk9RDdAEoyL zsRj1iHLfbP%%>X}EXSq0ffUkHL(vzL&D*Q;cJ%94vwwU6G}j0Z3SOnJ00000NkvXX Hu0mjff|UYh diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/xenolab.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/xenolab.png deleted file mode 100644 index 21eb486835b9418e35103b15dcfbe06efc4a22b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY+P)9C6vn?+S-N+rlpz-YQDx{EKtd#AM^8OK4}f}r93T^8#tI=Nr>KJP1v)Th@0bpe zE$0u$@5OD0@+~&c#@`S7*#;Q&-*wa1VX<88uQ7OidA5338yCyf{{H<7vTj)BK@?&) zzq3M&`Ua78gR~SZfGR8SFn_Z4=>@P2Zi)+e>%+V&_9Fl`BMt;>27HPHP-O*zC`1s2 zXKgA@odt3dPTr=6N)Ej}gDBK-nbEc^dkHkiNu4SZKw1iX<{zEyRaTI= zi$#J>vDP~w775yI3t2a3G1tS%ISEbk@#7c(w0SHN4WVMLat7EGYi-nSTL91?=B!ZV zyaXx_(%GS$V0!dy##HGAfOEx~@9ui~{P}PBph4gKfS9#W%prRK0000EX>4Tx04R~OkOy}Ge_^C9a{vGV^GQTO zR9J=Wm%nO*P!z_$mJTTa6PHp7>EMaN?85#^PeHtoFXDv&RmP4P zrm@9p2*(W5wla`L09IhYF+*tc2!IN09$~6au=X|p)D+4J3~7kly5?M4SIs;DK$}OI zY_tNvC)4H;wyt{00#2*Xw&hFG2!K|;_BL3ohM4LT0NK?Oe++Qk4;-p70BP$UYkb}V zNS_?aF~bx}CJWM=kf)x~d^A755foc{n~Tg`4X_;97aNdjOkjYTi2>*GO!bBU9D>Bn z`KA+Psp@rq=lk<<)bDD5<;c#Ym1<0@hEuH!K zziUyfHh|3K!uNbQW(eQ&Gx1h4z^`JWmF3N8TvY}NZ^eVh0s7sJ44;%fzrL}1-^t&K zlQ==Y+mXInm1#M$k;I9x?RS2daEQk4Cl!5~{p$x)6WuE0;-PVY00000NkvXXu0mjf D?Hmoa literal 6115 zcmeHKdpwi<`=3ZPDix(tW)jN zaR{BHM}9MEcX4A z#Nbp?v+SYW)<b4OFPZKlZrny5KNk?SXT0aGt3w8>(Nw>_ zXSVo2@Tn2m#_Pvq!UFi45XtZKD<#=sjS25IDK7ZX;@aaXvAyX$U)@D)@ksAO#+7~} z--LGEso~-1b6ZVD>rKxM9A91Aqjp2LYv}LnHiF1B=0SsC9N&{)v2!tU)2a@t-`Ue^ zt{n%ZQIH*ML&f80LL;q2_qfwlJ@?!Om{uddVz9$oEzm4R(^c-7V#H?dIQyEb}j z@$r*^%Q8tTS*rZ;ootIs9XCr)tHsvjn@jX%EwSj0JD4VCN43h{Z`2-`jb{`NG%z|t z&6maREbtB76@-A@GToUmO+&t0o$d@PX%arPP?;OO=ox0uEP)&$#o2hea0^vSLvh_M z%^aC|gDvnd+_HF;#CY=+i%mR|wRSitXRYyBKdf4KN!8fb&EVRKyi~hCsJT^ZTr?b0 z9o^THvYc}=@mg0-kRIhZCA24IDNOre4)0r^6qP zqE3l=Svuk`Q7^bL*V;~ve50kvnZ`MN5V*F>Jt#LOTR%kS1iFVvd!rLlx%+gA*mizV z*?z71BTKN?VX8F)34gDUL*SRQ?Elf&tr2u!RgRL16~;~R%;$L#g?rK;5JubaHRbL{@7R)yO# z9!?<<$z`vbV8K|c6IB=bFWTB_kJYrBu^9W(P4$X;t~wZ6)?Jr$U3)*CBP4WCn&k?R z!s~82;-q>e#L)UYfg|kB!`1ck_kg2Bmmw1*@KV`@r{0X$aTBy^{vGXP7$YxmuFW z>z7itJ)`*~9(Qo=%UG_rp8DwOnL~kTO@GDx^|*fBoj%6wiE7&8uFV#Gv_pR=*~G=f za9-3}7sJiz>r~EqR^)AVebCb@aQb+8JjAKUEtB@0UrR&(wdkfbLh`Z=o z-jLQhvW35Fb?or5l>1SyVZle2pQ`4Y&9}kHnch_@tR*YQzZuMnP?!kwdoBAs8#CU% zGO(ws>bC9<&1Kx?T#S{aO38>M&~LMm&S6ResWaJyw3%h|q3whAu6s@HqjJ`E2ixe_ zSEo;9-|I>q8k#kTzJe6NV!Yy0YtI9^Y(JU=h$uFCbwR!8?hw$5p^Xt0|}i8GX9o@r0e|Izab0#&)MuSo)bAYIZdglL5U0-Ri)(l@ zK^$!;!Ew2LaiwEz$e{-L@pCV0G7^qd61y|pGMAQEU$*$9phq-qQC-?>8RfSl(fdqi z3;BG9kNyhByyu?ThpW^>)nFqsYp{-y<@vDf59+|FRJ6!cvOk8tkILGPx)SD8+Ze%ZSG6u7U2=4cl!P9)CSjTWSAWH z4_$O8X>)_K<=L_v&Vuezlj;-Vxmxz|@GT`6?ZCrS&vJ7It3w~3Y;WL;vZhzT4~GMH zV-F9eZ5v&GF~rDV-Fesr`Gxz?Y6jFcg$KYM-978_Nt(GGiHeO+L!REhl4<2`R;E(G zX>XG0dUhcdemBohv|;e*yEO|{;@dtCbd!V{qet{(G=yK)Q6y7?| z7BbLuhP^pky;Wy%yZ`onSlTjEaZ=EqVcm-^&dL+TcWlh{(K#5|;@ApT2p=xmDBKEM zI46Vt*iUH6UA}2T-}Ei4^53L^*HL}e`rH2QZD`*Yb>v@)PS>Yat0gaYO|FF7k&bLX z{?ZEulaa8kt!a+d)?eSN(AzXGE|cPLk*2)O^=62z{(>l_h!)zP20K#8>s59J9Bp%Z(+F5{9jCDXs9=}g0D>E36C*Ur>WPM`4C;^LZg z7I)zKPwnVQIYvPJ`Nk~bK-QXV@AIN>6(}q==lex{NE37c2|S zoX11QhdT;G_Mw@6o+jJ~&(=S>>vgsQYfqw%)wqPtjW9qatg&e+q055aJ8qO`(vh|! z*oB`8hFteJY4^yhk{)kJfM0!`^y&QA-P~;{5ky^OS+alFBtv!X=&ZC{&Q|r_s3Eym z=CWSCtpTO7Mu&=fe0_)KKIxS=EZ>-0KWEb@OxCrQ>5x8rOiLNwG`T#^eZiB)*|lE% zHO3tgA7RX3PbXs2c@2zP@eAV&k*KQU<%9gkQ(IuJY5W}KiLx?i2c*h|b~@fvXEKA! zF$9=gI%pWp;Xykg7|hf>ng=jKK_P+;2C>5_$g#RcB!bPPAia#K7%I;i3}!os`JlVl z#e*RZWssOib2GSUG#LWmfI`n_9vJ2j#Sz=3n>LbYz}Y63L^U_O(C20ovfc?la9=!^J5^8`8V93 zw7=#)qYPUcgGr1zc_aP59 z2Xq$#Qa-T+JPC)z7!!ylL>v)E_^#v$@&!;YN>Q;GL!-~g(!!9TbRcR0X{SN}GZs)b zWNSVM2)TR@E;o#Vlm>;6TFx{$!t`@l9M}R#BSzZuU%K8MjQITYc@l)NXNC}nnZ_jp zjL%L4KorQFaRk|Y9%2Lo;XxoY!@soDS2_E?l#7W0j7i3LI*I{8b;jfAP{m0`SQOoa z#lnF`MgRcC`IBP-mn9Sde9$ro$`r~5YN45I5Np4Xsr$3OC>WG7g@NWb29LrRd*E=hvHHT7l*0ev=L;SGLk|%2 zZzsRR?{B(()AdUX{F3tT?)pvFFEQ{-%D=no|BWvA_u~#24()(M&|&6}zUlzzAS6$B zvbTYKl70)$9oq{@=J6bS1TdJw66qxa%gs}TgmZ+BRNFa^<>Y70Lfcs)vZ3=X-OgNx&2mdyZ+{qlxx}<} zWkOxU_Mxe>*~x;ZO8JitgcsV$odpsHrz)a4+NuOi*f>CaOj*RNlL>tLv2#^IT)n=9 z-vfOM(8?4)$xJWh&&o<^3B7mxd2*(#dFe?$U9MFwI$QtQ@qPPGMq1UuhsV~#hHd=( zy)`YCx1Xtpop3WSA1hYOQp~vRre?q7RQ&mzevy5_i@938?6_c|Px&uSrBfRA_e|m4479{YZmVNLLoR=pv+r6hE>ns0a#i(?wmliglr@ zmUeCaKpR06EQpH~TnGwoY!#tkLj;A0y98Hls3_gJaNP7hZ*FGhy)>m$um{4+eRtl> zn=^Orc{2kzMq#z0lv1j&T2Zr08;U?S`IS9SN_mlU7Uiq`Kp2SELxoi@Nk!W3cZtJejiJ|cK%L^Q`^D<{}kSbB`pz_?- z!8tKOAXTRs5>55_<(xxDjBey@5wRD{<%_*NOc;}?5(eq^M605Ea3Fi@` z`!dyahJ%m1i8R~uGN)V~T?YVMI6txbta2YQeD@6SCq)PT3`K)!D?&z;3C<%%2i=aH zUs;)>xJt=#+z$Y+Kc{xD|8(HLSEY9^7eRa5-H`!rnmLacQWZe28d7zD#vT7wmIs%v z&D7acmvds|xsMEedF~|T-3GplD3xnklD|9}LpTKV_4FVXjbi@sa})~;?uh{!Rl@cq z+svjFPq6%GB$JMNZLPLlL1%jm?QId9`W?bNfKP*qW@5HCE8d)I6?6F_oh=#t@*GJ{ z8xuLU4K3-T12umC{<&9(p8;Znz)&v$T*Zyfhk9am6QlxwnFm|u9tXtsW(C!6AGN2E z&FruNjjBSUugg1f`;yjW9M5)cqyN`g^q%O&=|6pV3ShnKu3nW02XREZ->Rfr5Zdrz zVFBTeFhb!FB3 Date: Wed, 17 Jul 2024 04:36:25 +0000 Subject: [PATCH 088/118] 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 e0f8aef124..2d6851dcc1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Ghagliiarghii - changes: - - message: Security can now find replacements for their trusty Combat Knife in the - SecVend, or craft them with the Sec Lathe. - type: Tweak - id: 6425 - time: '2024-04-23T11:24:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27224 - author: Whisper changes: - message: Fire stack limit reduced from 20 to 10. Fire transfers will be less effective, @@ -3806,3 +3798,10 @@ id: 6924 time: '2024-07-16T23:26:02.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27879 +- author: EmoGarbage404 + changes: + - message: Resprited wall signs. + type: Tweak + id: 6925 + time: '2024-07-17T04:35:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29806 From d8ab4982ade982b44f845e6532c291e39eec1203 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:47:50 +0300 Subject: [PATCH 089/118] Character menu issuer localization (#29840) * Update CharacterUIController.cs * TODO Burn this shit * huh? * huh! --------- Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> --- .../Systems/Character/CharacterUIController.cs | 16 ++++++++++++---- .../CharacterInfo/CharacterInfoSystem.cs | 2 +- Content.Server/Objectives/ObjectivesSystem.cs | 4 ++-- .../Objectives/Components/ObjectiveComponent.cs | 7 +++++-- Resources/Prototypes/Objectives/dragon.yml | 2 +- Resources/Prototypes/Objectives/ninja.yml | 2 +- Resources/Prototypes/Objectives/thief.yml | 2 +- Resources/Prototypes/Objectives/traitor.yml | 2 +- 8 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs b/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs index 88edb6a4f1..1e4d2f2765 100644 --- a/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs +++ b/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs @@ -1,11 +1,13 @@ using System.Linq; using Content.Client.CharacterInfo; using Content.Client.Gameplay; +using Content.Client.Stylesheets; using Content.Client.UserInterface.Controls; using Content.Client.UserInterface.Systems.Character.Controls; using Content.Client.UserInterface.Systems.Character.Windows; using Content.Client.UserInterface.Systems.Objectives.Controls; using Content.Shared.Input; +using Content.Shared.Objectives.Systems; using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Player; @@ -121,11 +123,17 @@ private void CharacterUpdated(CharacterData data) Modulate = Color.Gray }; - objectiveControl.AddChild(new Label + + var objectiveText = new FormattedMessage(); + objectiveText.TryAddMarkup(groupId, out _); + + var objectiveLabel = new RichTextLabel { - Text = groupId, - Modulate = Color.LightSkyBlue - }); + StyleClasses = {StyleNano.StyleClassTooltipActionTitle} + }; + objectiveLabel.SetMessage(objectiveText); + + objectiveControl.AddChild(objectiveLabel); foreach (var condition in conditions) { diff --git a/Content.Server/CharacterInfo/CharacterInfoSystem.cs b/Content.Server/CharacterInfo/CharacterInfoSystem.cs index cb2216b5e3..3099b2f90f 100644 --- a/Content.Server/CharacterInfo/CharacterInfoSystem.cs +++ b/Content.Server/CharacterInfo/CharacterInfoSystem.cs @@ -43,7 +43,7 @@ private void OnRequestCharacterInfoEvent(RequestCharacterInfoEvent msg, EntitySe continue; // group objectives by their issuer - var issuer = Comp(objective).Issuer; + var issuer = Comp(objective).LocIssuer; if (!objectives.ContainsKey(issuer)) objectives[issuer] = new List(); objectives[issuer].Add(info.Value); diff --git a/Content.Server/Objectives/ObjectivesSystem.cs b/Content.Server/Objectives/ObjectivesSystem.cs index c9cdf244e6..382cb1ab44 100644 --- a/Content.Server/Objectives/ObjectivesSystem.cs +++ b/Content.Server/Objectives/ObjectivesSystem.cs @@ -129,12 +129,12 @@ private void AddSummary(StringBuilder result, string agent, List<(EntityUid, str var agentSummary = new StringBuilder(); agentSummary.AppendLine(Loc.GetString("objectives-with-objectives", ("custody", custody), ("title", title), ("agent", agent))); - foreach (var objectiveGroup in objectives.GroupBy(o => Comp(o).Issuer)) + foreach (var objectiveGroup in objectives.GroupBy(o => Comp(o).LocIssuer)) { //TO DO: //check for the right group here. Getting the target issuer is easy: objectiveGroup.Key //It should be compared to the type of the group's issuer. - agentSummary.AppendLine(Loc.GetString($"objective-issuer-{objectiveGroup.Key}")); + agentSummary.AppendLine(objectiveGroup.Key); foreach (var objective in objectiveGroup) { diff --git a/Content.Shared/Objectives/Components/ObjectiveComponent.cs b/Content.Shared/Objectives/Components/ObjectiveComponent.cs index 36d3fa0bde..fb2e6ca0a6 100644 --- a/Content.Shared/Objectives/Components/ObjectiveComponent.cs +++ b/Content.Shared/Objectives/Components/ObjectiveComponent.cs @@ -22,8 +22,11 @@ public sealed partial class ObjectiveComponent : Component ///

/// Organisation that issued this objective, used for grouping and as a header above common objectives. /// - [DataField(required: true)] - public string Issuer = string.Empty; + [DataField("issuer", required: true)] + private LocId Issuer { get; set; } + + [ViewVariables(VVAccess.ReadOnly)] + public string LocIssuer => Loc.GetString(Issuer); /// /// Unique objectives can only have 1 per prototype id. diff --git a/Resources/Prototypes/Objectives/dragon.yml b/Resources/Prototypes/Objectives/dragon.yml index 10ca942cb3..bbdac8faa1 100644 --- a/Resources/Prototypes/Objectives/dragon.yml +++ b/Resources/Prototypes/Objectives/dragon.yml @@ -6,7 +6,7 @@ - type: Objective # difficulty isn't used at all since objective are fixed difficulty: 1.5 - issuer: dragon + issuer: objective-issuer-dragon - type: RoleRequirement roles: components: diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index 77628a68cf..4d0cf6c17c 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -6,7 +6,7 @@ - type: Objective # difficulty isn't used since all objectives are picked difficulty: 1.5 - issuer: spiderclan + issuer: objective-issuer-spiderclan - type: RoleRequirement roles: components: diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index 8b5307e9a0..cc94ab02b3 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -4,7 +4,7 @@ id: BaseThiefObjective components: - type: Objective - issuer: thief + issuer: objective-issuer-thief - type: RoleRequirement roles: components: diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index ad5f56a443..edf191b420 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -4,7 +4,7 @@ id: BaseTraitorObjective components: - type: Objective - issuer: syndicate + issuer: objective-issuer-syndicate - type: RoleRequirement roles: components: From 1fd8369a9c195d6465a195e7f49f3f1a04d24c60 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:19:13 +0200 Subject: [PATCH 090/118] Add examine for caustic and cold damage (#29989) * Examinable cold damage * lightblue * update grammar * caustic --- .../en-US/health-examinable/health-examinable-carbon.ftl | 8 ++++++++ Resources/Prototypes/Entities/Mobs/base.yml | 2 ++ 2 files changed, 10 insertions(+) diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-carbon.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-carbon.ftl index ddd6de2367..ac536a1e25 100644 --- a/Resources/Locale/en-US/health-examinable/health-examinable-carbon.ftl +++ b/Resources/Locale/en-US/health-examinable/health-examinable-carbon.ftl @@ -16,3 +16,11 @@ health-examinable-carbon-Heat-50 = [color=orange]{ CAPITALIZE(SUBJECT($target)) health-examinable-carbon-Heat-75 = [color=orange]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } severe third-degree burns across { POSS-ADJ($target) } body![/color] health-examinable-carbon-Shock-50 = [color=lightgoldenrodyellow]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } electrical shock marks across { POSS-ADJ($target) } body![/color] + +health-examinable-carbon-Cold-25 = [color=lightblue]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } minor frostbite across { POSS-ADJ($target) } body.[/color] +health-examinable-carbon-Cold-50 = [color=lightblue]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } major frostbite across { POSS-ADJ($target) } body.[/color] +health-examinable-carbon-Cold-75 = [color=lightblue]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } severe third-degree frostbite across { POSS-ADJ($target) } body![/color] + +health-examinable-carbon-Caustic-25 = [color=yellowgreen]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } minor chemical burns.[/color] +health-examinable-carbon-Caustic-50 = [color=yellowgreen]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } chemical burns across { POSS-ADJ($target) } body.[/color] +health-examinable-carbon-Caustic-75 = [color=yellowgreen]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } severe chemical burns all over { POSS-ADJ($target) } body![/color] diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index fae4711310..3a555beebf 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -99,6 +99,8 @@ - Piercing - Heat - Shock + - Cold + - Caustic - type: DamageOnHighSpeedImpact damage: types: From 1ac7739564b525307ac9e3fde72a2d145f54f35f Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 17 Jul 2024 06:20:20 +0000 Subject: [PATCH 091/118] 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 2d6851dcc1..db39ddaacd 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Whisper - changes: - - message: Fire stack limit reduced from 20 to 10. Fire transfers will be less effective, - and fires will not last as long. - type: Tweak - id: 6426 - time: '2024-04-23T11:30:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27159 - author: brainfood1183 changes: - message: Directional Exit signs for maints! @@ -3805,3 +3797,10 @@ id: 6925 time: '2024-07-17T04:35:19.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29806 +- author: lzk228 + changes: + - message: Added health examine for caustic and cold damage. + type: Add + id: 6926 + time: '2024-07-17T06:19:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29989 From 6443c53a8cee6a28d2b885d02d7f6e9adeefafda Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:26:10 +0200 Subject: [PATCH 092/118] Little saw debuff (#29995) --- .../Objects/Specific/Medical/surgery.yml | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index c4f7798154..8b1606dc5d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -173,12 +173,12 @@ sprite: Objects/Specific/Medical/Surgery/saw.rsi state: saw - type: Item + size: Normal sprite: Objects/Specific/Medical/Surgery/saw.rsi storedRotation: 90 - type: Tool qualities: - Sawing - speedModifier: 1.0 # No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb. - type: entity @@ -190,6 +190,7 @@ - type: Sprite state: improv - type: Item + size: Small heldPrefix: improv - type: MeleeWeapon damage: @@ -198,8 +199,6 @@ soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Tool - qualities: - - Sawing speedModifier: 0.5 - type: entity @@ -212,7 +211,6 @@ state: electric - type: Item heldPrefix: electric - storedRotation: 90 - type: MeleeWeapon damage: groups: @@ -220,29 +218,19 @@ soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool - qualities: - - Sawing speedModifier: 1.5 - type: entity name: advanced circular saw id: SawAdvanced - parent: Saw + parent: SawElectric description: You think you can cut anything with it. components: - type: Sprite state: advanced - type: Item heldPrefix: advanced - storedRotation: 90 - type: MeleeWeapon attackRate: 1.5 - damage: - groups: - Brute: 15 - soundHit: - path: /Audio/Items/drill_hit.ogg - type: Tool - qualities: - - Sawing speedModifier: 2.0 From 0e02c505487f7443f380b59d9729dc9c05b2c09d Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 17 Jul 2024 06:27:16 +0000 Subject: [PATCH 093/118] 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 db39ddaacd..ec85d771e3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: brainfood1183 - changes: - - message: Directional Exit signs for maints! - type: Add - id: 6427 - time: '2024-04-23T11:31:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26831 - author: pigeonpeas changes: - message: Adds the ability to purchase emitters in cargo. @@ -3804,3 +3797,10 @@ id: 6926 time: '2024-07-17T06:19:13.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29989 +- author: lzk228 + changes: + - message: Surgery saws now are normal-sized (no more pocket circular saw). + type: Tweak + id: 6927 + time: '2024-07-17T06:26:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29995 From b20fd4fbd00912b6c94f001d2f3ae15d01f0a23a Mon Sep 17 00:00:00 2001 From: Flareguy <78941145+Flareguy@users.noreply.github.com> Date: Wed, 17 Jul 2024 02:43:11 -0500 Subject: [PATCH 094/118] Vox displacement updates (#29824) * more vox displacement maps * A * remove vox insuls sprites * sci magboots * Update vox.yml * Update meta.json --------- Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> --- .../Prototypes/Entities/Mobs/Species/vox.yml | 48 ++++++++++++++++++ .../Color/yellow.rsi/equipped-HAND-vox.png | Bin 387 -> 0 bytes .../Hands/Gloves/Color/yellow.rsi/meta.json | 27 +++++++++- .../equipped-OUTERCLOTHING-vox.png | Bin 671 -> 605 bytes .../open-equipped-OUTERCLOTHING-vox.png | Bin 672 -> 607 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 699 -> 631 bytes .../open-equipped-OUTERCLOTHING-vox.png | Bin 699 -> 636 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 661 -> 594 bytes .../open-equipped-OUTERCLOTHING-vox.png | Bin 658 -> 591 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 699 -> 631 bytes .../open-equipped-OUTERCLOTHING-vox.png | Bin 699 -> 636 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 699 -> 631 bytes .../open-equipped-OUTERCLOTHING-vox.png | Bin 699 -> 636 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 699 -> 631 bytes .../open-equipped-OUTERCLOTHING-vox.png | Bin 699 -> 636 bytes .../combatboots.rsi/equipped-FEET-vox.png | Bin 0 -> 459 bytes .../Shoes/Boots/combatboots.rsi/meta.json | 6 ++- .../equipped-FEET-vox.png | Bin 0 -> 1164 bytes .../Boots/magboots-science.rsi/meta.json | 10 +++- .../on-equipped-FEET-vox.png | Bin 0 -> 1201 bytes .../speedboots.rsi/equipped-FEET-vox.png | Bin 0 -> 1486 bytes .../Shoes/Boots/speedboots.rsi/meta.json | 10 +++- .../speedboots.rsi/on-equipped-FEET-vox.png | Bin 0 -> 1491 bytes .../vox_parts.rsi/tail_stenciled.png | Bin 615 -> 297 bytes .../Species/Vox/displacement.rsi/back.png | Bin 0 -> 451 bytes .../Species/Vox/displacement.rsi/eyes.png | Bin 0 -> 508 bytes .../Species/Vox/displacement.rsi/hand.png | Bin 0 -> 483 bytes .../Species/Vox/displacement.rsi/meta.json | 14 ++++- .../Mobs/Species/Vox/parts.rsi/torso.png | Bin 866 -> 955 bytes 29 files changed, 110 insertions(+), 5 deletions(-) delete mode 100644 Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/equipped-HAND-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-science.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-science.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/back.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/hand.png diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 4d5239e50c..02e2791e35 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -26,6 +26,30 @@ layerKey: dummy parameterTexture: displacementMap parameterUV: displacementUV + eyes: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: eyes + copyToShaderParameters: + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV + gloves: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: hand + copyToShaderParameters: + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV + back: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: back + copyToShaderParameters: + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV - type: Speech speechVerb: Vox speechSounds: Vox @@ -124,4 +148,28 @@ layerKey: dummy parameterTexture: displacementMap parameterUV: displacementUV + eyes: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: eyes + copyToShaderParameters: + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV + gloves: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: hand + copyToShaderParameters: + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV + back: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: back + copyToShaderParameters: + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/equipped-HAND-vox.png b/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/equipped-HAND-vox.png deleted file mode 100644 index b7f2122c19f5bb439cf0bb625613b5526410247e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmV-}0et?6P)NklmZ0Zoi)+R&{1ZRto1s9U+%*3oL z|6i3N?}NviG!qd30000006aTv`>M;hp8{W$Zmz?&uL57}>j%Clm5GW%Pb*mzdP-$t z-9#7ldrdFIi7TVQL#Mus1`ml7S1abP>Q@dR@I}oQ#q;UfIHxD&`?E!nM=SVE>VL1F z%{RdI7_3)A?e#B3p{LfXq1_SK>^$x1mrmE7Y<8YeZ0UYE%Ve56Cb5%g?%XeDtNH){ z000000001JJSZaZ0 h2E3{s006+h_XW$Kw~dZe6Egq+002ovPDHLkV1hjUu0sF- diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json index ccb1c5dcaf..88e3ebd509 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json @@ -1 +1,26 @@ -{"version": 1, "license": "CC-BY-SA-3.0", "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", "size": {"x": 32, "y": 32}, "states": [{"name": "icon"}, {"name": "equipped-HAND", "directions": 4}, {"name": "inhand-left", "directions": 4}, {"name": "inhand-right", "directions": 4}, {"name": "equipped-HAND-vox", "directions": 4}]} +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Coats/labcoat.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Coats/labcoat.rsi/equipped-OUTERCLOTHING-vox.png index fa32996aa89b0b94751422eeed4206e6d123a2fa..a6546c4655791eb62a6a1dc791e48b35ce2c0d69 100644 GIT binary patch delta 502 zcmVFRYF_A$-e*x1;L_t(oh3%H%a)clZgf}5vk@tV#ZuG1uglnhM>HUxy zPjHj(B4JEWe>rdiZovBi@PY~Pan_p^pzB>RMo>>?md^Syr<{F-Oq1c?=Y6z6pw*28 z@Hb0OX#7w50m!sq47@lS0J7-QU0Z#hK@2oVpufVp5L~w{h;@bze~{q5!bruZ9l#$x z0Vn+nz^z3}@{mLkT_RRp_6=zCQ%3l9AEJXD++U;1!3DtZA2Le8Q&%U5MgZ!<2tQRss)m8lA+=z=~ZATHOs?4gtxq;9_vn z_b~)`a&g=Sgk!W%e}}d|7&qVs+PyJ8es%%#MsCzfj<`3f42$i0vBv!G>QO)IkaJKY}pKvyhMAjWRdRS^#N;q zi2#MA|0TfNgD{Px&j7G$d^Mgku^)7TR0Y0f}^88_g&gM}@$hPD_oOg^xbklf+0^!$1Gz|HUKLj!&Py;Sl z7Xp8orKQWr?-sEV0umu#NT(8v*R6?t|sx4Q@CD1~>tf|H2gt;O!ybZ}Q-PXH>wahz?SL0*k2o*LDX8ycAra z02BZX1So;m#eSweFyIwe1svv)9|i2B7dwCLk$?pl9SS6+g-!t-#_zZku+25E-DVik z&{hoBvERTW@CX(*#@v4( zXz!)@6AJpj*r?HbgRcOC7zUZ8`Df6A{%59Yi~iyKe@bF(|9 zSoHW32^6&cW_QdLU_6KfY=UTZ#~4exDjq@N3UCGx67RyQvT`o*Ni3OH(Nj_f;fPp1 z#R9Y`jL+!AY>L7{{0?y43|STtvj7Gj02O9tY002ovPDHLk FV1gCs^p5}l diff --git a/Resources/Textures/Clothing/OuterClothing/Coats/labcoat.rsi/open-equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Coats/labcoat.rsi/open-equipped-OUTERCLOTHING-vox.png index ce7c029026c8319d3be367415183c45fdfedfc96..2ecf1e68e01feba062c1a6211aeffa70f38d4e08 100644 GIT binary patch delta 504 zcmVXdaF_A$-e*x7=L_t(oh3%HnlEWYfMFFv<{{IK>#Wbx(u)DLfvwes& zZB*do8cl%eFB@He3-EaWdc!2PHrl%pk+iFjkAOX?Y8vgYKFrxhl;PsuJ|C?YLA_l; zApB>Z30?ePe*rQ)Qm*)+=KwOxBV2m>(IZxZL#l`u(n*5Zbr;cke>4FS5n^o#*}4~~iw^-Xq{r0< z9L)thH+Mb+Py5mOe_7Y}2kin}fD7<9fN${D5#%JbwZkddt7Ygdiry@B>nUUyaBew1 zP(dyAuM-QhW6~`GZ1`TEQ_~qBBwO$-F}aDQ@C5)#Dcc$&0HFjCjsenYgq4C;JV*#Y z-5@C;y?OB!(7s^8yCS0>`@tZop&_R=2k7T6;vH0_OAV z1dz1?c?)2<#|rMUR6tr4OIRtu65tf>LRG1pR|+y$(HZ~}N|1fT_wF%1M~K}|sb0I`n?{9y%=E=GR<32;bRa{vGizyJUazyWI3i3tDz z0r5#hK~z{r?Uw6ugdhxsLlRcY`#*3`5Ru4b+i8EaGoG1Na{COcyMfXV^#C4#>5l;p zW6q>t^6|zZ;(TQqBM=u=6(7IW2uHIhBIR&7QHZD7ChF4S3IgH3%P4BWJpZ- z!)kv3h=EHvxAAjDK?wf)_d0OB-(iq8oqg%_meLZeInfp8^n&a_wdQQ$s*~xcy6T z2>w&WV;bjvLl58qm>$6I1HQmpSI}UnIduu%B(({>7pv2bdT~FgHvk4hp7E0|Z0ZQF z2Mea7=spAN_`SZ5raOR%v4bH2&K=<;07EI-9%lf;5hTyAOKy#!g&V9o$cG0vx!ivm z=LQzRcq@*Z5D=W7aKI=IlUw8b#Wv!{1UNDKEoTNWLjxo6qd1)4+&E}oE&Bei+Y|S?f)KZzPN(;W znNfk0d=tbmq3th?9>4?megOKwBzEidW=16YQ)rHWo>VpU`Z>;$%x7dt@+3Zs9mb9R z2IQrffTf_I zk7Z(G9}WOt`~r0P8-Q0!De(_Z5NSAwUH<}fdUqlw{F7x!|J=p_Xcv12WMDBsoWK$R zpffVyi^r*}fWRU;|BwI>mWnF`fB@3~Knc38ejCoMkGa*UchIUAhgNq7mqS2O zTIu4@>4!}LezeF032;bRa{vGizyJUazyWI3i3tDz z0su)wK~z{r?Uw6ugfIw&fkez!egD_(A;xTC7Pp=DM?2%0aSZ{!#mfk^{ZKdH2AKXB zU^jdwv8ner7Lnw$&}#(zA;uVb|8qS_P_sybO#4=+N%Rmm{tB4pq!9$dZ<`hBCT`^s51Yd zmjHXXW|h+@a}<>w)9cu8=my*X(+&82z!!Me8I=3$g@%CM#OKKRYq18wrTA(UYgcEX zG2|Za5OTg;G?ppNs_2l;Ck@{;G+)&@waxzom}M-oDqoIMo082S#A= z0MIQvW+w$w0f9wye31YU&LzXc1AqWi2S7okW*~YvgNGg}0hhVesdLC!=iZ^!?WCK|(-#8^srF=YSE5z21lnFo;=;e;*UF-2yQmw=ZC!EO5M! z0NBjJI-D&VtAnJQ0rP(M0Fd(xogi)e8G zgdvDI=Hh2ia>NLwZGZ1e5UJPH{WjV;_(RrXgc!&AJ|Fj^`VW9F>7BTRxS83#00000 LNkvXXu0mjf{_60m delta 583 zcmV-N0=WJB1iJ;0F%1M~K}|sb0I`n?{9y%=E>eF032;bRa{vGi!2kdb!2!6DYwZ94 z0su)wK~z{r?Uvh)-5?A_jqMO7DgXbw-6oKOL&&shA6h9}ngQQd%()rLf2bGm0!;rH z;4tP)3ML=#EFvx|(>(%lQC0Er&wgQvW>FMg4wuuyu_<)%6R@l)DhP!CX&ng`Z|dVG zfD(TaBxd}@l=>zQA>LZxKHhc|)OwVRdS3MMN*!?xrM~Pw4{oavq1KKNZ94$WSphD7 z0`Ss;@Rh$%Uo5W@uK*YC6NyU)d@XMJ06IB9C>;#vZz48A@DJz=#I3t<$v8#IAOvQ0 zPpvCNh;MmA#tZ-gq!R#%a_N9|cn?e@_#l6mdg`Gix5+gHKrrvL<`uA|J~ zbPG7&-0?$j2>zz(G2Q3>hF-u6Fuj1k5BLS%a|M<8`k*1fo1`|O_i7E=Q7`T%^#Z_P zC^LT2g-spdhrzO>71L34p8;bqIKop0I0BMfQC&@xm2-$s z9mJ4XFGZ&ammt(z@vMWq6+%DX9n3FoQRe8Kol5B8k_E%x9d32a`L^IY{r7;Je*zIm VxScxd|3v@*002ovPDHLkV1gL!2cQ4| diff --git a/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_cmo.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_cmo.rsi/equipped-OUTERCLOTHING-vox.png index 58b84263ac0a4649420ed65c9f2693fcffd3ccf4..eaef9455081cfe399e15427d15ab80aa699db32c 100644 GIT binary patch delta 499 zcmV$N`odhqFpXCz5Pn01W6BTwDNqrC8gRk7 z5vYGGo-Q;0vWS%sPzd=#x|CqN9z}HP{NvZXkmWKeWiuB6TXccI4*|SdDuo*tkmf~n z-UR|b2NIrcW4U>Q2Tp+rK>+19T&V!w9`fTRPY!rS1$>DZAQdREh=zalJ3!#2;YtOd z0B9mW1-x$dv+RKZuedAVFwgufU?;uVY0rNIEWqegpeSv02^cW`g1i zbjakBhHo00@3l2u1!OI9pg$m5_!|K5i|wE~O>nSf0YZV$|{q`Tq~B(DHx03rD<>?%9gmY>8{c^ADT4G@lqir1P zZUEa~hCpIV|H~#1-~s$RfPBLg^|solkqE{W5+i6YW>!}FSD)tUBdK%=Z(q+gi;&rF zBnbbj-U(CuV*dhEdX(DvV=n+y#XB6c{p^XF(4ln3L+mEO?e-Eee|mBQ6cNVy5~_D^ z0H1sV7W)UlM@z!d55|wt1>kl)AHZZ^b_7E~xCgIg-1guC(4ipMg7XGWP-FnwU7czo zK@21)VDUjB0NQ$^M+P8)%@TkV!%zUb?ZL}l27!mUL?>}LG>+TqFx&lA@c0x!LwR3g zz}Z5;XLIj|;A21Ae>@xd{y}>H58wg(8^CYy_7M^!wY|e7*_&tRl;K&U*d=5cXvKyw z;;~OG%#OT82B1K>rluO5t&^;|)3m8W%iS=J>0zfV delta 562 zcmV-20?qx;1d;`iF%1M~K}|sb0I`n?{9y%=E2_^`L8Tl&Kl|aAkMU>TbN);WMBvKqChTrGoDKhXkJ<^8F2(4g9Pw+#*hiDF{K;++FJx68N{g zAz}sq0kR1|qG_o>t$PNPM7+o)KeqlB5N&_Me)9pR;OAF?`BMNKv0i)8erO0dA8!8= z?1KGJwNT^OALs!*0O|q!J>VO>b%qR@no}3xw_@zjQwF<6bU&##02)K-@e@MH*L7n- zcf>7b02GMU=?Qm$3cJFPKs($^0Gd+b8K(e@AfTjj1d2><{907*qoM6N<$g32KE A<^TWy diff --git a/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_gene.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_gene.rsi/equipped-OUTERCLOTHING-vox.png index fa9a53d3735ecc3d43093d6dcca23556af236b6d..03a4e52f7b9fb145ea77ab8dd02ca45bdb65bf03 100644 GIT binary patch delta 516 zcmV+f0{i{D1@{DyF_A$}e*xi1L_t(oh3%H%vYa3cg_95>E&Bei+Y|S?f)KZzPN(;W znNfk0d=tbmq3th?9>4?megOKwBzEidW=16YQ)rHWo>VpU`Z>;$%x7dt@+3Zs9mb9R z2IQrffTf_I zk7Z(G9}WOt`~r0P8-Q0!De(_Z5NSAwUH<}fdUqlw{F7x!|J=p_Xcv12WMDBsoWK$R zpffVyi^r*}fWRU;|BwI>mWnF`fB@3~Knc38ejCoMkGa*UchIUAhgNq7mqS2O zTIu4@>4!}LezeF032;bRa{vGizW@LZzX3P}QzQTY z0su)wK~z{r?Uw6ugfIw&fkez!egD_(A;xTC7Pp=DM?2%0aSZ{!#mfk^{ZKdH2AKXB zU^jdwv8ner7Lnw$&}#(zA;uVb|8qS_P_sybO#4=+N%Rmm{tB4pq!9$dZ<`hBCT`^s51Yd zmjHXXW|h+@a}<>w)9cu8=my*X(+&82z!!Me8I=3$g@%CM#OKKRYq18wrTA(UYgcEX zG2|Za5OTg;G?ppNs_2l;Ck@{;G+)&@waxzom}M-oDqoIMo082S#A= z0MIQvW+w$w0f9wye31YU&LzXc1AqWi2S7okW*~YvgNGg}0hhVesdLC!=iZ^!?WCK|(-#8^srF=YSE5z21lnFo;=;e;*UF-2yQmw=ZC!EO5M! z0NBjJI-D&VtAnJQ0rP(M0Fd(xogi)e8G zgdvDI=Hh2ia>NLwZGZ1e5UJPH{WjV;_(RrXgc!&AJ|Fj^`VW9F>7BTRxS83#00000 LNkvXXu0mjf{_60m delta 583 zcmV-N0=WJB1iJ;0F%1M~K}|sb0I`n?{9y%=E>eF032;bRa{vGizyJUazyWI3i3tDz z0su)wK~z{r?Uvh)-5?A_jqMO7DgXbw-6oKOL&&shA6h9}ngQQd%()rLf2bGm0!;rH z;4tP)3ML=#EFvx|(>(%lQC0Er&wgQvW>FMg4wuuyu_<)%6R@l)DhP!CX&ng`Z|dVG zfD(TaBxd}@l=>zQA>LZxKHhc|)OwVRdS3MMN*!?xrM~Pw4{oavq1KKNZ94$WSphD7 z0`Ss;@Rh$%Uo5W@uK*YC6NyU)d@XMJ06IB9C>;#vZz48A@DJz=#I3t<$v8#IAOvQ0 zPpvCNh;MmA#tZ-gq!R#%a_N9|cn?e@_#l6mdg`Gix5+gHKrrvL<`uA|J~ zbPG7&-0?$j2>zz(G2Q3>hF-u6Fuj1k5BLS%a|M<8`k*1fo1`|O_i7E=Q7`T%^#Z_P zC^LT2g-spdhrzO>71L34p8;bqIKop0I0BMfQC&@xm2-$s z9mJ4XFGZ&ammt(z@vMWq6+%DX9n3FoQRe8Kol5B8k_E%x9d32a`L^IY{r7;Je*zIm VxScxd|3v@*002ovPDHLkV1i!K2G0Nh diff --git a/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_sci.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_sci.rsi/equipped-OUTERCLOTHING-vox.png index 89369f8794c1aaa1c8dd4195a9a7f341591e5502..f99be74a5a952c6d3b1dad752e7686af7478cc02 100644 GIT binary patch delta 516 zcmV+f0{i{D1@{DyF_A$}e*xi1L_t(oh3%H%vYa3cg_95>E&Bei+Y|S?f)KZzPN(;W znNfk0d=tbmq3th?9>4?megOKwBzEidW=16YQ)rHWo>VpU`Z>;$%x7dt@+3Zs9mb9R z2IQrffTf_I zk7Z(G9}WOt`~r0P8-Q0!De(_Z5NSAwUH<}fdUqlw{F7x!|J=p_Xcv12WMDBsoWK$R zpffVyi^r*}fWRU;|BwI>mWnF`fB@3~Knc38ejCoMkGa*UchIUAhgNq7mqS2O zTIu4@>4!}LezeF032;bRa{vGizyJUazyWI3i3tDz z0su)wK~z{r?Uw6ugfIw&fkez!egD_(A;xTC7Pp=DM?2%0aSZ{!#mfk^{ZKdH2AKXB zU^jdwv8ner7Lnw$&}#(zA;uVb|8qS_P_sybO#4=+N%Rmm{tB4pq!9$dZ<`hBCT`^s51Yd zmjHXXW|h+@a}<>w)9cu8=my*X(+&82z!!Me8I=3$g@%CM#OKKRYq18wrTA(UYgcEX zG2|Za5OTg;G?ppNs_2l;Ck@{;G+)&@waxzom}M-oDqoIMo082S#A= z0MIQvW+w$w0f9wye31YU&LzXc1AqWi2S7okW*~YvgNGg}0hhVesdLC!=iZ^!?WCK|(-#8^srF=YSE5z21lnFo;=;e;*UF-2yQmw=ZC!EO5M! z0NBjJI-D&VtAnJQ0rP(M0Fd(xogi)e8G zgdvDI=Hh2ia>NLwZGZ1e5UJPH{WjV;_(RrXgc!&AJ|Fj^`VW9F>7BTRxS83#00000 LNkvXXu0mjf{_60m delta 583 zcmV-N0=WJB1iJ;0F%1M~K}|sb0I`n?{9y%=E>eF032;bRa{vGizyJUazyWI3i3tDz z0su)wK~z{r?Uvh)-5?A_jqMO7DgXbw-6oKOL&&shA6h9}ngQQd%()rLf2bGm0!;rH z;4tP)3ML=#EFvx|(>(%lQC0Er&wgQvW>FMg4wuuyu_<)%6R@l)DhP!CX&ng`Z|dVG zfD(TaBxd}@l=>zQA>LZxKHhc|)OwVRdS3MMN*!?xrM~Pw4{oavq1KKNZ94$WSphD7 z0`Ss;@Rh$%Uo5W@uK*YC6NyU)d@XMJ06IB9C>;#vZz48A@DJz=#I3t<$v8#IAOvQ0 zPpvCNh;MmA#tZ-gq!R#%a_N9|cn?e@_#l6mdg`Gix5+gHKrrvL<`uA|J~ zbPG7&-0?$j2>zz(G2Q3>hF-u6Fuj1k5BLS%a|M<8`k*1fo1`|O_i7E=Q7`T%^#Z_P zC^LT2g-spdhrzO>71L34p8;bqIKop0I0BMfQC&@xm2-$s z9mJ4XFGZ&ammt(z@vMWq6+%DX9n3FoQRe8Kol5B8k_E%x9d32a`L^IY{r7;Je*zIm VxScxd|3v@*002ovPDHLkV1i!K2G0Nh diff --git a/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_viro.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Coats/labcoat_viro.rsi/equipped-OUTERCLOTHING-vox.png index e432bb2d017b96584e4944928588189c7b21988d..38b48d0a2d482a244bb52aee14ec16382dcf5a62 100644 GIT binary patch delta 516 zcmV+f0{i{D1@{DyF_A$}e*xi1L_t(oh3%H%vYa3cg_95>E&Bei+Y|S?f)KZzPN(;W znNfk0d=tbmq3th?9>4?megOKwBzEidW=16YQ)rHWo>VpU`Z>;$%x7dt@+3Zs9mb9R z2IQrffTf_I zk7Z(G9}WOt`~r0P8-Q0!De(_Z5NSAwUH<}fdUqlw{F7x!|J=p_Xcv12WMDBsoWK$R zpffVyi^r*}fWRU;|BwI>mWnF`fB@3~Knc38ejCoMkGa*UchIUAhgNq7mqS2O zTIu4@>4!}LezeF032;bRa{vGizW@LZzX3P}QzQTY z0su)wK~z{r?Uw6ugfIw&fkez!egD_(A;xTC7Pp=DM?2%0aSZ{!#mfk^{ZKdH2AKXB zU^jdwv8ner7Lnw$&}#(zA;uVb|8qS_P_sybO#4=+N%Rmm{tB4pq!9$dZ<`hBCT`^s51Yd zmjHXXW|h+@a}<>w)9cu8=my*X(+&82z!!Me8I=3$g@%CM#OKKRYq18wrTA(UYgcEX zG2|Za5OTg;G?ppNs_2l;Ck@{;G+)&@waxzom}M-oDqoIMo082S#A= z0MIQvW+w$w0f9wye31YU&LzXc1AqWi2S7okW*~YvgNGg}0hhVesdLC!=iZ^!?WCK|(-#8^srF=YSE5z21lnFo;=;e;*UF-2yQmw=ZC!EO5M! z0NBjJI-D&VtAnJQ0rP(M0Fd(xogi)e8G zgdvDI=Hh2ia>NLwZGZ1e5UJPH{WjV;_(RrXgc!&AJ|Fj^`VW9F>7BTRxS83#00000 LNkvXXu0mjf{_60m delta 583 zcmV-N0=WJB1iJ;0F%1M~K}|sb0I`n?{9y%=E>eF032;bRa{vGizyJUazyWI3i3tDz z0su)wK~z{r?Uvh)-5?A_jqMO7DgXbw-6oKOL&&shA6h9}ngQQd%()rLf2bGm0!;rH z;4tP)3ML=#EFvx|(>(%lQC0Er&wgQvW>FMg4wuuyu_<)%6R@l)DhP!CX&ng`Z|dVG zfD(TaBxd}@l=>zQA>LZxKHhc|)OwVRdS3MMN*!?xrM~Pw4{oavq1KKNZ94$WSphD7 z0`Ss;@Rh$%Uo5W@uK*YC6NyU)d@XMJ06IB9C>;#vZz48A@DJz=#I3t<$v8#IAOvQ0 zPpvCNh;MmA#tZ-gq!R#%a_N9|cn?e@_#l6mdg`Gix5+gHKrrvL<`uA|J~ zbPG7&-0?$j2>zz(G2Q3>hF-u6Fuj1k5BLS%a|M<8`k*1fo1`|O_i7E=Q7`T%^#Z_P zC^LT2g-spdhrzO>71L34p8;bqIKop0I0BMfQC&@xm2-$s z9mJ4XFGZ&ammt(z@vMWq6+%DX9n3FoQRe8Kol5B8k_E%x9d32a`L^IY{r7;Je*zIm VxScxd|3v@*002ovPDHLkV1i!K2G0Nh diff --git a/Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/equipped-FEET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..77af7765e57afe2d0b804f60204b9a63c276f992 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zTRmMILn`LH zy=9np$UuVi!Sq#&F6--viPbQ5Z&JLHT+r4b?D9tN`$L5s-BX+iiH@B%Q;*7OxqEu4 zN_U2=cz-+RX61gF>P?JF$l#Tb;P-727J`LJk80vK|G)TYev2dhp$L59JnH} zW;4(4MIC>y_cd$0L8Uh+?D;hS^*IUmEh z=f-}^h1YET8Y5Wv_@l()iyRCaZoh5XFP*hBW>^3B@|rk3hK9or1JZxUe=?GIP-=F# zY&Y*YekqHYK2h4$Hgff6xFw5M??0!Gf3vBTi$>gTe~DWM4fH95vr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/meta.json index 8eb6b8a626..b0c4419dda 100644 --- a/Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/meta.json +++ b/Resources/Textures/Clothing/Shoes/Boots/combatboots.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Made by @ninruB#7795, based off tgstation's jackboots at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe", + "copyright": "Made by @ninruB#7795, based off tgstation's jackboots at commit https://github.com/tgstation/tgstation/commit/7e4e9d432d88981fb9bb463970c5b98ce85c0abe. Vox state modified from jackboots.rsi by Flareguy", "size": { "x": 32, "y": 32 @@ -14,6 +14,10 @@ "name": "equipped-FEET", "directions": 4 }, + { + "name": "equipped-FEET-vox", + "directions": 4 + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Clothing/Shoes/Boots/magboots-science.rsi/equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/Boots/magboots-science.rsi/equipped-FEET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..dc22be4ac27c8b1e5023a512df3b885eb36a0423 GIT binary patch literal 1164 zcmV;71atd|P)Px(MoC0LRCt{2+D}YeMI6BK@2rhRpz^0hTcHG4+NH+CrlApbNt8lGAYh^`jR#pw zj7>11scmAaJ$R@zrY()cKRtNhZH<2*jR}!O6kEL%OenUErmX2>*9Sx??b`*HU}9xF zEIg@c%wU#_&gZguGn4uK=J#gbWd<}&(=<)fG)>bqP17_@(=<)f{wIX$z$X782_S?d zJu?OS<_$gwyeFRXx5&(_EM}tfEJzmuNx(RvJg;*6=0j3S!5Y^s)@Gy;i$)1_zAc)X zUy_+w>xkNONa+ILjB#8!{u-s={)6)IonF$?(gBFaXZYmfvj9w8k5RF+>b5>14oIW( zRMLv@eDi);Q(xme|2!EXI69VyKNV%i_J?`Ex5eofNU8b~lnU_e&}U3f{XjSzrmd|V zfQ5xW5}op|aj(DDLP4P$(==74Rd!3>ohU34i3^wf?Y8~}?jatZUF-*`zOmH`@Mvj0 zF7Z20);)_gISs(Z4LOUy4>CJ5%k0c7FSZe*OfCM2Z z-dae19~5sb#3kpMi_HTt{GAEhr97`v0RqMe(OF|i|NXfjAr=`Y>-shVK;_gUG|Vq> zUtSJEfN@>W+~-f~H{gtMTo^S0*|b>n*qBAn)gl14T`l0L^@7a8JP-n7Ds4sal?FC8 zHcEiGc$}*0Mlv!|Ie%`DfYC0R{0C*lP9L$EIR-xeh}5(+0J^%ml2(M}@pnD(G?8(O z=*>7rXS?t>AC#HvQpw-6i7&tSbj9&qDucY`b)=?jBx>87e)kxcE?*&FvF*MXmk=xBR)13heAcFC@n+j$s%!VK znmeFB*v%`i9^=;;8#5dMpg-8{=sEW;lW=M!1&b z+ab%fjlDsU+s(zP?YIl_F^ePg2fOJq+_*i7Hh>`KmFHa1n|iC`eQAaxn4uBp9Dc&G zC@HJrm&qTUaTAusg`uIO?gDRVsm#sGbDlTkY+-nCfTgy%c-$$%{?-?iV=LVcSYn0~ z6_46BUSBo4_wHk}$II~G027www3U=qtz=pyC1q9Y-n$R4ubK(VVt8Px(Ye_^wRCt{2+Fxu_RUE+a@2!i5ZLmN5mu(pxNVetWiMw+db#x_dDlz&%H0_fTAdhq9}@@D2k#eilQirqA1G$geE(%J+NBzE3)TfmHIqF7ezNAH~Hb0HjjW9R2b*0I|sgtJgF>)Te13LhtU( zTM=Ff?i9@%o9*Wt6A}7`N3;23ah_TE1PlGk?S2g*WM6_*0VZA7xGV|?hlknb-3CA= zb1&N|{uuXZxC?KEhuE@FnXuCCibu1BMIdnC5O*Hx&+r(jRC1;tg#5paKLWBIA@#))E5N#-672c7{1s zOVBjXCpCg!2lDz4IHK><^yZLgpDB7`)TB4O41n73QeK#+QC3q0nuZ=L&MCjtz_zwF z0gz6mXl!buw6utUQ-g%`gIarFmsq{VPhvVv|2JPyR9p-|Pft(Yitu3mb?Y|~88?Yf zrO>+%YJuP`Q8u@T>dH#K`}V7x^GkgKzJ?Zx3KtW%EDnG49v3cNBBUSG07Ci!?c${i z9R6@Gam!*>VFmRK8~@=_|C-;wj;Lu8w=BlYpY6p1=-mgjgq3D&rax+$`2B11nqN^A zMNt$*Q4~c{6h%=KMNt&xKOv{%tCkHL#Ju?)`&pkk9eU7?jy^K;RAg zjQZBiVNUe*<@bI7fZOdB^X7YKX>GCFO3DlE3H2QRUI4UhUi+^s9-ympulDCWJ397= zhKAMlm=nF=b{k@3WJGEn(vx+&-J-6pg_z60Tj3!b9cKB|lK?oERx`V#oStzVZ-s}> z;QRkd5jwix6yfMFZIuCjowhK>A^=>Od)c1T!mCb(hE5<`0O=j@R?XYAdNaUNl+LOI z*Lp%{CIDz%n1SDtJaT4p?yJf{?a>v~vVzuUlRyEz!`WLQhl1H1kSOqi7kVda35>K$ z#gs0<=bR)_m`!914PcC%=h~=2(}tHw6jo!5MKHAUTr-RumnHAr(RWzpbn;VdCC;VQ z7@i0x`;O70J8`OZcjFI#9IegSKSykW2FB4bnaZ%Ic?9fnN zKLcM~ov5g)vY!_%S^o-v7i9eoJL<%EAoeM3 P00000NkvXXu0mjfZD>iO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/equipped-FEET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5c3a05894c08d233f91a43833a7b7c4ca78afb GIT binary patch literal 1486 zcma)+X*ARe0LB0FFs30p)0r8|L~<-yvW$H<9Px%GWO<5b#t>3N)|q(`qLd~39wwBO zNS3VG#+D{a#4trnwkD0`;dvk5xA)=x?z#7z`}N+%I$};j;ZOhoPTJX8IUl>(zk+~| zSxpR`0{~DE(b5u2^z{V*rL?d#WBYEbM1pLfb(Ivqv=vgzKh)n`qQ{BNbS}s7wPz_h zxTBt->_kH)J(0Zp@83P|q?FV!tK}fca*Iprlc&W-8!S>7h~Sa#=#6M}Bu{B(kVM<2 zl7#)+{9N0B`kNeg&Uw);E8>|f9V3Ejq2t!ZUQ>nn$Nc!!?W4Bl8XZCuSo;-37?H{r zplg@A#9+26uhX3Rm*R!vS+#;nF;%3tuHTb6lH`lu9SOat@~D7a_(b58Qj_%pd10>1 zOP9Rt)s()6ue+6N(LW@55U>VS zFNdnEZ24rO|Og`6xWMn*d6g}V8f;f~_l7QZ^D8>HQT2cO58LD)j7E{TcVJV09 z&bP5F`aMI@pk7kllwTktj?U~@s3Eu6$V zil7AWoEDwX^VzfK_(gbxFD6dD1$Bfp0=7Ad@|9Jw{Gh}H(un@5kXzOnj~})%^MpnX zhjZD!$5eh~ag-fshp2PP1C>y|D8AibEpgo5AUPZkWFABDb5z&;WcMKiX-GRr3XjVK z4fIy__79h==uO>3!o|fEfE)T^m3Mi1vJ;Xhza%x~$r|m6o)g7^bcf%l2Y3PLO(S6g zG8dV6QM2#>pF-cexw7XB#wkDQ2=h9Z8Y@gS(Z3rs12pX#RpFAEo4cNBvv`#>NJ3&_ zG~S|x{G%65^NDI&(JfjQHH|scgW-t^VxV;Oh^p)oc5_5gA7fiZ0#iTLc%PUDrxNq> zf@Y561+Vto%aKjBGatczY#65gxMHxw2EV=pW6xzbM77BrP6oxUj4~JvVz`&x1VAg9NIN$zHh|66l<5!bH;UJG3@AA?c!hCl`MxkY1?hL1ri>u)vj zy3fT>$J4T#tDg!Z`B1#%`gcXFx;GjE9fPZI!&G`dthn7JC3Eau1%D^iwyv?cOO~d- zx%fVoSt8Kdg658gDQ4)W4ZnV&s#9roeA1K|#8AUgLymYG(k>wHFnOh&X@OffVwv3W@GEQ`~D7f^wX-{qr zlYdN=ZqR70cp!A0v%4AfSX&$qGMH8xj;FB{BDTIAriB^y88*lylFZ5qd3H+N%0qK_ zrkY*NARy$=Wmg%~rN^A*ij-UQ!$XsHlgO^K*|iD29$cs(+1Tboh{(|zj2uFMDd_*= zef40h&W{*u@?c~Cs*oAvFBTeLEUk|bPC-ylaLUHRkWO50!<6pxo4E z74bdYUj~nNg`d1JuEpk~oVp;xArP+SlIP^t^@vpWXJC=kZTMtZl}io42+&ziUG91j j9^TowreTDd89x&6eY%8&L5xO@e;Tl}cC@OsxN`d+GJ(20 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/meta.json index 3aa61e31c5..7c3599192c 100644 --- a/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/meta.json +++ b/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created by EmoGarbage404", + "copyright": "Created by EmoGarbage404. Vox states made by Flareguy, modified from magboots.rsi", "size": { "x": 32, "y": 32 @@ -15,6 +15,14 @@ "name": "on-equipped-FEET", "directions": 4 }, + { + "name": "equipped-FEET-vox", + "directions": 4 + }, + { + "name": "on-equipped-FEET-vox", + "directions": 4 + }, { "name": "icon" }, diff --git a/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/on-equipped-FEET-vox.png b/Resources/Textures/Clothing/Shoes/Boots/speedboots.rsi/on-equipped-FEET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..66ae1ee7e843910fe716687d850b1bc9a1914684 GIT binary patch literal 1491 zcma)+Z9EeQ0LHhrwxw&N72(Rub*)-UjFi;O$V)avWwn+{Ha3?_BV(H;u6BwXYUJ%~ z8Z`_lugkn;g_4*1DK@)HXR^>j6X!nOxBKus&+qsD@O*lH&kaAqk#z=U1^@tHotGy* zU?s8t3Ibp#?uyH=&QE!XPkmEWvM0XrsdfCsX=Swo*Eqgjd^6ZoTX(s zT?G~X#y~WFLLz*ca_)JCS6!YZ&DyVT!PB;7IUEc_-6u?IzdjMV_U9x`=$0Gn${fPt zAed^Hq4_P%S_P)~c>IxR(WMgq&i6@%NovV=$arydV+--->_+ynNkUk=RdHPSg4saC z5b}w;ime(cB0I9j{VA_6W?d8&GZj?_XtAUfz+wsWreYTQ8YSt09`v0w{NSz{=uRYmNA9Wvx8H88WS%7#GQ z9v^~@w&gSfJDD@4&JA?ap-~vZ)(WJM#B$CtfYR=C+2e1&Uepb zP@-4Yvy3wIANiw0MqzVrANbAz0AMRGylY@=?ni+ub@;eNJIBl%FMT0R-(l4&3avSe)(QQ{epOgsRfHs1~X5byDod1zvWH7VQ=eFr2D^0E#Z zbwu4gdOO2gxZ-`Iqqi6L3>wg7B<3n^ccH@Rmc0A4F`2m6-k#T|wQRO6*=Wuvo(P2B zSGyFwH0tCwb=9@@hSp954mtWRO*Rr(d$2dZ@PqRJ+Pfh9VZE_?>cDtyTGfoC+OKW( zP}x8laQJbdDrOi%J9gnqsY7>HeWC^$2SpgHj@gj_a!-9N>WnVGCAH56pAAEM%}pQ~ z`kwKCuaN7wLZOz6D^yB)2&;NUol7DY`ml(xyg4T<$BcIL{qx~Yi6N#J z>^85l%y{mZ9AfK`dv@~me)@2`^kIPxr0UN%BdoB3)94JvUq5h9qqk=&LYGNZIuHl4 z98vw*exBoDYV?>}u^y7N+mfCH3|R{^55W$tYWcr7XK;k;#^NnF$Gr3W%s33aWEXWk z#$jDh`d;5z;ZfPeux1uwfon1t`C=DUkbLY>B|{LqyShynnkU%gHh!2R%);VkW2WlJ zB&foNzZf-%>6z*Q>Cm5!v%fxFo{nAgbkr7V>h#1bz>x#?ova*1?$QS}HYWuDiDgvg zGgID9_4|h>fGiHb0=*f2Rg)hk)~%Z_8Jqq+Ra95?vSMW|9mLP`F{jQvObnK(k;4VZKC-jAe3`WOb?PRFa|1C2WfV z7+sGnt+Ud#$szNq8wI<+H3NClaq_Rar_WZ-8sOzlz)Nsvul)l>y3CmX 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 index 50627ac5220bfbc37e5b6f6516b5acacd1d75165..9072c9f4fc3184e3fda883e612f655c2a80f2a9a 100644 GIT binary patch delta 270 zcmV+p0rCFl1gQd$B!2;OQb$4nuFf3k0002vNkl;{Sm|aNRg6DWLu6L2><{90B}Fue+RIanfdmdQo39YhnbnT z)_m)=ARo)j+}*vD;;l6=rL6liMR@#VkiV_gst|&5&XS}Uqkkl6nkGr|BhTRy1u!!o zhCz~)b6(%QnR(y$r|$kbAKu@HF}@`qV^j!1wbr#8_PR^~B)ugsN%K4_gmC!IOBLYN zw*AL({Oob~oC4ePt){@z{=Td(rPST#53sc)eZRy30000000000000000NC#vunKoz URl)?F00000Ne4wvM6N<$fv<0QU!csPxvAmcDTOUXf&~Kv6)Jc?DUN+YReSs@BPmc_}qI@fKd<)RoF8{ zW=%T1Dd*1&{&wdgDL3QxAGhCL`%$mVV)X0q^E#!Lq?q;L?2N|o{*50j%OBR&goe&M znv{6%`R3?2z3F-P-hZDl%kZ`$C&P&kWxGq06z4f@+!wcA{pp9~OE>E)j5f)39hcH# zntCv+!gNUrgTsvZm0Wc;a(stwOcZGdSQ7tl_uY5(_xUQt6|+HD#lgSovgIG|I_LQRbkvJ&7pl{hox0dq z=Bj)X2?$=X^fTK>HlE`)=Z$S%?J8UM`fuI)(zv(xrA@SsoHI#s(0SM(c7%`jf>Uh7 zcg2$E2lXXZrV9^tm`Y5TefC)7M!?)?pf0ILJEFWLAXABJxX%*&{C_8s+ z=Dr%?olHjhW=F1k_))ZThTQExo{tw?Vr6kSSjM4vW3T9DcaEOF&yUTp`grEogn5mQ z3@aumM5uma3Org}So&LDzl~$Q>jN$)78eI7N)r0PB+chhU)FT(3j+{%y85}Sb4q9e E04!bnCIA2c diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/back.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/back.png new file mode 100644 index 0000000000000000000000000000000000000000..c300bba8a5ba9240ca02cb3fa28f619b4ba32b21 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zYdu{YLn`LH zofTblM1hB;J;d(_t8V;-a3y)q+@)oInN)8}tlpn$+>`34IB8~A-Whh?1~r}qtQT4s zw=m2yXb^J{X1l)r*<29M!r;7W}Y{naeg}Ugvu9*ch z7}rkTap;MvW~}RrdO=g{mL)QvxM+de51;CuB}+}i=Q3{Ay*ux-KkuzS=}oHMoLQZJ z58l`(b>VQ~s$l1-jQW4~o#V-P>28*KAbA1Hvi)Cd%TDq8>aLealKf(l5dNM$N4IqH z$}fAkJTB!_em#C?*KPwBwu%DDgwK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/eyes.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..f705c337de1c2fa90af22b5c1eb2f18d90396897 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zw|TlahE&XX zJ1aWxkb!{f`zduB=IKmODXEY1XXU!wujJ7reZ2omQfl83{|R$mKi=5LbE!1o%?$oB z2D9DbA5QWKIBluidF`9uv+KXMRo*yqqSPj=g&ux2! z<5hJgZe{)QZ`R~3BCR_V*RA=ytzpU3yVetR9Ntf!eoA%CJ*LgIwllYM2w&Z?cf06D z?Wi}w4o7U`q6MuUB=I{a#2)zLmcQ|rrpL2yKK5l<)z*1IJi4 zFmEtqe8Z6A!(h!IjZdgEtFP?t7UdEy6D2){zL~v~7MtzR*;D_iq$gSKYknA`>ip^Y zrt;@G?=Cob!*Cm0ZrJvHq6b7%wH|bRbz(grPzopr00vCgx&QzG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/hand.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/hand.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0266dfd3733b7288b6690a682aa7dd518bed73 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z=X$z0hE&XX zJKHetumO*&{mXeC!F*3vF2A5@_0(Zz$>K?}O^epWDlTjKA#NalL37&AUjo(*Q$5xe z%#ldt-f)s3htW*3LHB?f^9I%%DGb{fX7d~nOPI`fgDJ;|A-chrt)imgUV_) z{KG-+=jtU6ylL{3W=XxyDa$(l)`GH|r8d?7Ug|e)zsD_Xm%!$*-dVj&S7zsIb^e7)z-;Wa;({}(wy(4h(FzTsglkiE0EQqkyz2)_dBqlOdz zJ0Ao+;7d55DRw|Jpq6{Pwi9{li zNF)-8N9guc+%906+)<0C&ACOOz6i(si9Voleg9vMgN`G);r9>w>pIPy|fVgu~&0X_`PO zU5)$Sdt+t$TYtgVCxjpe_zL*OQc73hxHr=@xd^cGpGMbp=6pUIt+o4{&u0@8ezEe6 zF;1@4C02e=4gfy9z1{1}vOMiBR8_T#02}^QRYk2A>;M2@j5&iTrC^Lj36J4;Jc3f{ z5~1CC$Kx?-y&wm0&JAM><2bGo-#Ct7j71kCAzUsO0Dri73fS>bf+N6s+$O$lM&6rc zS#Y^rT#6}H!)6#iU8o_4iG{hrF6~G)9Dn| zqJ9+H9=F|TDWyA~5KFKF+P2Mn4%~E zJl6@<_@XGFl=^huBetv@&~=@8eSLM;_T&cuvw!`gJsn~r!JE4~lu``Cu+m}c2)kVX zU>JtgxNplZ{|8DbUS3`@;Ll@@5OVj<3L(%mjf(`O6sBpq8!g|(ziS&`A3_L(5H~v7 zZL&SQ#W^>=6P&V~bF890A-`f@V8rt1kaYoc|5{ zNr+9;Aj`5{BfuDAgb=Xj6|MYxx_wfeu58>s25*#a+cuL@LMe4uP@dKE8w-@d)^S-aHPrl027OO!tpcR&y>wyiKUhYU*?W>at-p^_xJIVMMpxXPU2Bv zKIvdI0YQ~Y+<05Iz5k2d>h+hGyQlArsq3i!ANhClzWehuZ+vg~Qnh#0-MsL-dEf7S ztFXCu?s;*kh0Lm#C9hsxZtmBM`2BaE$?NaGpL)*xe{I>WzyH>)?uc7`RqK_7_HxDM zPhYF{?*IPf<<;1=VOJ9jH2AtXel4(5+HcdVH{H9i#6o6TnnnMLGrz-6C2ibsHf{6n z&l47C%!|V;(zdm{Yll^eAy;7rYJ~yV55G_=cze8v0mbN z;~ZhLQj=wuGYwP&bH1bjUrFRt1=0u1D8&mZrgS7 z^9pgV2@8aaiafjnRSbk&4%XQ5*GJ8_{J8%8Y}MI~2d2GXXi;KtkNhCu%9P^LTk&j1 zEk9dC*^`Z`R;E|i|dR1_DPG>fh0%xYGi zrAH$FxM<{Ma24>b3w*x+(i0`+2c|I+2~BH{Zdkdxa{bgTe~DWM4fCLDpr From ba2c5fcdedfcbc0b3cfe0d6a1a19e6547bb3adae Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:50:24 +0300 Subject: [PATCH 095/118] Make the super door remote to be able to control Syndicate doors (#30033) * Make the super door remote to be able to control Syndicate doors * Fix --- Resources/Prototypes/Entities/Objects/Devices/door_remote.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml index a368ec2b65..623efa7276 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml @@ -160,3 +160,5 @@ - AllAccess tags: - CentralCommand + - NuclearOperative + - SyndicateAgent From be9acaea356bb50751ad2ccad3f468dabd0748b5 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 17 Jul 2024 13:51:32 +0000 Subject: [PATCH 096/118] 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 ec85d771e3..fd909d6b12 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: pigeonpeas - changes: - - message: Adds the ability to purchase emitters in cargo. - type: Add - id: 6428 - time: '2024-04-23T11:34:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27229 - author: EmoGarbage404 changes: - message: Fixed cargo telepads not teleporting in orders from linked consoles. @@ -3804,3 +3797,10 @@ id: 6927 time: '2024-07-17T06:26:10.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29995 +- author: Winkarst-cpu + changes: + - message: The super door remote is now able to control Syndicate doors. + type: Fix + id: 6928 + time: '2024-07-17T13:50:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30033 From 6f5077803bf4df81c0d56d99e30effe31270c35d Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 17 Jul 2024 20:25:19 +0200 Subject: [PATCH 097/118] Fix formatting warnings (#30122) --- Content.Server/Botany/Components/SeedComponent.cs | 2 +- Content.Server/Botany/Systems/MutationSystem.cs | 8 ++++---- Content.Server/Botany/Systems/SeedExtractorSystem.cs | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Content.Server/Botany/Components/SeedComponent.cs b/Content.Server/Botany/Components/SeedComponent.cs index f475ec3cfc..ffa1b7ef4e 100644 --- a/Content.Server/Botany/Components/SeedComponent.cs +++ b/Content.Server/Botany/Components/SeedComponent.cs @@ -24,7 +24,7 @@ public sealed partial class SeedComponent : SharedSeedComponent /// /// Name of a base seed prototype that is used if is null. /// - [DataField("seedId", customTypeSerializer:typeof(PrototypeIdSerializer))] + [DataField("seedId", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? SeedId; } } diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index c7ce5d47ef..474859823a 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -2,10 +2,8 @@ using Robust.Shared.Random; using Content.Shared.Random; using Content.Shared.Random.Helpers; -using Content.Shared.Chemistry.Reagent; using System.Linq; using Content.Shared.Atmos; -using FastAccessors; namespace Content.Server.Botany; @@ -42,6 +40,7 @@ public void MutateSeed(ref SeedData seed, float severity) // Add up everything in the bits column and put the number here. const int totalbits = 275; + #pragma warning disable IDE0055 // disable formatting warnings because this looks more readable // Tolerances (55) MutateFloat(ref seed.NutrientConsumption , 0.05f, 1.2f, 5, totalbits, severity); MutateFloat(ref seed.WaterConsumption , 3f , 9f , 5, totalbits, severity); @@ -75,6 +74,7 @@ public void MutateSeed(ref SeedData seed, float severity) MutateBool(ref seed.TurnIntoKudzu , true , 10, totalbits, severity); MutateBool(ref seed.CanScream , true , 10, totalbits, severity); seed.BioluminescentColor = RandomColor(seed.BioluminescentColor, 10, totalbits, severity); + #pragma warning restore IDE0055 // ConstantUpgade (10) MutateHarvestType(ref seed.HarvestRepeat, 10, totalbits, severity); @@ -261,7 +261,7 @@ private void MutateChemicals(ref Dictionary chemicals, { var pick = _randomChems.Pick(_robustRandom); string chemicalId = pick.reagent; - int amount = _robustRandom.Next(1, ((int)pick.quantity)); + int amount = _robustRandom.Next(1, (int)pick.quantity); SeedChemQuantity seedChemQuantity = new SeedChemQuantity(); if (chemicals.ContainsKey(chemicalId)) { @@ -274,7 +274,7 @@ private void MutateChemicals(ref Dictionary chemicals, seedChemQuantity.Max = 1 + amount; seedChemQuantity.Inherent = false; } - int potencyDivisor = (int) Math.Ceiling(100.0f / seedChemQuantity.Max); + int potencyDivisor = (int)Math.Ceiling(100.0f / seedChemQuantity.Max); seedChemQuantity.PotencyDivisor = potencyDivisor; chemicals[chemicalId] = seedChemQuantity; } diff --git a/Content.Server/Botany/Systems/SeedExtractorSystem.cs b/Content.Server/Botany/Systems/SeedExtractorSystem.cs index f1ae6c9f11..9a5e70762e 100644 --- a/Content.Server/Botany/Systems/SeedExtractorSystem.cs +++ b/Content.Server/Botany/Systems/SeedExtractorSystem.cs @@ -29,12 +29,12 @@ private void OnInteractUsing(EntityUid uid, SeedExtractorComponent seedExtractor return; if (!_botanySystem.TryGetSeed(produce, out var seed) || seed.Seedless) { - _popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-no-seeds",("name", args.Used)), + _popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-no-seeds", ("name", args.Used)), args.User, PopupType.MediumCaution); return; } - _popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-interact-message",("name", args.Used)), + _popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-interact-message", ("name", args.Used)), args.User, PopupType.Medium); QueueDel(args.Used); From ef02f8c18cb1c5423c9d7bae3aea5b1fa6ac2b86 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Thu, 18 Jul 2024 00:04:51 +0200 Subject: [PATCH 098/118] Temporarily remove Vox from space ninja and Unknown Shuttle ghostroles (#30099) * no vox ninjas * blacklist vox from UnknownShuttleEvent --- Resources/Prototypes/Entities/Mobs/Player/humanoid.yml | 10 ++++++++++ Resources/Prototypes/GameRules/events.yml | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml index 5bcc33b5f6..47baca6134 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml @@ -607,6 +607,8 @@ - type: randomHumanoidSettings id: LostCargoTechnician parent: EventHumanoid + speciesBlacklist: + - Vox components: - type: GhostRole name: ghost-role-information-lost-cargo-technical-name @@ -658,6 +660,8 @@ id: ClownTroupe parent: EventHumanoid randomizeName: false + speciesBlacklist: + - Vox components: - type: GhostRole name: ghost-role-information-clown-troupe-name @@ -708,6 +712,8 @@ - type: randomHumanoidSettings id: TravelingChef parent: EventHumanoid + speciesBlacklist: + - Vox components: - type: GhostRole name: ghost-role-information-traveling-chef-name @@ -768,6 +774,8 @@ - type: randomHumanoidSettings id: DisasterVictimHead parent: EventHumanoidMindShielded + speciesBlacklist: + - Vox components: - type: GhostRole name: ghost-role-information-disaster-victim-name @@ -826,6 +834,8 @@ - type: randomHumanoidSettings id: SyndieDisasterVictim parent: EventHumanoid + speciesBlacklist: + - Vox components: - type: NpcFactionMember factions: diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 0b183039a9..7784b72556 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -151,6 +151,10 @@ minimumPlayers: 30 - type: SpaceSpawnRule - type: AntagLoadProfileRule + # Vox disabled until loadouts work on AntagSelection-based spawns + speciesOverride: Human + speciesOverrideBlacklist: + - Vox - type: AntagObjectives objectives: - StealResearchObjective From 2d5bb92f463d964c096904af64c7e442be4aaeed Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 17 Jul 2024 22:05:58 +0000 Subject: [PATCH 099/118] 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 fd909d6b12..99fa3976e3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Fixed cargo telepads not teleporting in orders from linked consoles. - type: Fix - id: 6429 - time: '2024-04-23T12:07:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27255 - author: Plykiya changes: - message: Do-after bars of other players are now shaded and harder to see in the @@ -3804,3 +3797,11 @@ id: 6928 time: '2024-07-17T13:50:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30033 +- author: Errant + changes: + - message: Vox are temporarily removed from Space Ninjas and all Unknown Shuttle + ghostroles, until code supports giving them species-specific gear. + type: Tweak + id: 6929 + time: '2024-07-17T22:04:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30099 From e1f429b6b3a7759587d26a99e741d66e37a32add Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 18 Jul 2024 01:37:03 +0300 Subject: [PATCH 100/118] DungeonSystem.Rooms bugfix (#30125) Update DungeonSystem.Rooms.cs --- Content.Server/Procedural/DungeonSystem.Rooms.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Procedural/DungeonSystem.Rooms.cs b/Content.Server/Procedural/DungeonSystem.Rooms.cs index 8a1606c488..20d64acff1 100644 --- a/Content.Server/Procedural/DungeonSystem.Rooms.cs +++ b/Content.Server/Procedural/DungeonSystem.Rooms.cs @@ -118,7 +118,7 @@ public void SpawnRoom( // go BRRNNTTT on existing stuff if (clearExisting) { - var gridBounds = new Box2(Vector2.Transform(Vector2.Zero, roomTransform), Vector2.Transform(room.Size, roomTransform)); + var gridBounds = new Box2(Vector2.Transform(-room.Size/2, roomTransform), Vector2.Transform(room.Size/2, roomTransform)); _entitySet.Clear(); // Polygon skin moment gridBounds = gridBounds.Enlarged(-0.05f); From c7ea0490a67ec503f36e2ddeedb93a45dc914ce9 Mon Sep 17 00:00:00 2001 From: kbailey-git <84491830+kbailey-git@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:54:08 -0700 Subject: [PATCH 101/118] Updated slime storage capacity text in guidebook (#30121) --- Resources/ServerInfo/Guidebook/Mobs/SlimePerson.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/ServerInfo/Guidebook/Mobs/SlimePerson.xml b/Resources/ServerInfo/Guidebook/Mobs/SlimePerson.xml index 0374d4cb95..2c11508749 100644 --- a/Resources/ServerInfo/Guidebook/Mobs/SlimePerson.xml +++ b/Resources/ServerInfo/Guidebook/Mobs/SlimePerson.xml @@ -18,7 +18,7 @@ - Slimepeople have an [bold]internal 2x2 storage inventory[/bold] inside of their slime membrane. Anyone can see what's inside and take it out of you without asking, + Slimepeople have an [bold]internal 2x3 storage inventory[/bold] inside of their slime membrane. Anyone can see what's inside and take it out of you without asking, so be careful. They [bold]don't drop their internal storage when they morph into a geras, however![/bold] Slimepeople have slight accelerated regeneration compared to other humanoids. They're also capable of hardening their fists, and as such have stronger punches, From 95b56ad4ce8cd9f1be995c5d9a02a612e5434316 Mon Sep 17 00:00:00 2001 From: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:40:54 -0500 Subject: [PATCH 102/118] Prevent Quantum Spin Inverter from Teleporting Things into Microwaves (#29200) * Prevent Quantum Spin Inverter from Teleporting Things into Microwaves * Simplifies code, GetTeleportingEntity instead of TryGet, adds failed teleport message * remove using Linguini.Syntax.Ast; * capital... * re-add CanInsert and Fixes microwave issue * beb * beeb --- .../Kitchen/EntitySystems/MicrowaveSystem.cs | 27 +++++++++++++++++++ .../Systems/SwapTeleporterSystem.cs | 23 +++++++++++----- .../Locale/en-US/portal/swap-teleporter.ftl | 1 + 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs index eefa539149..71986ae859 100644 --- a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs @@ -79,6 +79,7 @@ public override void Initialize() SubscribeLocalEvent(OnContentUpdate); SubscribeLocalEvent(OnContentUpdate); SubscribeLocalEvent(OnInteractUsing, after: new[] { typeof(AnchorableSystem) }); + SubscribeLocalEvent(OnInsertAttempt); SubscribeLocalEvent(OnBreak); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnAnchorChanged); @@ -309,6 +310,32 @@ private void OnContentUpdate(EntityUid uid, MicrowaveComponent component, Contai UpdateUserInterfaceState(uid, component); } + private void OnInsertAttempt(Entity ent, ref ContainerIsInsertingAttemptEvent args) + { + if (ent.Comp.Broken) + { + args.Cancel(); + return; + } + + if (TryComp(args.EntityUid, out var item)) + { + if (_item.GetSizePrototype(item.Size) > _item.GetSizePrototype(ent.Comp.MaxItemSize)) + { + args.Cancel(); + return; + } + } + else + { + args.Cancel(); + return; + } + + if (ent.Comp.Storage.Count >= ent.Comp.Capacity) + args.Cancel(); + } + private void OnInteractUsing(Entity ent, ref InteractUsingEvent args) { if (args.Handled) diff --git a/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs b/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs index 58c249fec5..a5ad77d43b 100644 --- a/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs +++ b/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs @@ -150,8 +150,19 @@ public void DoTeleport(Entity ent) return; } - var teleEnt = GetTeleportingEntity((uid, xform)); - var otherTeleEnt = GetTeleportingEntity((linkedEnt, Transform(linkedEnt))); + var (teleEnt, cont) = GetTeleportingEntity((uid, xform)); + var (otherTeleEnt, otherCont) = GetTeleportingEntity((linkedEnt, Transform(linkedEnt))); + + if (otherCont != null && !_container.CanInsert(teleEnt, otherCont) || + cont != null && !_container.CanInsert(otherTeleEnt, cont)) + { + _popup.PopupEntity(Loc.GetString("swap-teleporter-popup-teleport-fail", + ("entity", Identity.Entity(linkedEnt, EntityManager))), + teleEnt, + teleEnt, + PopupType.MediumCaution); + return; + } _popup.PopupEntity(Loc.GetString("swap-teleporter-popup-teleport-other", ("entity", Identity.Entity(linkedEnt, EntityManager))), @@ -184,20 +195,20 @@ public void DestroyLink(Entity ent, EntityUid? user) DestroyLink(linked, user); // the linked one is shown globally } - private EntityUid GetTeleportingEntity(Entity ent) + private (EntityUid, BaseContainer?) GetTeleportingEntity(Entity ent) { var parent = ent.Comp.ParentUid; if (_container.TryGetOuterContainer(ent, ent, out var container)) parent = container.Owner; if (HasComp(parent) || HasComp(parent)) - return ent; + return (ent, container); if (!_xformQuery.TryGetComponent(parent, out var parentXform) || parentXform.Anchored) - return ent; + return (ent, container); if (!TryComp(parent, out var body) || body.BodyType == BodyType.Static) - return ent; + return (ent, container); return GetTeleportingEntity((parent, parentXform)); } diff --git a/Resources/Locale/en-US/portal/swap-teleporter.ftl b/Resources/Locale/en-US/portal/swap-teleporter.ftl index f13fa9be42..0040ad0a88 100644 --- a/Resources/Locale/en-US/portal/swap-teleporter.ftl +++ b/Resources/Locale/en-US/portal/swap-teleporter.ftl @@ -5,6 +5,7 @@ swap-teleporter-popup-link-destroyed = Quantum link destroyed! swap-teleporter-popup-teleport-cancel-time = It's still recharging! swap-teleporter-popup-teleport-cancel-link = It's not linked with another device! swap-teleporter-popup-teleport-other = {CAPITALIZE(THE($entity))} activates, and you find yourself somewhere else. +swap-teleporter-popup-teleport-fail = {CAPITALIZE(THE($entity))} activates and fails to transport you anywhere. swap-teleporter-verb-destroy-link = Destroy Quantum Link From 3f014e84ebf3dd860ec3595ad59f580fcff3b852 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 18 Jul 2024 02:41:15 +0200 Subject: [PATCH 103/118] minor SharedInteractionSystem cleanup (#30139) cleanup SharedInteractionSystem --- Content.Shared/Interaction/SharedInteractionSystem.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 48076ca360..c32b4bcf78 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -38,8 +38,6 @@ using Robust.Shared.Timing; using Robust.Shared.Utility; -#pragma warning disable 618 - namespace Content.Shared.Interaction { /// @@ -522,11 +520,11 @@ public void InteractUsingRanged(EntityUid user, EntityUid used, EntityUid? targe protected bool ValidateInteractAndFace(EntityUid user, EntityCoordinates coordinates) { // Verify user is on the same map as the entity they clicked on - if (coordinates.GetMapId(EntityManager) != Transform(user).MapID) + if (_transform.GetMapId(coordinates) != Transform(user).MapID) return false; if (!HasComp(user)) - _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager, _transform)); + _rotateToFaceSystem.TryFaceCoordinates(user, _transform.ToMapCoordinates(coordinates).Position); return true; } @@ -859,7 +857,7 @@ public bool InRangeUnobstructed( Ignored? predicate = null, bool popup = false) { - return InRangeUnobstructed(origin, other.ToMap(EntityManager, _transform), range, collisionMask, predicate, popup); + return InRangeUnobstructed(origin, _transform.ToMapCoordinates(other), range, collisionMask, predicate, popup); } /// @@ -966,7 +964,7 @@ public void InteractUsing( /// public void InteractDoAfter(EntityUid user, EntityUid used, EntityUid? target, EntityCoordinates clickLocation, bool canReach) { - if (target is {Valid: false}) + if (target is { Valid: false }) target = null; var afterInteractEvent = new AfterInteractEvent(user, used, target, clickLocation, canReach); From d7b2e728821697210a8d67ec0464dba642c0ff3c Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 18 Jul 2024 00:42:02 +0000 Subject: [PATCH 104/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 99fa3976e3..c768ac40e7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: Do-after bars of other players are now shaded and harder to see in the - dark. - type: Tweak - id: 6430 - time: '2024-04-24T02:42:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27273 - author: Blackern5000 changes: - message: The cargo telepad is now tier 2 technology rather than tier 3. @@ -3805,3 +3797,11 @@ id: 6929 time: '2024-07-17T22:04:51.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30099 +- author: Cojoke-dot + changes: + - message: You can no longer teleport objects that should not be in other objects + into other objects with the Quantum Spin Inverter + type: Fix + id: 6930 + time: '2024-07-18T00:40:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29200 From 961a553fa2e335bfb7edbf7c4dd2214aa68c2014 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Wed, 17 Jul 2024 17:48:08 -0700 Subject: [PATCH 105/118] Fix stun batons using excess charges when thrown (#30136) Fix stun batons Co-authored-by: plykiya --- Content.Shared/Damage/Systems/StaminaSystem.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 1f9a7f1dd8..a5c8a4b38d 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -192,6 +192,11 @@ private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, EntityUid target) { + // you can't inflict stamina damage on things with no stamina component + // this prevents stun batons from using up charges when throwing it at lockers or lights + if (!HasComp(target)) + return; + var ev = new StaminaDamageOnHitAttemptEvent(); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) From 58a2a4c932dfa5593221de1d315470fc4ffa8976 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 18 Jul 2024 00:49:15 +0000 Subject: [PATCH 106/118] 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 c768ac40e7..2ba6a098e0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Blackern5000 - changes: - - message: The cargo telepad is now tier 2 technology rather than tier 3. - type: Tweak - id: 6431 - time: '2024-04-24T13:21:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26270 - author: FungiFellow changes: - message: Truncheon now fits in SecBelt @@ -3805,3 +3798,10 @@ id: 6930 time: '2024-07-18T00:40:54.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29200 +- author: Plykiya + changes: + - message: Stun batons no longer use up charges when hitting objects without stamina. + type: Fix + id: 6931 + time: '2024-07-18T00:48:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30136 From 73111b5170d76cfe2df0e5c21e1b6e923ec214ec Mon Sep 17 00:00:00 2001 From: Brandon Hu <103440971+Brandon-Huu@users.noreply.github.com> Date: Thu, 18 Jul 2024 07:17:57 +0000 Subject: [PATCH 107/118] fix(dev_map): resave dev map (#30098) fix(dev_map): Resave devmap Co-authored-by: 4llv07e --- Resources/Maps/Test/dev_map.yml | 121 +++----------------------------- 1 file changed, 10 insertions(+), 111 deletions(-) diff --git a/Resources/Maps/Test/dev_map.yml b/Resources/Maps/Test/dev_map.yml index ca885d584b..520a4da5ae 100644 --- a/Resources/Maps/Test/dev_map.yml +++ b/Resources/Maps/Test/dev_map.yml @@ -385,11 +385,11 @@ entities: - type: Transform - type: Map - type: PhysicsMap + - type: GridTree + - type: MovedGrids - type: Broadphase - type: OccluderTree - type: LoadedMap - - type: GridTree - - type: MovedGrids - proto: AirAlarm entities: - uid: 800 @@ -401,8 +401,6 @@ entities: - type: DeviceList devices: - 801 - - type: AtmosDevice - joinedGrid: 179 - proto: AirCanister entities: - uid: 458 @@ -410,8 +408,6 @@ entities: - type: Transform pos: 7.5,-0.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: Airlock entities: - uid: 48 @@ -901,33 +897,21 @@ entities: - type: Transform pos: -2.5,-14.5 parent: 179 - - type: DeviceLinkSink - links: - - 1013 - uid: 697 components: - type: Transform pos: 1.5,-14.5 parent: 179 - - type: DeviceLinkSink - links: - - 1014 - uid: 698 components: - type: Transform pos: 1.5,-16.5 parent: 179 - - type: DeviceLinkSink - links: - - 1014 - uid: 984 components: - type: Transform pos: -2.5,-16.5 parent: 179 - - type: DeviceLinkSink - links: - - 1013 - proto: BoozeDispenser entities: - uid: 752 @@ -2660,13 +2644,6 @@ entities: - type: Transform pos: 24.5,5.5 parent: 179 -- proto: chem_master - entities: - - uid: 311 - components: - - type: Transform - pos: 8.5,11.5 - parent: 179 - proto: ChemDispenser entities: - uid: 583 @@ -2704,6 +2681,13 @@ entities: - type: Transform pos: 6.4651074,9.828774 parent: 179 +- proto: ChemMaster + entities: + - uid: 311 + components: + - type: Transform + pos: 8.5,11.5 + parent: 179 - proto: ChemMasterMachineCircuitboard entities: - uid: 718 @@ -3031,27 +3015,18 @@ entities: - type: Transform pos: -2.5,-15.5 parent: 179 - - type: DeviceLinkSink - links: - - 699 - uid: 259 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,-14.5 parent: 179 - - type: DeviceLinkSink - links: - - 983 - uid: 463 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,-16.5 parent: 179 - - type: DeviceLinkSink - links: - - 983 - uid: 677 components: - type: Transform @@ -3063,61 +3038,40 @@ entities: rot: -1.5707963267948966 rad pos: -1.5,11.5 parent: 179 - - type: DeviceLinkSink - links: - - 722 - uid: 720 components: - type: Transform rot: -1.5707963267948966 rad pos: -0.5,11.5 parent: 179 - - type: DeviceLinkSink - links: - - 722 - uid: 721 components: - type: Transform rot: -1.5707963267948966 rad pos: 0.5,11.5 parent: 179 - - type: DeviceLinkSink - links: - - 722 - uid: 985 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,-13.5 parent: 179 - - type: DeviceLinkSink - links: - - 983 - uid: 989 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,-15.5 parent: 179 - - type: DeviceLinkSink - links: - - 983 - uid: 990 components: - type: Transform pos: -2.5,-13.5 parent: 179 - - type: DeviceLinkSink - links: - - 699 - uid: 991 components: - type: Transform pos: -2.5,-16.5 parent: 179 - - type: DeviceLinkSink - links: - - 699 - proto: CrateEngineeringToolbox entities: - uid: 692 @@ -3575,8 +3529,6 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,-3.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasMixer entities: - uid: 747 @@ -3585,8 +3537,6 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,-2.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasOutletInjector entities: - uid: 429 @@ -3595,8 +3545,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,-1.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasPipeBend entities: - uid: 727 @@ -3635,8 +3583,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,-0.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasPressurePump entities: - uid: 171 @@ -3645,8 +3591,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,-3.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasValve entities: - uid: 168 @@ -3655,8 +3599,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,-2.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasVentPump entities: - uid: 729 @@ -3665,8 +3607,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,-3.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasVentScrubber entities: - uid: 452 @@ -3675,8 +3615,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,-2.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GasVolumePump entities: - uid: 160 @@ -3685,8 +3623,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,-1.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: GeigerCounter entities: - uid: 759 @@ -4223,9 +4159,6 @@ entities: - type: Transform pos: 12.5,24.5 parent: 179 - - type: DeviceLinkSink - links: - - 1083 - proto: MachineFrame entities: - uid: 533 @@ -4379,8 +4312,6 @@ entities: - type: Transform pos: 7.5,-1.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: Ointment entities: - uid: 148 @@ -4400,8 +4331,6 @@ entities: - type: Transform pos: 7.5,-3.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: PaperBin10 entities: - uid: 977 @@ -4435,8 +4364,6 @@ entities: - type: Transform pos: 7.5,-2.5 parent: 179 - - type: AtmosDevice - joinedGrid: 179 - proto: PlasticFlapsAirtightClear entities: - uid: 997 @@ -5112,7 +5039,7 @@ entities: - type: Transform pos: -6.5,-12.5 parent: 179 -- proto: soda_dispenser +- proto: SodaDispenser entities: - uid: 751 components: @@ -5164,20 +5091,6 @@ entities: - type: Transform pos: -3.5,4.5 parent: 179 -- proto: SpawnVehicleATV - entities: - - uid: 1176 - components: - - type: Transform - pos: -7.5,1.5 - parent: 179 -- proto: SpawnVehicleJanicart - entities: - - uid: 904 - components: - - type: Transform - pos: 5.5,16.5 - parent: 179 - proto: Spear entities: - uid: 185 @@ -5809,20 +5722,6 @@ entities: - type: Transform pos: -7.5,4.5 parent: 179 -- proto: VehicleKeyATV - entities: - - uid: 1187 - components: - - type: Transform - pos: -6.8905525,1.5128828 - parent: 179 -- proto: VehicleKeyJanicart - entities: - - uid: 14 - components: - - type: Transform - pos: 6.5,16.5 - parent: 179 - proto: VendingMachineCigs entities: - uid: 870 From a94f1f0fe0b985236b508da25311d21aa92130b5 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 18 Jul 2024 20:43:20 +0200 Subject: [PATCH 108/118] Correct .editorconfig to use no space after casting (#30132) --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index a5dfab07a5..1583c600aa 100644 --- a/.editorconfig +++ b/.editorconfig @@ -129,7 +129,7 @@ csharp_indent_braces = false csharp_indent_switch_labels = true # Space preferences -csharp_space_after_cast = true +csharp_space_after_cast = false csharp_space_after_colon_in_inheritance_clause = true csharp_space_after_comma = true csharp_space_after_dot = false From 437fc936a2faacd409c56b164fd4cb1974d2f454 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 18 Jul 2024 22:29:20 +0300 Subject: [PATCH 109/118] LatheSystem independently of energy (#30148) * Update LatheSystem.cs * Emo --- Content.Server/Power/EntitySystems/StaticPowerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Power/EntitySystems/StaticPowerSystem.cs b/Content.Server/Power/EntitySystems/StaticPowerSystem.cs index 9e11d9311a..61a23e501d 100644 --- a/Content.Server/Power/EntitySystems/StaticPowerSystem.cs +++ b/Content.Server/Power/EntitySystems/StaticPowerSystem.cs @@ -9,7 +9,7 @@ public static class StaticPowerSystem public static bool IsPowered(this EntitySystem system, EntityUid uid, IEntityManager entManager, ApcPowerReceiverComponent? receiver = null) { if (receiver == null && !entManager.TryGetComponent(uid, out receiver)) - return false; + return true; return receiver.Powered; } From 2fb2cde1253f08488df14cb3c6bc6735903cc0fc Mon Sep 17 00:00:00 2001 From: Smirnov Peter <131467813+Sh18RW@users.noreply.github.com> Date: Fri, 19 Jul 2024 01:34:18 +0300 Subject: [PATCH 110/118] Add item checking for moth food (#30019) * Add ContainerContainer component checking for moth food * Use ItemSlotsComponent checking on food item --- Content.Server/Nutrition/EntitySystems/FoodSystem.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index fc9d228b05..d609f737e7 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -10,7 +10,6 @@ using Content.Shared.Body.Components; using Content.Shared.Body.Organ; using Content.Shared.Chemistry; -using Content.Shared.Chemistry.Reagent; using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; @@ -31,6 +30,7 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Utility; using System.Linq; +using Content.Shared.Containers.ItemSlots; using Robust.Server.GameObjects; using Content.Shared.Whitelist; @@ -138,6 +138,16 @@ private void OnFeedFood(Entity entity, ref AfterInteractEvent arg return (false, true); } + // Checks for used item slots + if (TryComp(food, out var itemSlots)) + { + if (itemSlots.Slots.Any(slot => slot.Value.HasItem)) + { + _popup.PopupEntity(Loc.GetString("food-has-used-storage", ("food", food)), user, user); + return (false, true); + } + } + var flavors = _flavorProfile.GetLocalizedFlavorsMessage(food, user, foodSolution); if (GetUsesRemaining(food, foodComp) <= 0) From 0c2b56962267d006965b4b3b3ee20fbbbfdb0280 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 18 Jul 2024 22:35:26 +0000 Subject: [PATCH 111/118] 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 2ba6a098e0..e2ceb5193a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: FungiFellow - changes: - - message: Truncheon now fits in SecBelt - type: Tweak - id: 6432 - time: '2024-04-24T13:43:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27281 - author: pigeonpeas changes: - message: Adds a trash bag to the advanced cleaning module. @@ -3805,3 +3798,10 @@ id: 6931 time: '2024-07-18T00:48:09.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30136 +- author: Sh18RW + changes: + - message: Moth can't eat boots with an item more + type: Fix + id: 6932 + time: '2024-07-18T22:34:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30019 From 3ef5f521e2e162b2372b563cc0879313deddcd7b Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Thu, 18 Jul 2024 18:36:53 -0400 Subject: [PATCH 112/118] fix: give reptilians species mask sprites in lobby (#30095) --- Resources/Prototypes/Entities/Mobs/Species/reptilian.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index ad543620cf..0d93e6fe51 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -71,5 +71,11 @@ components: - type: HumanoidAppearance species: Reptilian + hideLayersOnEquip: + - Snout + - HeadTop + - HeadSide + - type: Inventory + speciesId: reptilian #Weh From d30b45f23f17d396c7c55ce33806939d9af66c94 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 18 Jul 2024 22:37:59 +0000 Subject: [PATCH 113/118] 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 e2ceb5193a..6f0ba27d30 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: pigeonpeas - changes: - - message: Adds a trash bag to the advanced cleaning module. - type: Add - id: 6433 - time: '2024-04-24T21:27:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/27226 - author: Beck Thompson changes: - message: Radio jammer now has 3 selectable power operating levels and a battery @@ -3805,3 +3798,10 @@ id: 6932 time: '2024-07-18T22:34:18.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30019 +- author: portfiend + changes: + - message: Reptilians display correct mask sprites in character customization screen. + type: Fix + id: 6933 + time: '2024-07-18T22:36:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30095 From 84fe6bcde4acc7334523c46c9564dcc8d79015de Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Thu, 18 Jul 2024 17:21:01 -0700 Subject: [PATCH 114/118] Fix arrow pointing animation (#30134) Fixa the arrows Co-authored-by: plykiya --- Content.Server/Pointing/EntitySystems/PointingSystem.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index 4b7f50fb86..f2f60f3063 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -152,9 +152,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E if (TryComp(arrow, out var pointing)) { - if (TryComp(player, out TransformComponent? xformPlayer)) - pointing.StartPosition = _transform.ToCoordinates((player, xformPlayer), _transform.ToMapCoordinates(xformPlayer.Coordinates)).Position; - + pointing.StartPosition = _transform.ToCoordinates((arrow, Transform(arrow)), _transform.ToMapCoordinates(Transform(player).Coordinates)).Position; pointing.EndTime = _gameTiming.CurTime + PointDuration; Dirty(arrow, pointing); From b57174007c8d455d10cfa6a2e8563993e935838e Mon Sep 17 00:00:00 2001 From: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Date: Thu, 18 Jul 2024 19:22:23 -0500 Subject: [PATCH 115/118] Remove all Assigned Values that are Never Used (#30110) Remove all Assigned Values that are never used --- .../Administration/UI/Tabs/ObjectsTab/ObjectsTab.xaml.cs | 1 - Content.Client/Construction/ConstructionSystem.cs | 1 - Content.Client/Lathe/UI/LatheMenu.xaml.cs | 1 - Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs | 1 - Content.Server/Ame/EntitySystems/AmeControllerSystem.cs | 2 -- Content.Server/Chat/Systems/ChatSystem.cs | 1 - Content.Server/Cluwne/CluwneSystem.cs | 1 - Content.Server/Doors/Systems/FirelockSystem.cs | 1 - Content.Server/Dragon/DragonSystem.cs | 1 - Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs | 1 - Content.Server/GameTicking/Rules/SecretRuleSystem.cs | 1 - Content.Server/GameTicking/Rules/ThiefRuleSystem.cs | 2 -- Content.Server/GameTicking/Rules/TraitorRuleSystem.cs | 1 - Content.Server/Instruments/InstrumentSystem.cs | 1 - Content.Server/Medical/DefibrillatorSystem.cs | 1 - Content.Server/Ninja/Systems/SpaceNinjaSystem.cs | 3 --- Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs | 1 - .../Players/PlayTimeTracking/PlayTimeTrackingSystem.cs | 1 - Content.Server/Power/EntitySystems/PowerNetSystem.cs | 1 - Content.Server/Power/EntitySystems/PowerReceiverSystem.cs | 1 - Content.Server/Procedural/DungeonSystem.cs | 1 - Content.Server/Silicons/Borgs/BorgSystem.cs | 1 - Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs | 1 - Content.Server/Station/Systems/StationSystem.cs | 2 -- Content.Server/Traits/TraitSystem.cs | 1 - Content.Shared/Actions/SharedActionsSystem.cs | 1 - Content.Shared/Beeper/Systems/ProximityBeeperSystem.cs | 2 -- Content.Shared/Clothing/ClothingSpeedModifierSystem.cs | 3 --- Content.Shared/Movement/Pulling/Systems/PullingSystem.cs | 1 - Content.Shared/Ninja/Systems/DashAbilitySystem.cs | 1 - 30 files changed, 38 deletions(-) diff --git a/Content.Client/Administration/UI/Tabs/ObjectsTab/ObjectsTab.xaml.cs b/Content.Client/Administration/UI/Tabs/ObjectsTab/ObjectsTab.xaml.cs index 78eefa3462..7082617c94 100644 --- a/Content.Client/Administration/UI/Tabs/ObjectsTab/ObjectsTab.xaml.cs +++ b/Content.Client/Administration/UI/Tabs/ObjectsTab/ObjectsTab.xaml.cs @@ -14,7 +14,6 @@ namespace Content.Client.Administration.UI.Tabs.ObjectsTab; public sealed partial class ObjectsTab : Control { [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly IGameTiming _timing = default!; private readonly Color _altColor = Color.FromHex("#292B38"); private readonly Color _defaultColor = Color.FromHex("#2F2F3B"); diff --git a/Content.Client/Construction/ConstructionSystem.cs b/Content.Client/Construction/ConstructionSystem.cs index 889c992f7f..f909b23423 100644 --- a/Content.Client/Construction/ConstructionSystem.cs +++ b/Content.Client/Construction/ConstructionSystem.cs @@ -26,7 +26,6 @@ public sealed class ConstructionSystem : SharedConstructionSystem { [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ExamineSystemShared _examineSystem = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; diff --git a/Content.Client/Lathe/UI/LatheMenu.xaml.cs b/Content.Client/Lathe/UI/LatheMenu.xaml.cs index 265130d15d..f2f52b67b5 100644 --- a/Content.Client/Lathe/UI/LatheMenu.xaml.cs +++ b/Content.Client/Lathe/UI/LatheMenu.xaml.cs @@ -21,7 +21,6 @@ public sealed partial class LatheMenu : DefaultWindow { [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IResourceCache _resources = default!; private EntityUid _owner; private readonly SpriteSystem _spriteSystem; diff --git a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs index 2c71fa8c40..ac51cdbac5 100644 --- a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs +++ b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs @@ -17,7 +17,6 @@ public sealed partial class VendingMachineMenu : FancyWindow { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly IGameTiming _timing = default!; private readonly Dictionary _dummies = []; diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs index eda9158273..bac2648307 100644 --- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs +++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs @@ -22,8 +22,6 @@ namespace Content.Server.Ame.EntitySystems; public sealed class AmeControllerSystem : EntitySystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly IAdminManager _adminManager = default!; - [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 5358cdb442..88b306c6ad 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -60,7 +60,6 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly StationSystem _stationSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; [Dependency] private readonly ExamineSystemShared _examineSystem = default!; diff --git a/Content.Server/Cluwne/CluwneSystem.cs b/Content.Server/Cluwne/CluwneSystem.cs index 18d82659de..f24f0143f3 100644 --- a/Content.Server/Cluwne/CluwneSystem.cs +++ b/Content.Server/Cluwne/CluwneSystem.cs @@ -29,7 +29,6 @@ public sealed class CluwneSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly AutoEmoteSystem _autoEmote = default!; - [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly NameModifierSystem _nameMod = default!; public override void Initialize() diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index 93ee18f683..87e5887c42 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -16,7 +16,6 @@ namespace Content.Server.Doors.Systems public sealed class FirelockSystem : SharedFirelockSystem { [Dependency] private readonly SharedDoorSystem _doorSystem = default!; - [Dependency] private readonly AtmosAlarmableSystem _atmosAlarmable = default!; [Dependency] private readonly AtmosphereSystem _atmosSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedMapSystem _mapping = default!; diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index e626edeb26..1f15def5ce 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -24,7 +24,6 @@ public sealed partial class DragonSystem : EntitySystem [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; [Dependency] private readonly NpcFactionSystem _faction = default!; [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly RoleSystem _role = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; diff --git a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs index 3594242bcd..d2686ecdcd 100644 --- a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs @@ -13,7 +13,6 @@ public sealed class LoadMapRuleSystem : GameRuleSystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MapSystem _map = default!; [Dependency] private readonly MapLoaderSystem _mapLoader = default!; - [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly GridPreloaderSystem _gridPreloader = default!; diff --git a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs index 8608f250d4..e82cecde36 100644 --- a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs @@ -21,7 +21,6 @@ public sealed class SecretRuleSystem : GameRuleSystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IConfigurationManager _configurationManager = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IComponentFactory _compFact = default!; private string _ruleCompName = default!; diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index faec4a9e9c..074b4c0df7 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -12,10 +12,8 @@ namespace Content.Server.GameTicking.Rules; public sealed class ThiefRuleSystem : GameRuleSystem { - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; - [Dependency] private readonly ObjectivesSystem _objectives = default!; public override void Initialize() { diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 17442da857..a96020d0e3 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -29,7 +29,6 @@ public sealed class TraitorRuleSystem : GameRuleSystem [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly SharedRoleSystem _roleSystem = default!; [Dependency] private readonly SharedJobSystem _jobs = default!; - [Dependency] private readonly ObjectivesSystem _objectives = default!; public override void Initialize() { diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs index 6814b596dc..f74dd7fb13 100644 --- a/Content.Server/Instruments/InstrumentSystem.cs +++ b/Content.Server/Instruments/InstrumentSystem.cs @@ -30,7 +30,6 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem [Dependency] private readonly UserInterfaceSystem _bui = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly TransformSystem _transform = default!; - [Dependency] private readonly InteractionSystem _interactions = default!; [Dependency] private readonly ExamineSystemShared _examineSystem = default!; private const float MaxInstrumentBandRange = 10f; diff --git a/Content.Server/Medical/DefibrillatorSystem.cs b/Content.Server/Medical/DefibrillatorSystem.cs index 1896f51edd..b6b50d4215 100644 --- a/Content.Server/Medical/DefibrillatorSystem.cs +++ b/Content.Server/Medical/DefibrillatorSystem.cs @@ -46,7 +46,6 @@ public sealed class DefibrillatorSystem : EntitySystem [Dependency] private readonly PowerCellSystem _powerCell = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly SharedMindSystem _mind = default!; /// diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index 28ab633227..1ece045774 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -32,10 +32,7 @@ public sealed class SpaceNinjaSystem : SharedSpaceNinjaSystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly CodeConditionSystem _codeCondition = default!; - [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!; - [Dependency] private readonly RoleSystem _role = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _mind = default!; public override void Initialize() diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index f5d434090e..ac3df5868f 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -17,7 +17,6 @@ public sealed class SliceableFoodSystem : EntitySystem { [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly TransformSystem _xformSystem = default!; public override void Initialize() diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index 09956e313f..ea6f0ad3f4 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -35,7 +35,6 @@ public sealed class PlayTimeTrackingSystem : EntitySystem [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly PlayTimeTrackingManager _tracking = default!; [Dependency] private readonly IAdminManager _adminManager = default!; - [Dependency] private readonly SharedRoleSystem _role = default!; public override void Initialize() { diff --git a/Content.Server/Power/EntitySystems/PowerNetSystem.cs b/Content.Server/Power/EntitySystems/PowerNetSystem.cs index 6c35ba2008..a7098649ce 100644 --- a/Content.Server/Power/EntitySystems/PowerNetSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerNetSystem.cs @@ -22,7 +22,6 @@ public sealed class PowerNetSystem : EntitySystem [Dependency] private readonly PowerNetConnectorSystem _powerNetConnector = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IParallelManager _parMan = default!; - [Dependency] private readonly PowerReceiverSystem _powerReceiver = default!; private readonly PowerState _powerState = new(); private readonly HashSet _powerNetReconnectQueue = new(); diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 51520f0464..191d3fc4bd 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -21,7 +21,6 @@ public sealed class PowerReceiverSystem : SharedPowerReceiverSystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IAdminManager _adminManager = default!; - [Dependency] private readonly AppearanceSystem _appearance = default!; [Dependency] private readonly AudioSystem _audio = default!; private EntityQuery _recQuery; private EntityQuery _provQuery; diff --git a/Content.Server/Procedural/DungeonSystem.cs b/Content.Server/Procedural/DungeonSystem.cs index b73e843fff..9a7abb7e33 100644 --- a/Content.Server/Procedural/DungeonSystem.cs +++ b/Content.Server/Procedural/DungeonSystem.cs @@ -33,7 +33,6 @@ public sealed partial class DungeonSystem : SharedDungeonSystem [Dependency] private readonly AnchorableSystem _anchorable = default!; [Dependency] private readonly DecalSystem _decals = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly MapLoaderSystem _loader = default!; [Dependency] private readonly SharedMapSystem _maps = default!; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index 1c40e9489e..3f32afbffb 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -40,7 +40,6 @@ public sealed partial class BorgSystem : SharedBorgSystem [Dependency] private readonly IBanManager _banManager = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SharedAccessSystem _access = default!; [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!; diff --git a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs index e145e233e9..8a918bd2fd 100644 --- a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs +++ b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs @@ -17,7 +17,6 @@ public sealed partial class StationJobsSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IBanManager _banManager = default!; - [Dependency] private readonly PlayTimeTrackingSystem _playTime = default!; private Dictionary> _jobsByWeight = default!; private List _orderedWeights = default!; diff --git a/Content.Server/Station/Systems/StationSystem.cs b/Content.Server/Station/Systems/StationSystem.cs index 84e44b6469..5930eef39b 100644 --- a/Content.Server/Station/Systems/StationSystem.cs +++ b/Content.Server/Station/Systems/StationSystem.cs @@ -27,10 +27,8 @@ namespace Content.Server.Station.Systems; [PublicAPI] public sealed class StationSystem : EntitySystem { - [Dependency] private readonly IConfigurationManager _cfgManager = default!; [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IPlayerManager _player = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly GameTicker _ticker = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index f41512b6ac..3bd540a304 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -11,7 +11,6 @@ namespace Content.Server.Traits; public sealed class TraitSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly ISerializationManager _serializationManager = default!; [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 013348eb4f..ca6bd1dcc2 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -25,7 +25,6 @@ public abstract class SharedActionsSystem : EntitySystem [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; diff --git a/Content.Shared/Beeper/Systems/ProximityBeeperSystem.cs b/Content.Shared/Beeper/Systems/ProximityBeeperSystem.cs index ed3c6366c1..9830e165e5 100644 --- a/Content.Shared/Beeper/Systems/ProximityBeeperSystem.cs +++ b/Content.Shared/Beeper/Systems/ProximityBeeperSystem.cs @@ -12,8 +12,6 @@ namespace Content.Shared.Beeper.Systems; /// public sealed class ProximityBeeperSystem : EntitySystem { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly ProximityDetectionSystem _proximity = default!; [Dependency] private readonly BeeperSystem _beeper = default!; /// diff --git a/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs b/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs index c1efe0b3dd..897f379156 100644 --- a/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs +++ b/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs @@ -14,13 +14,10 @@ namespace Content.Shared.Clothing; public sealed class ClothingSpeedModifierSystem : EntitySystem { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly ClothingSpeedModifierSystem _clothingSpeedModifier = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; [Dependency] private readonly ItemToggleSystem _toggle = default!; - [Dependency] private readonly SharedPowerCellSystem _powerCell = default!; public override void Initialize() { diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index f563440af0..557c316e26 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -43,7 +43,6 @@ public sealed class PullingSystem : EntitySystem [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly HeldSpeedModifierSystem _clothingMoveSpeed = default!; public override void Initialize() diff --git a/Content.Shared/Ninja/Systems/DashAbilitySystem.cs b/Content.Shared/Ninja/Systems/DashAbilitySystem.cs index 1385219e47..09be108505 100644 --- a/Content.Shared/Ninja/Systems/DashAbilitySystem.cs +++ b/Content.Shared/Ninja/Systems/DashAbilitySystem.cs @@ -18,7 +18,6 @@ public sealed class DashAbilitySystem : EntitySystem { [Dependency] private readonly ActionContainerSystem _actionContainer = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedChargesSystem _charges = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; From 6d18dff33de3e94ebcfaa00a7b89243bf5110f84 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Thu, 18 Jul 2024 18:08:52 -0700 Subject: [PATCH 116/118] Fix for thrown items dealing damage twice to first target (#30115) * FUCK YOU * fine --------- Co-authored-by: plykiya --- .../Damage/Systems/DamageOtherOnHitSystem.cs | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs index ff4d1cabe9..8a7b3df0b2 100644 --- a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs +++ b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs @@ -32,31 +32,25 @@ public override void Initialize() private void OnDoHit(EntityUid uid, DamageOtherOnHitComponent component, ThrowDoHitEvent args) { - if (!TerminatingOrDeleted(args.Target)) - { - var dmg = _damageable.TryChangeDamage(args.Target, component.Damage, component.IgnoreResistances, origin: args.Component.Thrower); + if (TerminatingOrDeleted(args.Target)) + return; - // Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying. - if (dmg != null && HasComp(args.Target)) - _adminLogger.Add(LogType.ThrowHit, $"{ToPrettyString(args.Target):target} received {dmg.GetTotal():damage} damage from collision"); + var dmg = _damageable.TryChangeDamage(args.Target, component.Damage, component.IgnoreResistances, origin: args.Component.Thrower); - if (dmg is { Empty: false }) - { - _color.RaiseEffect(Color.Red, new List() { args.Target }, Filter.Pvs(args.Target, entityManager: EntityManager)); - } + // Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying. + if (dmg != null && HasComp(args.Target)) + _adminLogger.Add(LogType.ThrowHit, $"{ToPrettyString(args.Target):target} received {dmg.GetTotal():damage} damage from collision"); - _guns.PlayImpactSound(args.Target, dmg, null, false); - if (TryComp(uid, out var body) && body.LinearVelocity.LengthSquared() > 0f) - { - var direction = body.LinearVelocity.Normalized(); - _sharedCameraRecoil.KickCamera(args.Target, direction); - } + if (dmg is { Empty: false }) + { + _color.RaiseEffect(Color.Red, new List() { args.Target }, Filter.Pvs(args.Target, entityManager: EntityManager)); } - // TODO: If more stuff touches this then handle it after. - if (TryComp(uid, out var physics)) + _guns.PlayImpactSound(args.Target, dmg, null, false); + if (TryComp(uid, out var body) && body.LinearVelocity.LengthSquared() > 0f) { - _thrownItem.LandComponent(args.Thrown, args.Component, physics, false); + var direction = body.LinearVelocity.Normalized(); + _sharedCameraRecoil.KickCamera(args.Target, direction); } } From 56ee4da5352d94e45bfe45977a2ac05a16785430 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 19 Jul 2024 01:10:01 +0000 Subject: [PATCH 117/118] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6f0ba27d30..74a116880f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Beck Thompson - changes: - - message: Radio jammer now has 3 selectable power operating levels and a battery - level led indicator! - type: Tweak - 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. @@ -3805,3 +3797,11 @@ id: 6933 time: '2024-07-18T22:36:53.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30095 +- author: Plykiya + changes: + - message: You no longer deal double damage to your first target when throwing an + item. + type: Fix + id: 6934 + time: '2024-07-19T01:08:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30115 From 6005a9f4cb9604a6c8cb5621746df7e078c12fbd Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:19:15 +1000 Subject: [PATCH 118/118] Fix door access in mapping mode (#30030) Fix shouldn't break anythingTM. --- .../DeviceNetwork/Systems/NetworkConfiguratorSystem.cs | 4 ++-- Content.Shared/Access/Systems/AccessReaderSystem.cs | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 402d005dd4..59b58c6933 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -423,11 +423,11 @@ private void OpenDeviceLinkUi(EntityUid configuratorUid, EntityUid? targetUid, E if (Delay(configurator)) return; - if (!targetUid.HasValue || !configurator.ActiveDeviceLink.HasValue || !TryComp(userUid, out ActorComponent? actor) || !AccessCheck(targetUid.Value, userUid, configurator)) + if (!targetUid.HasValue || !configurator.ActiveDeviceLink.HasValue || !AccessCheck(targetUid.Value, userUid, configurator)) return; - _uiSystem.OpenUi(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession); + _uiSystem.OpenUi(configuratorUid, NetworkConfiguratorUiKey.Link, userUid); configurator.DeviceLinkTarget = targetUid; diff --git a/Content.Shared/Access/Systems/AccessReaderSystem.cs b/Content.Shared/Access/Systems/AccessReaderSystem.cs index 5d1932a959..2e0737c6ab 100644 --- a/Content.Shared/Access/Systems/AccessReaderSystem.cs +++ b/Content.Shared/Access/Systems/AccessReaderSystem.cs @@ -155,7 +155,12 @@ public bool IsAllowed( return IsAllowedInternal(access, stationKeys, reader); if (!_containerSystem.TryGetContainer(target, reader.ContainerAccessProvider, out var container)) - return Paused(target); // when mapping, containers with electronics arent spawned + return false; + + // If entity is paused then always allow it at this point. + // Door electronics is kind of a mess but yeah, it should only be an unpaused ent interacting with it + if (Paused(target)) + return true; foreach (var entity in container.ContainedEntities) {