From 17ebf2a3ce6a64febf1380e78945ed321c11711c Mon Sep 17 00:00:00 2001 From: EnDecc <33369477+Endecc@users.noreply.github.com> Date: Mon, 21 Aug 2023 14:16:20 -0400 Subject: [PATCH 01/28] Cargo crate fixes (#19401) * locale additions, icon tweaks * soda count for consistency --- .../prototypes/catalog/cargo/cargo-food.ftl | 9 +++ .../catalog/fills/crates/food-crates.ftl | 11 ++- .../Prototypes/Catalog/Cargo/cargo_food.yml | 6 +- .../Prototypes/Catalog/Fills/Crates/food.yml | 72 +++++++++---------- 4 files changed, 58 insertions(+), 40 deletions(-) diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl index 78f3c279ae..74405b719f 100644 --- a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl @@ -1,6 +1,9 @@ ent-FoodPizza = { ent-CrateFoodPizza } .desc = { ent-CrateFoodPizza.desc } +ent-FoodPizzaLarge = { ent-CrateFoodPizzaLarge } + .desc = { ent-CrateFoodPizzaLarge.desc } + ent-FoodMRE = { ent-CrateFoodMRE } .desc = { ent-CrateFoodMRE.desc } @@ -12,3 +15,9 @@ ent-FoodDinnerware = { ent-CrateFoodDinnerware } ent-FoodBarSupply = { ent-CrateFoodBarSupply } .desc = { ent-CrateFoodBarSupply.desc } + +ent-FoodSoftdrinks = { ent-CrateFoodSoftdrinks } + .desc = { ent-CrateFoodSoftdrinks.desc } + +ent-FoodSoftdrinksLarge = { ent-CrateFoodSoftdrinksLarge } + .desc = { ent-CrateFoodSoftdrinksLarge.desc } diff --git a/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl b/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl index de1accdeae..b9f67862f2 100644 --- a/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl @@ -1,5 +1,8 @@ ent-CrateFoodPizza = Emergency pizza delivery - .desc = Help do your part to end station hunger by distributing pizza to underfunded departments! + .desc = Help do your part to end station hunger by distributing pizza to underfunded departments! Includes 4 pizzas. + +ent-CrateFoodPizzaLarge = Disaster pizza delivery + .desc = In the ultimate event that all else has failed, Find comfort in that more pizza solves everything. Includes 16 pizzas. ent-CrateFoodMRE = MRE crate .desc = A military style meal fit to feed a whole department. @@ -12,3 +15,9 @@ ent-CrateFoodDinnerware = Kitchen dinnerware crate ent-CrateFoodBarSupply = Bartending supplies crate .desc = Extra Bar supplies, in case the clown was allowed in the bar unsupervised. + +ent-CrateFoodSoftdrinks = Softdrinks crate + .desc = A variety of sodas to complement a small party, without having to empty the soda machines. Includes 14 sodas. + +ent-CrateFoodSoftdrinksLarge = Softdrinks bulk crate + .desc = Lots of sodas taken straight out of Centcomm's own vending machines, because you just can't leave your department. Includes 28 sodas. diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index c38535bb56..e506995929 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -2,7 +2,7 @@ id: FoodPizza icon: sprite: Objects/Consumable/Food/Baked/pizza.rsi - state: margherita + state: margherita-slice product: CrateFoodPizza cost: 450 category: Food @@ -61,7 +61,7 @@ - type: cargoProduct id: FoodSoftdrinks icon: - sprite: Objects/Consumable/Drinks/beerglass.rsi + sprite: Objects/Consumable/Drinks/cola.rsi state: icon product: CrateFoodSoftdrinks cost: 1200 @@ -71,7 +71,7 @@ - type: cargoProduct id: FoodSoftdrinksLarge icon: - sprite: Objects/Consumable/Drinks/beerglass.rsi + sprite: Objects/Consumable/Drinks/colabottle.rsi state: icon product: CrateFoodSoftdrinksLarge cost: 2400 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/food.yml b/Resources/Prototypes/Catalog/Fills/Crates/food.yml index 5813521424..215ce59856 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/food.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/food.yml @@ -14,14 +14,14 @@ id: CrateFoodPizzaLarge parent: CratePlastic components: - - type: StorageFill - contents: - - id: FoodBoxPizzaFilled - amount: 16 - - id: KnifePlastic - amount: 4 - - id: LidSalami - prob: 0.04 + - type: StorageFill + contents: + - id: FoodBoxPizzaFilled + amount: 16 + - id: KnifePlastic + amount: 4 + - id: LidSalami + prob: 0.04 - type: entity id: CrateFoodMRE @@ -109,37 +109,37 @@ id: CrateFoodSoftdrinks parent: CratePlastic components: - - type: StorageFill - contents: - - id: DrinkColaCan - amount: 4 - - id: DrinkGrapeCan - amount: 2 - - id: DrinkRootBeerCan - amount: 2 - - id: DrinkIcedTeaCan - amount: 2 - - id: DrinkLemonLimeCan - amount: 2 - - id: DrinkFourteenLokoCan - amount: 2 + - type: StorageFill + contents: + - id: DrinkColaCan + amount: 4 + - id: DrinkGrapeCan + amount: 2 + - id: DrinkRootBeerCan + amount: 2 + - id: DrinkIcedTeaCan + amount: 2 + - id: DrinkLemonLimeCan + amount: 2 + - id: DrinkFourteenLokoCan + amount: 2 - type: entity id: CrateFoodSoftdrinksLarge parent: CratePlastic components: - - type: StorageFill - contents: - - id: DrinkColaCan - amount: 8 - - id: DrinkGrapeCan - amount: 4 - - id: DrinkRootBeerCan - amount: 4 - - id: DrinkIcedTeaCan - amount: 4 - - id: DrinkLemonLimeCan - amount: 4 - - id: DrinkFourteenLokoCan - amount: 4 + - type: StorageFill + contents: + - id: DrinkColaCan + amount: 8 + - id: DrinkGrapeCan + amount: 4 + - id: DrinkRootBeerCan + amount: 4 + - id: DrinkIcedTeaCan + amount: 4 + - id: DrinkLemonLimeCan + amount: 4 + - id: DrinkFourteenLokoCan + amount: 4 From 216dea9b26ae2c5aa9aafd072dc2ec81103fc006 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 14:17:35 -0400 Subject: [PATCH 02/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 53db662c22..58d75d8880 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: TemporalOroboros - changes: - - {message: The AME controller increases and decreases in steps of 2 again., type: Tweak} - id: 4146 - time: '2023-06-30T23:24:23.0000000+00:00' - author: Nairodian changes: - {message: MRP rules updated., type: Tweak} @@ -3029,3 +3024,11 @@ Entries: - {message: Changed salvage and QM locker contents, type: Tweak} id: 4645 time: '2023-08-21T01:04:43.0000000+00:00' +- author: EnDecc + changes: + - {message: 'Three "plastic crates" in cargo have now been given appropriate labels, + after Centcomm forgot to use tape on them. Disaster pizza crate, Softdrinks + crate, and Softdrinks bulk crate will now show up in orders appropriately.', + type: Fix} + id: 4646 + time: '2023-08-21T18:16:21.0000000+00:00' From 109222e5d576fe37ed2a7d2e82997afeb4bc61dd Mon Sep 17 00:00:00 2001 From: PixelTK <85175107+PixelTheKermit@users.noreply.github.com> Date: Mon, 21 Aug 2023 19:18:57 +0100 Subject: [PATCH 03/28] unhardcode the stun time (#19396) --- Content.Shared/Damage/Components/StaminaComponent.cs | 6 ++++++ Content.Shared/Damage/Systems/StaminaSystem.cs | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Damage/Components/StaminaComponent.cs b/Content.Shared/Damage/Components/StaminaComponent.cs index f75d4ec2fc..9f745c9df1 100644 --- a/Content.Shared/Damage/Components/StaminaComponent.cs +++ b/Content.Shared/Damage/Components/StaminaComponent.cs @@ -39,6 +39,12 @@ public sealed class StaminaComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("critThreshold")] public float CritThreshold = 100f; + /// + /// How long will this mob be stunned for? + /// + [ViewVariables(VVAccess.ReadWrite), DataField("stunTime")] + public TimeSpan StunTime = TimeSpan.FromSeconds(6); + /// /// To avoid continuously updating our data we track the last time we updated so we can extrapolate our current stamina. /// diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 31abbf039c..7bf2941dac 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -394,11 +394,10 @@ public sealed partial class StaminaSystem : EntitySystem component.Critical = true; component.StaminaDamage = component.CritThreshold; - var stunTime = TimeSpan.FromSeconds(6); - _stunSystem.TryParalyze(uid, stunTime, true); + _stunSystem.TryParalyze(uid, component.StunTime, true); // Give them buffer before being able to be re-stunned - component.NextUpdate = _timing.CurTime + stunTime + StamCritBufferTime; + component.NextUpdate = _timing.CurTime + component.StunTime + StamCritBufferTime; EnsureComp(uid); Dirty(component); _adminLogger.Add(LogType.Stamina, LogImpact.Medium, $"{ToPrettyString(uid):user} entered stamina crit"); From cf68d38aaf9f35c650ad355e36b501a26ebd612d Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Mon, 21 Aug 2023 18:27:08 +0000 Subject: [PATCH 04/28] Dead mobs can no longer shoot guns (#19020) * dead shooting hotfix * dead shooting hotfix weh * AttemptShoot check * actionblocker check --------- Co-authored-by: Errant <35878406+errant@users.noreply.github.com> --- Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index bc64985544..1e6a5c50e9 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.ActionBlocker; using Content.Shared.Actions; using Content.Shared.Administration.Logs; using Content.Shared.Audio; @@ -33,6 +34,7 @@ namespace Content.Shared.Weapons.Ranged.Systems; public abstract partial class SharedGunSystem : EntitySystem { + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] protected readonly IMapManager MapManager = default!; [Dependency] private readonly INetManager _netManager = default!; @@ -208,7 +210,8 @@ public abstract partial class SharedGunSystem : EntitySystem private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) { - if (gun.FireRate <= 0f) + if (gun.FireRate <= 0f || + !_actionBlockerSystem.CanUseHeldEntity(user)) return; var toCoordinates = gun.ShootCoordinates; From 26be26b2b09b10c15865d5476c66ff52ecf2215b Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 14:28:12 -0400 Subject: [PATCH 05/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 58d75d8880..741319913c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: Nairodian - changes: - - {message: MRP rules updated., type: Tweak} - id: 4147 - time: '2023-07-01T00:15:04.0000000+00:00' - author: Lank changes: - {message: 'The Cargo Telepad has been significantly improved, teleporting orders @@ -3032,3 +3027,9 @@ Entries: type: Fix} id: 4646 time: '2023-08-21T18:16:21.0000000+00:00' +- author: Errant-4 + changes: + - {message: 'Crit/Dead people that somehow end up holding a gun can no longer fire + them. The Gundead aren''t real, they can''t hurt you.', type: Fix} + id: 4647 + time: '2023-08-21T18:27:08.0000000+00:00' From cc00c94a208989340f2c000f3ca6288480fd71be Mon Sep 17 00:00:00 2001 From: SpaceCat <99134830+Verslebas@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:35:30 +0500 Subject: [PATCH 06/28] Corrects aghost's hand placement (#19403) --- Resources/Prototypes/Body/Prototypes/a_ghost.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Body/Prototypes/a_ghost.yml b/Resources/Prototypes/Body/Prototypes/a_ghost.yml index f04ed70197..3a8a615ffe 100644 --- a/Resources/Prototypes/Body/Prototypes/a_ghost.yml +++ b/Resources/Prototypes/Body/Prototypes/a_ghost.yml @@ -6,8 +6,8 @@ torso: part: TorsoHuman connections: - - right arm - left arm + - right arm right arm: part: RightArmHuman connections: From 10c0d5bcc180f4e067fe36590675c92237c67112 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 14:36:34 -0400 Subject: [PATCH 07/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 741319913c..118c32992f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Lank - changes: - - {message: 'The Cargo Telepad has been significantly improved, teleporting orders - over 4x faster.', type: Tweak} - id: 4148 - time: '2023-07-01T19:00:33.0000000+00:00' - author: Dygon changes: - {message: Windoors can now be bolted through the network system., type: Tweak} @@ -3033,3 +3027,8 @@ Entries: them. The Gundead aren''t real, they can''t hurt you.', type: Fix} id: 4647 time: '2023-08-21T18:27:08.0000000+00:00' +- author: Verslebas + changes: + - {message: Changed admin ghost's hands order, type: Tweak} + id: 4648 + time: '2023-08-21T18:35:30.0000000+00:00' From 4761e8679c8cc47c2810d150e3165ec4553d1340 Mon Sep 17 00:00:00 2001 From: potato1234_x <79580518+potato1234x@users.noreply.github.com> Date: Tue, 22 Aug 2023 04:45:53 +1000 Subject: [PATCH 08/28] Vending machine sprite polish (#19210) * g * chefvend --- .../VendingMachines/chefvend.rsi/broken.png | Bin 930 -> 534 bytes .../chefvend.rsi/eject-unshaded.png | Bin 1041 -> 452 bytes .../VendingMachines/chefvend.rsi/meta.json | 24 +++++------------- .../chefvend.rsi/normal-unshaded.png | Bin 1548 -> 1216 bytes .../VendingMachines/chefvend.rsi/off.png | Bin 555 -> 383 bytes .../VendingMachines/cigs.rsi/broken.png | Bin 817 -> 534 bytes .../VendingMachines/cigs.rsi/meta.json | 2 +- .../Machines/VendingMachines/cigs.rsi/off.png | Bin 498 -> 415 bytes .../VendingMachines/coffee.rsi/broken.png | Bin 930 -> 476 bytes .../VendingMachines/coffee.rsi/hellfire.png | Bin 1693 -> 0 bytes .../VendingMachines/coffee.rsi/meta.json | 12 +-------- .../VendingMachines/coffee.rsi/off.png | Bin 519 -> 390 bytes .../VendingMachines/discount.rsi/broken.png | Bin 1512 -> 882 bytes .../discount.rsi/deny-unshaded.png | Bin 1736 -> 779 bytes .../discount.rsi/eject-unshaded.png | Bin 1421 -> 855 bytes .../VendingMachines/discount.rsi/meta.json | 2 +- .../discount.rsi/normal-unshaded.png | Bin 1662 -> 1052 bytes .../VendingMachines/discount.rsi/off.png | Bin 990 -> 750 bytes .../VendingMachines/discount.rsi/panel.png | Bin 694 -> 244 bytes .../VendingMachines/mining.rsi/broken.png | Bin 516 -> 563 bytes .../VendingMachines/mining.rsi/off.png | Bin 665 -> 469 bytes .../VendingMachines/snack.rsi/meta.json | 2 +- .../VendingMachines/snack.rsi/off.png | Bin 447 -> 365 bytes 23 files changed, 11 insertions(+), 31 deletions(-) delete mode 100644 Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/hellfire.png diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/broken.png index b5259b9fb02a3013106702489286a7f13e83ef40..37cfa72c9870095350fd04fc689918ac44c2680c 100644 GIT binary patch literal 534 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijQ0(?STgWUsw%sV%)o<6qEkBOH2^&#?CIhdV&Pvq zxv{84fyX6qOXzxbNAFv4)xZAN-{gJJ!*uVQ!xfupETOqds#yz?eO6j*k9y5_X_tTC zcJ&9j>{WO7hc~1h2)4O$S8jJ+hEo>%Bdxh%@ys0J2P}Gmt$meE9x`oDf6%5XKfz*2 zg*8)o@I~7tLJ2Q5njgO5G%#`ZR9P(coQwU5o$bc|OaWFAvuroBe>uyrrbzXGarLj6 zkqxVujgy%Z7^cl)7Vziq$r69$@F8JQ#NnXZO*RXTzweg1p!%OPV722njw`9+Hyo-a z2y?6dJR|#LPFnxxU9Xh(a&Wq>6tXyF5ze44sr;FnebReX{Y!20HBWGDc*dtSgIzP~ sx{$@mS?O`k>tt4FEm101nfsevF5dfqEALr%V3;v@y85}Sb4q9e0O4ZR{{R30 delta 919 zcmV;I18Dq~1fmC!8Gi-<0047(dh`GQ18GS_K~z{ry_Zc$R8bVikD}QoD+xr@ah!^Z za0G2?+Vq8GP@@tE(Mlv#5ZVYrvoJDL5Nr_$Dk3gg1a8zp$PX;rG&ML2EhvO>@Pi=` zDhUbR{&HyETxKA&MOxgQ;ULqmFh+rw5`o_|kj0Co+a{VzaWb+wof z&S9|t0LNqG{x-J;FlPc_Yto}f9T^oz%wfVIAUSfmKfUZWEzSEBGoY1VYbp$|SHyA+ z{te*L02DKjuYUn-D+0(s#tfJMuxJ`MxV^2QAb{TTBzElo`W zdD^@sB_#%jiN5&#ep(5$8Z72A1i;AbEbVN5r__wY%D(wKh_be+iJVR+RhE{j1Hf~G z_95Gj%|@w#fB|T;s*W;-`$+EV(cob#Z_iQd(?YQ_lz#!T|2R9_+C$&IuIWyfM+PXr zvX%miOJpmwh<3DX*~`THk)y}xV@m@8;?mVH{F_&^$pMg^V`4azouf?#kW;0c0cZf} zM+P9E^tmY!B|GNGkqtn=@GJxH?rEw70Pxh;(~Hb(I*^$grpWZ=_Uz&wCl0yu^P79d9q9RPs)P!3mC z7P)$R4XeeJ22g@v#r-G^?ByIF*uZ!dw7Z{BaAD5;GDIW*m>=wLGLSS4un6VIdHJEuT3A5#lYdqkotPnr@b1PJ0g%u>5V;C4F+dPC z3}TA}L%R%+@IJsAz)r|YmsbHFSSS(i0~mK_#V<0DlzqUnzAowyCx{wL5_R^z_UO+H z$Xl_j0n=vzmjEJ!GdAZHmkuMh;Thx5&j1N&0Ebb}^L`q8&}>-G@x0u6)){q-EAImU zfPcx?>v){=7;Ive@+$GVG(Jor?N|9iBHsm6ob!F)#?5l^*~H6n_2ZaN!onNdC=Q}XQ!W7mAdQ$f9s?-S%>evA!Rz%>hX(dvOTc>o?u0N?0Agur^k!_J tt4mx+*^~jyINk4?xJ$6#M9J*`4VH^eKM)_FX378n002ovPDHLkV1hdrs9692 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/eject-unshaded.png index 0df1b9c0d61373e7286cecc3f4642c527a6174b5..4b3c9aa8aa0f01e70d11e582fecefd5c4494aeb7 100644 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Nn{1`IRkt`T=fFd_%)4yJmIZhlYkU+NswRg|NjivPw@iPGH@1nL>4nJ@ErzW z#^d=bQh^Q96+$>YqsCYT&|Hj|=u-h}mNMzIdd0&9kR(Z_oM{)QyZ^=o|Dm-TCsXVT55C<`jB?JA`^L3Nlq-T#&9R7a) mx#o8VuF2l`^`80tcm1w#t?3L--3Nf7%HZkh=d#Wzp$Py|jJ9O} literal 1041 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV7}q$;uum9_jayf-V{e3H}mZa z9|@RQ>{(R& zDSIoE`Rdi%e@tf3X?I{?N!ZDB`t)^1RN9@r;_I`!mzPTY{q>Re@jjDhzqfA}fB*mM z@5fia{r~Xt^U>e-ckXY!DKA_b)?k1CXOGEs5eJ51#y|B8=VTscGX>N#EoatXFz8;! z+`(YcT&z3eozqPQC5Fqo8+I{X{jJP!lVuVE(~Q>+?d(8p_H5h@(+_;+s^C1cH9@NJ zCSM2N1D-fO2eZZ!CKdy6hmwXYhE?C^^DSVg;8YPVtKG!(f?;y^_HC2TAKLD`fLTW! zmoLzLh0b?p|KJ<hlbpon8Sul+#P;CfRgOPaNU6@%)Fs(eFoE3M@|GdxdOw3tz4(4v2Ns3d4p|Kh z&+NSIZ5XaHq@7Q&Vz{Xs!LWcCUq6kdp%j z#a@EHg>HyM%^#W4X>g2Rb22bKepdt?}tu6(`6wSf7H-uXA4 zjEoAcZR@!Yd|(T%WOCr*jTdit$h+(lOM{5iK0SuR(mqc)88l65Vj0@ZXPgpd2+H`e zi-9NKV5&O9k_#V7871x|X!$dEEPVKy$zadHka-LfoDN@SO{i#IX~UxM+gD0;M{T`) z>n|TrycF|L zFWAMrh&hBgVDJADb`gdRz{CMc$`jliOc`zh1K_f50K>Fs1xACrj29U_6s}imD=_T+ mEq*SJ;gHZbK4RD(r2XbJu5;P;emXF#GkCiCxvXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1XW2yK~#8N?c85XTU8tf@ZY`A@~4H?Lg^euMN22bR)-EZHYa;f z5}n3mAu;;krc4uOmbfK8so;ZIM5AU8`}1IedoUU_IySc{;(u81!4!lHH@YDYi~!?r zOaI;ezsGyonTd~duIYvEC%HNOo%6d%dw=ac_a^t000000000000J7QMS9ZSUaUZ|t z?m6mqxg0gT8}6p&=4Snq+g$ad1II^Y-vxGii_V;h?%Dm+^E^#+1m0$?wzf90`~0`{ z=Q`i-E-JDZlz*<}_sp0~a>7q66(PyzNz^u-TsJux@Ty~4lJy0!+wGR?zkfPYP;AnX zAP|$|lu8DPCBhW-4^tvCP06^A9%~*botg?R^4&B;EsgBH~C=2a5 zIJ~o^rDchyYf27pvzE%alJttC|U@L!|#01*E(=D;N~fCx2ab{7K^30w6wH{ zcL4wZ0Dk}g0000000000006-1Q{`~T{3T?Zjh>(*#Fksgur?CuO*%teN&#L{S~XrH zY&M(W!s&K4GT6b+|M)pmV?LBYb}A50iG#WmIwrm=4yrL9S@pjE`a|ZO?q1#`-vB%N z!?8Pl9(Bdv-bP1bqWx%%?)1rx)PAl;r^b9}Re!5-I(IzmwDX848u5|Y7$&Fl!5zFS zEh{d7$K%O!UT4zdbz7;le7&T`d}vkMx3{tH9*dPnw^USA(p&p?_wg_-D=t8Fb#*LM zm|J+oRYvnpbDmCj=W~>1!iYw!|wheIpDvw5NB~=jwU7pvf97g zk*1ZekZDpbKR40=iYj*j0a_#j9itJYZw(lqjDH-L#`n+6Ot9ZB_APaMbJ^lva%)ZRsshvM6W%Tz^VXl62&yN!|+p0000000000000000002M zY2u%AZ>zKy*T49j<49g^%AnKb$o<1}T}36^KI!c2%<#ie{~yg1K>f$u*27yaZK`!_ zj)WG-P?%2(^Rv?1t(O|6roxwbn&xO`b<3s=`d6Rc<$BasRzl84wv*9hrLQ{wI)Bm7 z5Wd1wG)XfB*s*2Z%Vx7h=oz_5KTjLzk9jj~-CWi*G~~$TDVn620*JWa4^%v4dWJ+nB$>%qN4;J5J|@tp>8l_B0000000013D~SF92dtfqa@c*k00000 LNkvXXu0mjfN`gHn literal 1548 zcmb7Edpy$#0N>M%HE*erk}PA{rZ$YI_xt_-`%0zL+)!F*Ef5HVa^Jp{v7pSqfY4ar zeqQ`~5C|@H-@4iRc)*z82;KXjsVLX!`O2pdv1MKH;sNv%Ne*TmKJg~HB9|- zQCTA=eeQ}xFq|4+FyB)bMK3rpeE< z&mR#k>=Y<eFgsUE!oSe5(vt`Cn0PQE&Zx)7=&YDNBz3<>U zzX?RB9SLGa_RrM`rR^U_6DlyUw50~w(+N{&+YqP0dKnqO=og0>cAyExQQl$w6!DC@ zVy)yhxlx1~o^_a>*9!ulZ|RMrX2R-wFXX9U$vxUnsf0y=5-m z7sXss&Q1dqA-lDSjDPN+OpKJRtZzFF6zb;#CMDlWkt3|?1}0U|MQ1Sjmv5&-N!1uw zihXWQPWXlg_(wQPFZ42t4iUwPG4L>=ro zE&((sF1sKaXbs^U4oFr%vfJ~Yk?0z%NFUO;3krrbk9UI>J9_}@e>Z7_a5Z&X;-Ejw zGpYz|@Z!)+a)-5^VzYF-AHq;B>FhTib-|cU`$!ED#&}E~NZ)pVaMQxr^;V-3FBK9h z7kGHduvjcHms9uHF>+K8TKhUl_`H`)F-@nn&osk$x@*QR(d4JplP`tzdjC}+kAJak zcMT2m4{O){Bp$^&?MOdomh|j4day0PT;wHi31zZatgWT0z2EE2UAk(VKZLt7f=~MR zTvp$n82erm)!*ErV-!(jMmp)Q*d`&7n4h2N+$7rvZZNM%Fb97`n<*`KA8He1#WZ&^ zDsSYQ5BVOps)#;EOkl}ukQ1?bMn*j*ikMnu#LP~=+9Epl#>>2D=!B&2*76xqan(cQ zkc7<<5m%v=o%i9-l4mOQmUG<7fNv~Eb}{92$B0U++z<_$GSjVbp)4Jd8vsVj? z);y5aB~P3ym{7mbk-OqkgCV$=2ejoeP*s6Z2-B59)z#mhk|jFB*|$1MHhurKw^W(+ zE4eSfBCEF8cf_;ZiL1GNbDA2Jr?qb!@vUHS;L3g9?J#pV+{5YjK{-4?*=F$CaWf2p zcmj;b;oMDIV9juZa6E5be__8N$?*TvjlXUE2gM4ALv1Gs55C|>_L6Wb4G$28KlP!@ zE(tL-w%d29ke^8O*agYV%nYuMIzBlK4U}yl_g#5#B)8pC-~C@r0@vU znbtY%GplOwL+rm~YiF%ln!e+0`N*AkR17E5wte_c24DYf#8^|IFHVx}uZ}}r&$tSx z?EH`2@XSpd;2*V7glH}6VWY2O!ElpGTD|(!r1*+JUtUTjY)c_rs}#Pe+g%6$qS*x!JF;g&`38&9Pri}`LB2Ur(?lj4m4fb7#%A+ RqFi`+kh?2wYv~qd@}Hk+%!dE~ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/off.png index 0b9062cc62bae0852066a5eb8004ee0031f147fa..1935d262daf8d16a0d3055b1e5f992583425732d 100644 GIT binary patch delta 367 zcmZ3@@}FsfWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$h5fKP~P zuzLWIdFSTU)5rGtF)_u9N)~Dvy?gi0n1R9H(aqV!a>Lq{Q>RWfR#Flc710Ywti@ACcmfBx3(S2px|DP5er!Rg(@W&94>3Kuw^ZppCzohXsl)bst#exY3( z`3#TyExylr*`n31#gn5*xqqv{Y3*`GUbE*x5jPSqo@klj6|qhxL%Z>EvU=f?Ik(xk z8?RsB$jE4Y-giGi@q_dlxtKc#oeB!sxex9y+aRE#X2qpC=d>L(mA?Q0 delta 541 zcmV+&0^d&8Gi-<0047(dh`GQ0rE*iK~z{rV`RVrOeH1%V-u%T?DX^JjOb=y z2!IrT93ZD_#!%H>2Up){YKo$_{`6@SK0f)@$|i=#mrpT}<^VmQ1KOzMfGVH^E|KAY z-@7-%eMyRsL7I?5gw@4|;nC&OB!&Pm3V!dQmIHi&4j?fEWPgDU_%o0WkOQUxjz53k zQJ`*bj*{qZ9y|%=gR%=KCF7C@srk;rLRuP-0h()MWJGDML(zZk+&P9P5VxWLtl1Fc zfQ@I*lI?(hKR+@svGX&WIB^1OhJ}R%gTJvcc@D?`Y9tlRfI9xkaTA89s{ag!_Maus z0U*n@n`V$|KYzp3x(o)8BkUX@jvp`wAiJEbD4;Y1C{6>L)6*GN@QITg1-$#Vf}?=q zG(f2X1}qIIY?{O1J98#V$dQ!>Kq2tJFNNeNfaLGE9103WkDX$0e{J9l)?-kCIs-QA=v@whJjKsrGV%V fpwuE#^cDjE@PUmm>xCw<00000NkvXXu0mjfXHw{6 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png index ac264f225199f7018b1ce6b2535fda5b6000d042..671a4701fe5395b68c6e04090b303518d7c9b2e4 100644 GIT binary patch literal 534 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil`1AIbUJ|ErXAvz0 z1xKU2IBk1lFC>l2`Gu<(S&1vCy4gr;DDuUp=kS?po5?5z z$Qsq?`UdNm+GuM}m@r{liUZKjUZwpUKuWbF$S?Rm5rDz|ypumr180FpWHAE+-(e7D zJf6QI1t|F6)5S5w!oPH4Z&|YfkK5`kLSA>p%#N;o`zGxEf63_zR*e-)zp8()sgvOs zE*6;S{<%I>e?`T*)h-e8tD}y-4p||VY+9^n_jmq#4r!x@5wewMTVA_Zm@+Llh++wy zz~v>r!o-m|(I%b?abucOT-<#DpPyVpA09dT_3DJ@DJ2sO<*h+{KIf zCu()b?vP#oVX_dHkz(B=-kBSmCZ9N`J?okJB+l6LB|3kE&Zp~rk-hw0UFS%b)5)~W o!n;m-bE!0WNSr;SclitZk7urb_-^SY0E2?T)78&qol`;+0B0uKI{*Lx delta 805 zcmV+=1KRwS1hEE?8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00QetL_t(oh0RybOB+EL zeJi&0l86`~6oe%bGzbAx2(&~9fgrsE!HZ}Ah1@mCJ$Db{$y32%rH9%;2pU>J5=$hs z5E2%IveMX^QL2`4`=hM@ z!0eo_ACJWNoYts84TeqY4^NI1tBpyS@kAU?)C`hf81YC9iBuB%`8>ALX_+}GNCAf@N6PG+udjN%+>KhJ z2G!%`#7qPur+=`W*)i4&cC4_)gh3P_x{@NJ-kgy$0RT{GwQPJ7G64+iO)0XiblTDF zs>f^c8U<3o#@c%S!@D=+1JRWbb`SQjd$5P-N{E~XfLtca#qA#KNkx(&co7KnWs0px zq>?Be7hE%5Yt)7dfz|agh~&lNf{onGj?@Fdzp@(@?0W-yghPu6hZdo>f8zD+Q<9u| zZYTl%g=I%0-LuaKDSq3yxG_0Z6e&QAzuv5y=JaMAdb5tZj*+0=)tC6%*8u=`oh~1D zdvgZqW`Cpx!_ZueoSt787f&Yf1#Rg%r&5#(U|>nNG(CfFonN;3RrNc+KGU890Cc$) z8wN_krRf=dX4edtS2w1!2$ly!=fE%sL^pAHb%Q{3(>6Cq9=L`;Z`Pp;_fx)kQpCsi zZ*Aj$JErjjO!?+<-@fMe_w8$wh|}{6)4YgB@qYkiTt+Cv&{a@rwG^$_HFde;z)8T^ zN$5sQwdW$p?Ra+1XZtU(dV|H+y5*8WdR_kiUC>l2`Gu<(S=nf7Pna-aT8abEFi$%r3m_#?666>BA3I<;E3Eel zsD`t^BeIx*f$uN~Gak=hkpdLlK?(UlER1>yhy`%jly!G4P`M+J_i}nvHkE{jV4jLT0sOrNTG9%@%i?GU+6P43SnKYI< zWb+=Ip>cslUni?Ebp3{zytkD1G;lMmtIOrMw9D;=;K#U_Lve>xFHDMI51Qnypt_T9 ziAs65klwVN@v0M0~cW~fP3i*O}EjBLTc zz`$Uvr1W1wRgbC;cyRj?!`XZHFzg$=QNX~!z;NK)5vo|?V1Hyoo&y*d7#Jj!wMn+{ z#oen6PTG*b-FNjLUbO@rz`(%3@I>?voGtU3g~9VJ8=Svg_!on%!ZSGk@B=B597|Lh z;C%BQg}(m(1qyxs@=Fw&fdS%kLcS;30gf6r44iM?GdOBM;*!tSlHvOQ7Yuy1mJAFG z3=B$U5e(-qzkg&Ic<|Kj+5a8z{IT5~iLwpF(ED;i$256QD>l*5bD#!>rfZRk#wOqi! zKwcuGS}yqU<}pzQkqhuTfS4ep6b$|97#2zoZeOCl16&vw5G5KqaPo7-NNCYHIVgOl z3u_n{7#J89A9+E(1NLp&jkS}4%~4CIOd(_(=?*w>?g&v)L8uLhD~d*Q0nQL0H&qWg Z000ba$f@vn6S@EZ002ovPDHLkV1n;Y&ISMg diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png index 5d7c5ff2d18e765fea434cf509a098ceeab5e320..a7608d24c1002fd1bed5523a1104e20389142c65 100644 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilQ1AIbUoy^$gE^+FasFRo?ms6;_VMmmWvY3H^?=T269?xHq0u=n}>Eak-;a@tbds4Fkk88HPrlLaEt*`(0mk1vS z7FO& zmVEbWC};P$s3_s8D-kfG%4ucVg{bbgELM%@EZ3-aJh1H**(1-X-X0~ z!@hE!1B*p+v4^0=?e@+e=#IFMhnrmHva{ zm-U)6dmdV?*LK)4&0F&qmyntn%La+53Xu~locw2)bGq&lDAJJT_T%ny)A;|e)6L-7 r=WwB8C+u%=b$Pv*v`8mr)BFGJ45p1gTe~DWM4fC3d*2 delta 919 zcmV;I18Dr*1EL3z8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00Ue}L_t(og~gUVXcJ)^ z#(x#xCD^3c;E5cVL^y;{4OLnw86@Chmgr=PP7W@9&JKQnvkEQ_uI(DoOhTp-RNTrf z0n-~^v?ociu?0&&9pd{om;1=s7JR1n`+5GKcN2u*_MOV_Mt{8qK&f2u?KkSRz;(4Z zde8avjyKKiiP5u%!^pE%lM)rORugFY&g|~_QDQ*s-M3_)NSj$%s)PJb2(Ol7m|Bogc-5_){HP+&_4 zb`lBCo#AE`)tF)l5JCVTrNl4{EX%@mT@1s(wrzwE^!t5%erb6H7*q@l5_(?(0BqaF zG)<(GY;JC1Sr$@CIvZX3{XV8?dd@$6{ELN4?}6ZtS!@B$j~<3$0FX+h$mjC_Y;SMV z+2{h$*?;IFr3B!3vg5fwI*%s1U4#(WwylLYj>GxcbK~@nMXW0L>aLSMI!z{% z(IQOK#Bm%7XU=Nt_kvIlDA#2slbYOd9E1>h=1sWNj>XPH{tiT{IM#lqxr3250A+ikDdug6Ldd!8{L2I3!I-$oGW{Y~R z))bB>J1ka5{uP|K3`w}pd%Q2J7(f$4ffV=l@ zdVl8K?_Ze7<+ywAroN*RFU~*Y*gl{vRTjQ@{>n2~-dO#+zDpc07sh%(S*R=y@`yS! zj0X<~PmgQGW6SU$phWDc497JRm28XEq9^fG1*kW|@*&a#!(!q<{TnI_8xYorLUW*0 tu6T&!Wc0ArafQe7z(FC%1OFX=0A$~UA`nJJLm>bF002ovPDHLkV1gBzyFmZ| diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/hellfire.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/hellfire.png deleted file mode 100644 index 02aec1026594089491bcd954787048151538341a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1693 zcmV;O24eY%P)@Hh5466D&L^jZGw7Jfzqd97+nIWKmP<49euC1$&7*wH@p%J!m?3 zs)xuBw0JNilo*VShbFQFX%Y>NipUTRC1>O&1V^~^I-K6qci;V6cPBZ`1H$+7eed)B zeczq$eSr`70LQq0c0g{o4#$BfdOH>3r;|wb{j&pdVEVWb5JZMpakz1eFJQ^pXn7&e zsVv_dK;AX_N#dxXqQ^1dIAdFx<4CBHA@|P?$kNWD#(1l-o+}3D8PQ5045KKCqpIWH~?8b+jOuqa~3YiI`d;EBIEI)=lcM4XXkcnbo?vD_!pV1sUt}Z*`%g>|` z8)+dEg|IxQAz{-@Se^qd3n3HLDDT#IqdkUCT=T!O#K2V-b0HEFyo? z{T7lqD(6?KDmhZ=<}vdZP>jcJ4*8WTgiI8gc`%QZ6~9JK!(eG=Q6Bj8yHI{sRIibd zj0E_%X8|O;jxITwM+c@m1;BNc5^@~ zjr^>rW)mH=#skpkCG9NA<9D7L@^qUikR5DB6sa_@o71GeusjDg0_wOGQG1?BLqHC- zr7D0!#}3F2HZv|iE9$Z@zfuLeEa@Hq2xvNrY^YUx4EYUHa(FBv*Q!0(TWdG~Xc90{ zP>IP{!fp;DOU(#m2Z5Qtfc;m_mq4xBgX|zwgLOQVg?s=Se@Cv0j`%GdpvwZrK#fxX z4Pj#P6e{Hdo!mbkAG&sc&OrXSMSe>Mu-IEOP^5vcZvUbqJQMp!b6zPQxORXcKY`Js z6@F6(tbX|g0O0eVHq4cP;`zSlTOA<}w+{IAlaB!aSAVPd%5VD~aBqGZiOEwc8Bb34 z{KDF2eWv^XTIM%(K)qB@k1OQ^jS{RPmGXhD_gjS-|HxIbWq#WX0F?DqDIcIO`qnZU zULqV%2EuRp9sp>wfV`|IqMR4EjyzGq4B>cE)xj@*(+prE004=2SXG3L2z#G??0B!> z7r$i&u)>R_I`)eZ^d}BgMF{)F2p$xh<1bxT#kH_8eF4R-BMimPAu~UZq1ZXyc(33WzwIU%jwdzVoIHOKljko20H&@? zdG_#;K7|PS4x@uI8;Q z2>$Jvm`qQWiEKFp0NpGx588+bZ%#i#f1-K6_qA4`{=^~P;1P-?JvlG$;jL@(_|3Z^ zmY?NfAAw%+vpm}~kSDU`P?wqU>;yBsC_h1e;!yqZD3GT9iBqILXF4`X1mVPO`HA zyaxsx7iMK{JBPd%4&#kCDur8J>ts0I1K3KdkcsLHb9JQphO6)H*}e<4$*iZGQlPYIK!vSJi8hII3$>5He9s;gszk=tS7} z2cX&DP+3(zL#qu3jcg!L*;=zqQfWxysO+{sAShV&2LMcUwt+KWpMv!BqNZhqEmI4~ z>4l}zs4aZ;%rM-mn{(uFOZV-6i9}px=GvMC5@|l_X14fpr*jt0n2~O+toeJB! zfMI_ClL3DB2lx%k7a?+jpY{26!}e9UUMjSuKOiVLE|2qN>64!N1lQH!cJ&AN1>61r zzw7huhU4!6?d}io3yvJnuKs`^(9&1oAo>IRhNeG&p8GeRzSNbgz3LAjxn}jjprPvz zFsjZHyzCFyo{7nx7b%Z{u6n7UHNF8l_Od^Kmv2@L4ieoH*>cFLEL|@ZJgv`n+7i$x nL5&Jd!Dffk8hs}j4*>rG@n7<;H7eAq00000NkvXXu0mjfUm+x5 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json index 89e03a3ef0..6a11e09a83 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177", + "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177 and modified by potato1234x (github) for ss14", "size": { "x": 32, "y": 32 @@ -23,16 +23,6 @@ ] ] }, - { - "name": "hellfire", - "delays": [ - [ - 0.25, - 0.25, - 0.25 - ] - ] - }, { "name": "off" }, diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png index e4bef0b3a76761e8653a45997d9348d527893e49..8e7814af604a0e677ffe6002bc3a8e3573b86680 100644 GIT binary patch delta 374 zcmZo?X=9!sSllz?EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE0Av=;1lBN zWX3jkiBr!+oeevpw3QhOE5yPR1cgOKa`OU=m6UXJbo!=<-8}6xb?Q`KEAITX++gRw1Y6?&k_pQIEs|{yeKXy4H^2YePxN&j1MkwF3gtT{QCNc zIj;&Uqwp)+oP?%p+pB$*tnLQtaabjK^mTohCLp(Si?&RoZtfwV+ZjAv{an^LB{Ts5 D#2Ay^ delta 504 zcmV;eg5M`pWEhK|c2Mo9a zuqHwV1_lOib2F-1H02fv4%oMK0|Ns?0973TF_TCKzyP(f;(z^HRygJGI$&=9E2=oa z$s4yEUI&l^UVIW^h>Em<^Or3@f>%932XOpXV))6$MU>_2-@Y+0Fnl5@>S&S;VL6DH zoJ6y7fY@wIbq7fByE5#lqZ9g*9is*zBlxB01VVM)Dxv{@D|170wr;71{dc@ zIRD<2d3e=RJ%0ooqqy<%(E(8*0LkCPf&I(AGB`%9MByu#P~d3fHWnf@n&{k&n z@8li8uy5-IhTlwjgxm-Rtp6@CFfc$8;<4MD3|6Y&8FB8t{K^0`>*`%h`v`_WenC2e zu96bN+Yir(;*$yprh$nQW->4^Ffa%UND=1$!ynw(0L?<6x}LZkPB0Bn1K>*oc%#6{ uo4V~nY+%6af&q5`&NM&^%dn+^0S5r(s+B^q58E{W0000yhuag->LQZ9cgc;WFr&U@!@-+h2kFEiclngDdev63-a%4Aoi z&?^EE5yBwG6lR<8)M6SP>+7CwQ{6>*7XDX#TFz!bKq8)FrsWWC5YKEnCg*)(krfq< z_?&p$q6Uc{xvu*B#<}3Jz%xZFot!5YiKRjtt8L7RmQFlP9MN=x@`a4g8s~p4&U(4Z zntk#YhI7VBitDt75yKMVNI-&$DoQBBL6mlb6dOr8mpk}}Jb!{*D!EEv3dUE>LECmZME_gq44ll}>SlO>%;K zmZeT{g#Z8m==i+r0000SbW%=J|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|Ns907qa5l z00009a7bBm001r`001r`0jlENk^le!3rR#lR5(w4k&T*yAP_}Us~H5um|d&&{oix% zNR|k8K7YB#8Nk!5oT`7MC|#R2qwCtXDTVVAf^%JX=Xk_(A?V;rtpehYQ4uc9MUO<& zbr{$RS9*P#V8h(fb%|CXhkI*t!MZJk)7zaeB=qhmjNTU&klmt__yeI@A&NvuzXD+j zz7%AT=B;J)U=8=73eop9-}(XphA@ zTm>5F8g$2&oh&NoJ`EB3_2pl@eh4arQrJS?7lI|b!ek8NH5W+xCXgFLR8(+NP$m_a zsPA)u*@a07DiE2yU_aA@V3F@zykUzFM=n%Zq9hzL&;L)DJso1cq}%`i002ovPDHLk FV1n&?dxro3 delta 1462 zcmV;n1xfny2Ivcr894?30047(dh`GQ0flKpLr_UWLm+T+Z)Rz1WdHyuk$sUpNW)MR zg-=tZA{7TSh&W`Zx>yhuag-{NQZ9evg~$6i@1DbZ_W?qq!ZfRE0?>5ZOvPhTHn%E; zUJ-zZ5C$o454hX`2A>SslwB!EODKO7fcG={rW`PE3-qpeb8DUB^a04wtd?(pgF|4nNZIQ? z@9ycG+rK@n`TYQO0CK41rbx~J000JJOGiWiu>g<&2e*^AhyVZp32;bRa{vG?BLDy{ zBLR4&KXw2B00(qQO+^Ri0TlxmBRG&mIsgCw8FWQhbVF}#ZDnqB07HLrWnpw>WFU8G zbZ8()Nlj2!fese{00X5-L_t(o!^M_QXd71$#(xq~1&t+x>JrOayKB{sLXlUZDmnCI zy9za!#y*umFR2o8%RxAYoN~^g!iU}hc6})=DU>86U?bTvwDb^aA+1F~v5+@T6$R=T zyiN*2H15IK7ya{EE2V#QK!|-iPxH+;GoQvr6Z?4R{625VzWRKDo6F|`c$i z*u}|-%WUtw(=h;l;72AMm$|q2UDNk=D?hgWVB4}!u~0Vkw_6E5a=Pb8zmd~DtUuTm zKwkW9?tkoUWnK^BO$nT&avd;WWNu_;)pFT#`wT?J0`z!Ngo1wo(wP)v6K+Dmz>z`I znG^t_;3u5?Xqub99PVptcG&m+BsU-M!Ah~vKps|*k1w(C>v7@J^)99i z96ANhAAcZ%RDYihjWQh^C#-2ylt|4TZ9`=>?L~IE0dRFmNIqw0LbN8!Ob5rQC=nF* z5cYjLw=ydLsCvG}H##$eJglJY>9xt2l%ORgENpJo1Pgy_8q!p>!EZhuN83;Z1Fh&l z%TlbkhX8nTd!C9C!CrM{*l4KKz<@vCgqNRo2Ed^v1q1z4Q53o9&RFnw)Q&AN6 zkN{=$fT4t=p;8S4M=c~RF;Gz=6gIc;4GwTCvx2JUnGTMl>iHTr>XlH8VJ92Wnk>WX zY}HI&=)a+c)g})s0*F~dTLMr`vDq2GYU;NGAa#E_;5t!)-8KN&>~pxfq}EoiVhlz4 zT|7JYVoZ*mB$sV-Db-7FX4&|kH(x{+Yo6oRlH{^*clrJS1MN1UQ9ncF>Oaw$nWk(M z3uW#u-v{8*xo_I*fv3CQiVbJwPJ;2XXBvD~?j#z5_jO-E@+AQ{_vM&r8B786bzcEs z|J8B@v<;Q{xN6Fjt4k7h43m6LZp^I%F>3(a-je78n|)45vvF44oVj8Qza)ur8NRL) zC34v^HrF54*K+;?YqpmE@AfZyFNgbn+HJc4000hUSV?A0O#mtY000O800000007cc QlK=n!07*qoM6N<$f)(|a3jhEB diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/deny-unshaded.png index 609c524fa5700398505df2efa618173535ba0a9e..b8221f982ee616c3b1f529157c03c63e027fc1e5 100644 GIT binary patch delta 756 zcmVle16 ztEbiVzFfS-99{2l-=9Kj?_;5c+4`weijDNt;?}(}Tz)Vb(7kLa{WbJofD$HhHRd(zRTs(?eq%qlq{-Or{P|iU$fOWuD1K! zv($ENT^+_=M1QpVJOaKU$Zq-rOz%d_)aMbxoeJ4U+AgpfA+JXx0Q$`(ijTO zQ^$_2OXFI^iDq{N?taczT$pJck z0?-l=Zzo?*)gqSz7T~rrQ{#>5^Bmx78CFEbbA%3)M)q3%mGI9i^%~(2b}U$;&n8JGs|Zqlbg*~4YmaGlU{BHHayk3W=4P!eN!VK z7L6jS0Fh`M$qz~OnVaftz`_g9)%(0(h?x;!MBmh>fRQ9*CbIQ~5m14EAP9mW2%$N^g$ zI~65RA0QXo*9Tbc0ITZ*WK$CL0Wz_DeSqZ-u)01#Hny)1kd5u@17u_S`T*J3zCOTm m2UuPoKoA5$5ClO;0Ki{#5+1==UMofb0000EX>4Tx04R}tkv&MmP!xqvQ>7vm2Q!E` zWT?7W5EXHhDi*;)X)CnqVDi#GXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOi5ZOvPhTHn%E;UJ-zZ5Pt?SCNs-Oq!%;rt*?9P zrn-yrEdRbgt53~a3#@pti?dd#vDQ8L3&VMRCCznO!-!)E2_zvw zK@DY8U?WPqPJfDp6rIO>{6nrkNiKz4WiWCqpb8DL>j(dX-?Oy}QRA0S2E8*_2%=NJ}Ub zfcG={rW`PE3-qpeb8DUB^a04wtd?(pgF|4nNZIQ??|<&;oZG)Wt@-@`bpUdx<)%o^ z00006VoOIv0I>j&00*~|w}=1$010qNS#tmYE+YT{E+YYWr9XB6000McNliru=K&Q1 z7#8WfoYnvU02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00f0eL_t(| z+U=TOh<{X79LGPubMEZS-1)QPu3|-I;GaaydZ>gXv>s|J*xI81MCJ-XL_L_G5B4IY zP+|1YLnUbu1(m2I7(s;*u|n(m2X{^Ar4Y?^TzBTq?5uOo>0xErE!vfw>sj6VeY{-w z-Sau$^SkGs`-O=0%O@#|L+ySyIbnSj^#d%uOMkf>KXVsNT;J`}O##IKVgNCK7(fgl z1~84~O?E^3+D&%ge3=>fJOC2bIUiKX=6!-v4L_UWo2?rKpnvlg>uu=ct7S#jbnTHw zJm8AwU$%qg3i(WSq`nC$SBLO3DXPH*QhpOZefGWp6pKZB^4q0+{N-8R*;$o_0BC!= zmw%IoJP!5z0X>TmEj&B_6njt4r&h0#Cp~)a%nj>Digq<_hL*qnJ7rJ`_vHkvahJnHolP;Xwfi6&=Qk0GrmjLP(D`&bB7d5?8t;Gt+oe(V2Y7L=$FXC5yfi0)5ltu~^*bKC z7ZF7$;~lW%nLp)H?SDxC4t95A1P*lfAY4G9DXxEj8E^hTC?Hlx>VUr9UaY{;-adpn zg64eZa`GP@Alo{7T>VJi0^fHXL6iY2C<{guTeoee-Wrlnids;PvK1e38sj$fP56K+bA>lc12xk;`Z4 zxcM9p&*`U-^?57dlS?O~bwDTvxwzX<8dl#LV6A2EY3K+B*lly{iqHXOOnp(%v7m~z zmi=epwQ7m?$gncXeLw}lcz*`3RH7b+-1GGfSQ1zppq21QbuiM8l_3P9ExHmAhK3iu zn{}~%6|IC`S{l7N6>ak9_7`0_fS7w$1^#bi&xdPXt26J>Uu` zv#262A>7{f-&^BpeX3h5195l!OQ*{yw(*1hyla^VgNCK7=OSt)|Af&I0xW5 zA20=$fa`pKV+Xj-2RH}dIv?O1fa`pK^B&+jAK)B->wJK70Iu@^QESqfx_i|+`_KRL z2~SZENAdwyDSrH5vrKd%WxsWSTfhP{svkxzKi~k65;>=01jnXNoGw=04e|g00;m8000000Mb*F P00000NkvXXu0mjfP&Ofi diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/eject-unshaded.png index ca98be38dc3ffae0a7d601d80d0dc837b482dd44..49fcef45a1d26c31319980bb43656cba1b10d26e 100644 GIT binary patch delta 833 zcmeC>zRos5xt>|h)5S5QV$R#yz8S)fBFF#VUgl=Y!4_oGF-^;I#*LsgKU&2%x``xZ zvueh5Wq9)^xw1I2=vQfrvA8loX@rHTueuDH0V2p%nV?DXFtpJ{$$H_ZF9fM?qSc^Dc4+nrSYN%PhZFMt8;Ju-DE%?7r`(x|>^I1gYq1dyh-un8^s5PIG9e%H2Bm3*8 zpWVYxM#&#p_bZ0Keuba4!RL)^@pfmEwI-&NmM_+xdE0dN>WH6<{+scAD|>wHu=JW( zfBp@-?6xO6XHS2&-NLHC{kud$Y3(|8jTOwi|Abo>&HPtY)o}IePQ!%KYJRJJ`Nq!? z{_EbU{bO5f>!+^G9A0<$^~%#*r%N%XM8=iqEUz={x%OP@LDO=!!w>5PWA5!?;+}c$ zRIIf%(@($m-LRe&D*H?o{i)Hyr0@H%u&$$mEpZa-YznK6Cd{yq`yu+I9IJ0(zpUr!<#rTw8tfOLyXz_s^>w%syzOe$!YJKK;T?<~8fi|K+lZ zvF5v?mHxQm-&N-I>CDS!^E1k`U91=V(|7%O!)9x-3DeYgeyZn`*8WR>aXJ6z=U9h~ zUjBdb$sH?q&AIbyvakH|t*i7{yI&XUhUUbng)nP8ZQpPsV&(1bg^9Wy20}&+30g^9 zL3eiCy|4A2dy7t1_2)OLa_wv?%JYLS-Vcla@89^aVoqA;*Q@A&dFl{0#8>z Jmvv4FO#o$ge$D^@ delta 1403 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 delta 936 zcmV;Z16Ta+1>Ogc894?30047(dh`GQ0flKpLr_UWLm+T+Z)Rz1WdHyuk$sUpNW)MR zg-=tZA{7TSh&W`Zx>yhuag-{NQZ9evg~$6i@1DbZ_W?qq!ZfRE0?>5ZOvPhTHn%E; zUJ-zZ5C$o454hX`2A>SslwB!EODKO7fcG={rW`PE3-qpeb8DUB^a04wtd?(pgF|4nNZIQ? z@9ycG+rK@n`TYQO0CK41rbx~J000JJOGiWiu>g<&2e*^AhyVZp32;bRa{vG?BLDy{ zBLR4&KXw2B00(qQO+^Ri0TlxmET}J8s{jB18FWQhbVF}#ZDnqB07HLrWnpw>WFU8G zbZ8()Nlj2!fese{00EmxL_t(o!((K?0<=^T{)>ydF;D~8>qIdeyt0hp<;z_R*X}G} zM3-m5rb$B5jX_>kmnsfW*I{RP_!(l>wL1$iqh#z#YJXOTxubhbk7RD0?#e z|Z z^Ll$37#J8B6nOa<9(?{p|7@64T+E=LszVL zw9W-oO@u?T9H43<94!eIRP`7XRQ0G=8zNUU!~j^(EAaAB#{rB?b4l_Ia`mgo&%jWe z??Ih3Kuo&;-LWvsdnfK-;1z#Pc^ZI~a_BgzxEQCN-ibRH7#J8B(jpQm&jtH7?PhTD zbHyr-4-kq5q8()L;PxekdA*m&${n*-%x7R=Afr*rCkczY79y;{jAwjt4^KPT1f@j1 z|I?xc{Ot8sMux!#0Fy(T#gQ_DApigX4rN$LW=%~1DgXcg2mk;800000(o>TF0000< KMNUMnLSTZnVw1!G diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/panel.png index e8babedfe58dad0ee3ecc09b2f97dcf7494fd53c..c60f5c3069d9db8312578c551f2e6b8c66eac5e9 100644 GIT binary patch delta 217 zcmdnS`h{_Vay)Lak%W8j8D}F`%{6Dw4{G(OV zE4~%ksmz!2zKZgE+vF|Lz;|HvyjOe-KW$bw%nVA5^wV~}G9_!liNs%42XZG1G@shf z&r^DK4G&LK%hllPjG4#&OQy|D-NP*Iv3xUg!?eRPj%&nTr8^7huro3=)@n!0%}#p> PbTWgdtDnm{r-UW|2u@p4 delta 671 zcmV;Q0$~000k#E@BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>7vm2Q!E` zWT?7W5EXHhDi*;)X)CnqVDi#GXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOi5ZOvPhTHn%E;UJ-zZ5Pt?SCNs-Oq!%;rt*?9P zrn-yrEdRbgt53~a3#@pti?dd#vDQ8L3&VMRCCznO!-!)E2_zvw zK@DY8U?WPqPJfDp6rIO>{6nrkNiKz4WiWCqpb8DL>j(dX-?Oy}QRA0S2E8*_2%=NJ}Ub zfcG={rW`PE3-qpeb8DUB^a04wtd?(pgF|4nNZIQ??|<&;oZG)Wt@-@`bpUdx<)%o^ z00006VoOIv0I>j&00*~|w}=1$010qNS#tmYE+YT{E+YYWr9XB6000McNliru=K&Q1 z7c{#=!TkUL02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{0047IL_t(o z!|l_t34eev5QX7GZ~+GhsBeSRA)TW*hK*CCN|yn|%He#jAR@-%eGA;rac3qXA|fIp z@}d|6V+^b^yktiJJocU##_uBl5CF}mI$JpQo&Z>~qxp0@pm{4`+B&n7wybT11DHMQ zzrZgd9=HGtzaaRYD+3t-000hUSV?A0O#mtY02lxW000000002eQE##C{q%=L{6)Ytj9LStqP!@$5Wd%@}mAf-?eY%$k*cR3*@&d*Z(% zinmylA}2g;FcDOAWPPNgJCA*`!w2og1D`w@7B;+BtB<+F-7gS#@TSX&FGXk7xgrG{ z3}woF&RyhY{jbNXlKe?V`MSh{6HQz{rtn-!U0LkYC?4?eO2ffRQ424)PH{M~h{Y+D z-{SS0tydjatp9rU)-uOkuD7xw&s*Y z4^6A$l=dty-y}cTgk=xMAtj&vmpvsck6*LMP|DoMeWO2LKchGIv-c)hV+T)_POqO_ i_XBP!{W)&)pK$||;fB4_c5?uOl)=;0&t;ucLK6US72A&h delta 433 zcmV;i0Z#t21cU^TL19!-OjJcZJv~r48?1skl5QJpR16{^8DmNzdtDbtFi2@`Z&Wy0 zE-fKONGN4!I$9FE2YgJ5xtcTTWR}MNVW@VLUuM0000( zr!e{e00113t{;B@7qa5l00009a7bBm000id000id0mpBsWB>pG5lKWrR5(w4lZ%#u zFboBY8)$hHR-g*Y|NrOSgaQGJV~vMoOj=O0EQZOFa24zElZI#)h$JCt#Um3TLkHq2 ztzHBdN{AUHuzV4K7VzGM8*nxe^1|L=P~8OQ*4&0G5ek1L*vdh2t}L-ii^W2&I^b0? zC|8v&ad{Fh0~n-qha`uPCs9J(obZkJZCl?79m>9I{jJb+U56g$4!;Sm9X!6pAKc@~ z;bR0(W&z>Z5B&fERlNrY0)%1c```Rnp(&y zt4L{j$}3n(I5?W?>+4%vTL-%bMEgYsxca4pCT5!D<=fcU0L{NV*)a-8$(0281^>qf z7~V+8#7$HbuV=XB>Eak-;eU2=t+2BJPy5X8M$2Ao`1voscz=p%@6_FYx4SvXVR delta 632 zcmV-;0*C$81DOSo83+ad0047(di0Ub7k>gvNkl)dyj36GYGlMK+P4&JC2M!Btml(iqgaoLg^uyWHF~ zWm$dj3+=r*x#xU8$vsVz!C&3GUi*V%)Wc^xDH=0kaOw6e%*Mw=jg87ImREWn8Gnpe z{{j9z0BVwv0IXa4Sb1)tT5cz5Xnn~uuK<8dFJ50`ow$ z8k>)0zXc3cB2zAcfGuCA?g83kx6Y0ow|7q5>%%#uQpGRJUvc+3lQ7&+fUu@HYDod^ zUQPC$AQFJ<(Rvl%Tb~CiG*LW_J6Ejk@te(H>C5xK;sKDRjX6}cDdif=-i2)kyR0yE z)9)Pz1;1&W-6zsqC4i=BxMgIV$I0oUY8mvpjt%o&AWr5D_p35D_H*E8y~V~TC?@+Q zDs0>y9DrULMX@V0C7F_#m|NCm=f|P}L|r^(B5CyjJl^<$<5m}7YrCGp2y_6eyxjlU SITnxr0000eoPuuO!GX z_&+jWa6NG61W<;vz$3DlfnlOHZ#}~%PZ!4!3;(l|Zu1>h;Bj`=Kbi3Ke|@=yr~Anp z-b+2LR|OnAR=6~X)#Rv3^yN>Ezw8gs3bSe3$KRIwJ)14@rukIA=K5c)7aeL?trr?L z%F8Z`aY<_GPM9XZZF%D^$ot>;7PjYN@bUr3{wt$J*$*H}pNaofBo`r`+rk?pQ bH7fqFuFTKX+Z#3my~5z>>gTe~DWM4f)BuUd delta 413 zcmV;O0b>5`0>1;083+ad0047(di0Tw7k>e9NklH zNrXuwz9dvo)dSNHZeJp(7H_L~Im0V>1w#se1wAMPU}kM$I6;~NK%nP^7z!U((;6MD z`3lVsUqOTzKBc%FfNU9}e#hND0DrXuKmfTvL5zb5c1&P~z*06kaPo77Cpv7F!^Fsn z0+<1yv;eXkWEncZ<|uT_@d3P1fNTILMbGOcoT_1f*r>o80x(B_5+jJM&ZG<$zxnSj z(GDS$4sbdE){I7uyDbd(>jhM`Cm4tUSRHVHfq{{MP5=Opbht6f7auzS015yANkvXX Hu0mjfx_76K From ae27b80ac2f64781387254db7efa1b374fddd131 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 14:46:57 -0400 Subject: [PATCH 09/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 118c32992f..7732c75668 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: Dygon - changes: - - {message: Windoors can now be bolted through the network system., type: Tweak} - id: 4149 - time: '2023-07-01T19:00:53.0000000+00:00' - author: Dygon changes: - {message: 'Shutters are able to be closed again on windoors, tables, flaps and @@ -3032,3 +3027,8 @@ Entries: - {message: Changed admin ghost's hands order, type: Tweak} id: 4648 time: '2023-08-21T18:35:30.0000000+00:00' +- author: Potato1234_x + changes: + - {message: Vending machines have been polished. Again., type: Tweak} + id: 4649 + time: '2023-08-21T18:45:54.0000000+00:00' From aed50f5524d5ceb31dda59ca3eaf1f6b68792ed8 Mon Sep 17 00:00:00 2001 From: Alekshhh <44923899+Alekshhh@users.noreply.github.com> Date: Mon, 21 Aug 2023 21:49:22 +0300 Subject: [PATCH 10/28] Medical Locker Fill Change (#19329) put your syringe away walter, I'm not having ipecac right now walter (original commit name i had to keep) --- .../Catalog/Fills/Lockers/heads.yml | 8 ----- .../Catalog/Fills/Lockers/medical.yml | 29 ++++++++++++------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index e116d983cb..7161dfb686 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -182,15 +182,11 @@ - id: ClothingMaskSterile - id: ClothingHeadHatBeretCmo - id: ClothingOuterHardsuitMedical - - id: DiagnoserMachineCircuitboard - - id: VaccinatorMachineCircuitboard - id: Hypospray - id: HandheldCrewMonitor - id: DoorRemoteMedical - id: RubberStampCMO - id: MedicalTechFabCircuitboard - - id: MaterialBiomass - amount: 3 - id: BoxEncryptionKeyMedical - type: entity @@ -209,15 +205,11 @@ - id: ClothingOuterCoatLabCmo - id: ClothingMaskSterile - id: ClothingHeadHatBeretCmo - - id: DiagnoserMachineCircuitboard - - id: VaccinatorMachineCircuitboard - id: Hypospray - id: HandheldCrewMonitor - id: DoorRemoteMedical - id: RubberStampCMO - id: MedicalTechFabCircuitboard - - id: MaterialBiomass - amount: 3 - id: BoxEncryptionKeyMedical - type: entity diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml index 3d7c371d28..705b011219 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml @@ -5,16 +5,16 @@ components: - type: StorageFill contents: - - id: BoxPillCanister - id: BoxSyringe - id: EpinephrineChemistryBottle - amount: 3 + amount: 1 - id: Brutepack amount: 2 - id: Ointment amount: 2 - id: Bloodpack amount: 2 + - id: Gauze - type: entity id: LockerWallMedicalFilled @@ -24,16 +24,16 @@ components: - type: StorageFill contents: - - id: BoxPillCanister - id: BoxSyringe - id: EpinephrineChemistryBottle - amount: 3 + amount: 1 - id: Brutepack amount: 2 - id: Ointment amount: 2 - id: Bloodpack amount: 2 + - id: Gauze - type: entity @@ -67,8 +67,6 @@ - id: UniformScrubsColorPurple prob: 0.05 orGroup: Surgshrubs - - id: NitrousOxideTankFilled - prob: 0.3 - id: ClothingMaskSterile - type: entity @@ -103,8 +101,6 @@ - id: UniformScrubsColorPurple prob: 0.05 orGroup: Surgshrubs - - id: NitrousOxideTankFilled - prob: 0.3 - id: ClothingMaskSterile - type: entity @@ -116,10 +112,17 @@ contents: - id: BoxSyringe - id: BoxBeaker + - id: BoxBeaker + prob: 0.3 - id: BoxPillCanister - id: BoxBottle - amount: 2 - + - id: ChemBag + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingMaskSterile + - id: HandLabeler + prob: 0.5 + - type: entity id: LockerParamedicFilled suffix: Filled @@ -134,4 +137,8 @@ - id: ClothingUniformJumpsuitParamedic - id: ClothingUniformJumpskirtParamedic - id: ClothingEyesHudMedical - \ No newline at end of file + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingMaskSterile + - id: MedkitFilled + prob: 0.3 From 4f89f08e7522f195cfb70d075d61a3b21fbce005 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 14:50:26 -0400 Subject: [PATCH 11/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7732c75668..fa58b1805e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Dygon - changes: - - {message: 'Shutters are able to be closed again on windoors, tables, flaps and - windows.', type: Fix} - id: 4150 - time: '2023-07-01T19:19:04.0000000+00:00' - author: Slava0135 changes: - {message: added rare immovable rod event that can happen late in the game and @@ -3032,3 +3026,8 @@ Entries: - {message: Vending machines have been polished. Again., type: Tweak} id: 4649 time: '2023-08-21T18:45:54.0000000+00:00' +- author: Alekshhh + changes: + - {message: Changed medical locker contents, type: Tweak} + id: 4650 + time: '2023-08-21T18:49:22.0000000+00:00' From 2cbe8609a32cd9278d6e60ff50a6fa08f7b51d70 Mon Sep 17 00:00:00 2001 From: Vordenburg <114301317+Vordenburg@users.noreply.github.com> Date: Mon, 21 Aug 2023 14:54:44 -0400 Subject: [PATCH 12/28] Make lobby song update occur at round end (#19303) --- Content.Client/Audio/BackgroundAudioSystem.cs | 16 ++++--------- .../GameTicking/Managers/ClientGameTicker.cs | 24 +++++++++++-------- .../GameTicking/GameTicker.RoundFlow.cs | 7 +++++- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Content.Client/Audio/BackgroundAudioSystem.cs b/Content.Client/Audio/BackgroundAudioSystem.cs index 100ee7458e..0b31db2463 100644 --- a/Content.Client/Audio/BackgroundAudioSystem.cs +++ b/Content.Client/Audio/BackgroundAudioSystem.cs @@ -34,7 +34,7 @@ public sealed class BackgroundAudioSystem : EntitySystem _client.PlayerLeaveServer += OnLeave; - _gameTicker.LobbyStatusUpdated += LobbySongReceived; + _gameTicker.LobbySongUpdated += LobbySongUpdated; } public override void Shutdown() @@ -48,7 +48,7 @@ public sealed class BackgroundAudioSystem : EntitySystem _client.PlayerLeaveServer -= OnLeave; - _gameTicker.LobbyStatusUpdated -= LobbySongReceived; + _gameTicker.LobbySongUpdated -= LobbySongUpdated; EndLobbyMusic(); } @@ -95,17 +95,9 @@ public sealed class BackgroundAudioSystem : EntitySystem } } - private void LobbySongReceived() + private void LobbySongUpdated() { - if (_lobbyStream != null) //Toggling Ready status fires this method. This check ensures we only start the lobby music if it's not playing. - { - return; - } - - if (_stateManager.CurrentState is LobbyState) - { - StartLobbyMusic(); - } + RestartLobbyMusic(); } public void RestartLobbyMusic() diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs index 5c255cd193..7c94a60aad 100644 --- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs +++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs @@ -1,4 +1,3 @@ -using Content.Client.Audio; using Content.Client.Gameplay; using Content.Client.Lobby; using Content.Client.RoundEnd; @@ -8,7 +7,6 @@ using Content.Shared.GameWindow; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Client.State; -using Robust.Shared.Audio; using Robust.Shared.Configuration; using Robust.Shared.Player; using Robust.Shared.Utility; @@ -21,7 +19,6 @@ namespace Content.Client.GameTicking.Managers [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; - [Dependency] private readonly BackgroundAudioSystem _backgroundAudio = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [ViewVariables] private bool _initialized; @@ -49,6 +46,7 @@ namespace Content.Client.GameTicking.Managers public event Action? InfoBlobUpdated; public event Action? LobbyStatusUpdated; + public event Action? LobbySongUpdated; public event Action? LobbyLateJoinStatusUpdated; public event Action>>? LobbyJobsAvailableUpdated; @@ -73,6 +71,16 @@ namespace Content.Client.GameTicking.Managers _initialized = true; } + public void SetLobbySong(string? song, bool forceUpdate = false) + { + var updated = song != LobbySong; + + LobbySong = song; + + if (updated || forceUpdate) + LobbySongUpdated?.Invoke(); + } + private void LateJoinStatus(TickerLateJoinStatusEvent message) { DisallowedLateJoin = message.Disallowed; @@ -97,7 +105,7 @@ namespace Content.Client.GameTicking.Managers RoundStartTimeSpan = message.RoundStartTimeSpan; IsGameStarted = message.IsRoundStarted; AreWeReady = message.YouAreReady; - LobbySong = message.LobbySong; + SetLobbySong(message.LobbySong); LobbyBackground = message.LobbyBackground; Paused = message.Paused; @@ -124,12 +132,8 @@ namespace Content.Client.GameTicking.Managers private void RoundEnd(RoundEndMessageEvent message) { - if (message.LobbySong != null) - { - LobbySong = message.LobbySong; - _backgroundAudio.StartLobbyMusic(); - } - + // Force an update in the event of this song being the same as the last. + SetLobbySong(message.LobbySong, true); RestartSound = message.RestartSound; // Don't open duplicate windows (mainly for replays). diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 47fded14c9..98794c9926 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -323,6 +323,12 @@ namespace Content.Server.GameTicking RunLevel = GameRunLevel.PostRound; + // The lobby song is set here instead of in RestartRound, + // because ShowRoundEndScoreboard triggers the start of the music playing + // at the end of a round, and this needs to be set before RestartRound + // in order for the lobby song status display to be accurate. + LobbySong = _robustRandom.Pick(_lobbyMusicCollection.PickFiles).ToString(); + ShowRoundEndScoreboard(text); } @@ -453,7 +459,6 @@ namespace Content.Server.GameTicking PlayersJoinedRoundNormally = 0; RunLevel = GameRunLevel.PreRoundLobby; - LobbySong = _robustRandom.Pick(_lobbyMusicCollection.PickFiles).ToString(); RandomizeLobbyBackground(); ResettingCleanup(); IncrementRoundNumber(); From e837f2fd8542683bed3af63348639c3657559679 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 21 Aug 2023 22:18:30 +0100 Subject: [PATCH 13/28] air alarm signal ports and other stuff (#18642) Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Monitor/Components/AirAlarmComponent.cs | 27 +++++ .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 105 +++++++++++++----- .../DeviceLinking/Systems/DeviceLinkSystem.cs | 17 ++- .../DeviceLinking/Systems/LogicGateSystem.cs | 7 +- .../Systems/SignalSwitchSystem.cs | 6 +- .../Systems/DeviceNetworkSystem.cs | 6 +- .../Systems/WiredNetworkSystem.cs | 2 +- .../Systems/WirelessNetworkSystem.cs | 5 +- .../Disposal/Mailing/MailingUnitSystem.cs | 4 +- .../machine-linking/transmitter_ports.ftl | 11 +- .../Prototypes/DeviceLinking/source_ports.yml | 18 +++ .../Structures/Wallmounts/air_alarm.yml | 32 ++++-- 12 files changed, 181 insertions(+), 59 deletions(-) diff --git a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs index d0c1a3a86c..7684f04bbc 100644 --- a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs +++ b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs @@ -1,7 +1,10 @@ +using Content.Server.DeviceLinking.Components; using Content.Shared.Atmos.Monitor; using Content.Shared.Atmos.Monitor.Components; using Content.Shared.Atmos.Piping.Unary.Components; +using Content.Shared.DeviceLinking; using Robust.Shared.Network; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Atmos.Monitor.Components; @@ -24,4 +27,28 @@ public sealed class AirAlarmComponent : Component public HashSet ActivePlayers = new(); public bool CanSync = true; + + /// + /// Previous alarm state for use with output ports. + /// + [DataField("state")] + public AtmosAlarmType State = AtmosAlarmType.Normal; + + /// + /// The port that gets set to high while the alarm is in the danger state, and low when not. + /// + [DataField("dangerPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DangerPort = "AirDanger"; + + /// + /// The port that gets set to high while the alarm is in the warning state, and low when not. + /// + [DataField("warningPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string WarningPort = "AirWarning"; + + /// + /// The port that gets set to high while the alarm is in the normal state, and low when not. + /// + [DataField("normalPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string NormalPort = "AirNormal"; } diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs index 4ee9a9ac8e..f88a36557e 100644 --- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs @@ -1,6 +1,7 @@ using System.Linq; using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Piping.Components; +using Content.Server.DeviceLinking.Systems; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; @@ -13,6 +14,7 @@ using Content.Shared.Atmos; using Content.Shared.Atmos.Monitor; using Content.Shared.Atmos.Monitor.Components; using Content.Shared.Atmos.Piping.Unary.Components; +using Content.Shared.DeviceLinking; using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Systems; using Content.Shared.Interaction; @@ -32,14 +34,14 @@ namespace Content.Server.Atmos.Monitor.Systems; // response data in its data key. public sealed class AirAlarmSystem : EntitySystem { - [Dependency] private readonly DeviceNetworkSystem _deviceNet = default!; - [Dependency] private readonly DeviceListSystem _deviceListSystem = default!; - [Dependency] private readonly AtmosDeviceNetworkSystem _atmosDevNetSystem = default!; + [Dependency] private readonly AccessReaderSystem _access = default!; [Dependency] private readonly AtmosAlarmableSystem _atmosAlarmable = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly AccessReaderSystem _accessSystem = default!; + [Dependency] private readonly AtmosDeviceNetworkSystem _atmosDevNet = default!; + [Dependency] private readonly DeviceNetworkSystem _deviceNet = default!; + [Dependency] private readonly DeviceLinkSystem _deviceLink = default!; + [Dependency] private readonly DeviceListSystem _deviceList = default!; [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; #region Device Network API @@ -57,8 +59,8 @@ public sealed class AirAlarmSystem : EntitySystem /// The data to send to the device. public void SetData(EntityUid uid, string address, IAtmosDeviceData data) { - _atmosDevNetSystem.SetDeviceState(uid, address, data); - _atmosDevNetSystem.Sync(uid, address); + _atmosDevNet.SetDeviceState(uid, address, data); + _atmosDevNet.Sync(uid, address); } /// @@ -66,7 +68,7 @@ public sealed class AirAlarmSystem : EntitySystem /// private void SyncAllDevices(EntityUid uid) { - _atmosDevNetSystem.Sync(uid, null); + _atmosDevNet.Sync(uid, null); } /// @@ -75,7 +77,7 @@ public sealed class AirAlarmSystem : EntitySystem /// The address of the device. private void SyncDevice(EntityUid uid, string address) { - _atmosDevNetSystem.Sync(uid, address); + _atmosDevNet.Sync(uid, address); } /// @@ -85,8 +87,8 @@ public sealed class AirAlarmSystem : EntitySystem /// private void SyncRegisterAllDevices(EntityUid uid) { - _atmosDevNetSystem.Register(uid, null); - _atmosDevNetSystem.Sync(uid, null); + _atmosDevNet.Register(uid, null); + _atmosDevNet.Sync(uid, null); } /// @@ -133,8 +135,7 @@ public sealed class AirAlarmSystem : EntitySystem /// The mode to sync with the rest of the network. private void SyncMode(EntityUid uid, AirAlarmMode mode) { - if (EntityManager.TryGetComponent(uid, out AtmosMonitorComponent? monitor) - && !monitor.NetEnabled) + if (TryComp(uid, out var monitor) && !monitor.NetEnabled) return; var payload = new NetworkPayload @@ -165,6 +166,8 @@ public sealed class AirAlarmSystem : EntitySystem SubscribeLocalEvent(OnTabChange); SubscribeLocalEvent(OnDeviceListUpdate); SubscribeLocalEvent(OnClose); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnActivate); } @@ -179,7 +182,7 @@ public sealed class AirAlarmSystem : EntitySystem continue; } - _atmosDevNetSystem.Deregister(uid, deviceNet.Address); + _atmosDevNet.Deregister(uid, deviceNet.Address); } component.ScrubberData.Clear(); @@ -220,6 +223,18 @@ public sealed class AirAlarmSystem : EntitySystem RemoveActiveInterface(uid); } + private void OnInit(EntityUid uid, AirAlarmComponent comp, ComponentInit args) + { + _deviceLink.EnsureSourcePorts(uid, comp.DangerPort, comp.WarningPort, comp.NormalPort); + } + + private void OnMapInit(EntityUid uid, AirAlarmComponent comp, MapInitEvent args) + { + // for mapped linked air alarms, start with high so when it changes for the first time it goes from high to low + // without this the output would suddenly get sent a low signal after nothing which is bad + _deviceLink.SendSignal(uid, GetPort(comp), true); + } + private void OnShutdown(EntityUid uid, AirAlarmComponent component, ComponentShutdown args) { _activeUserInterfaces.Remove(uid); @@ -227,9 +242,6 @@ public sealed class AirAlarmSystem : EntitySystem private void OnActivate(EntityUid uid, AirAlarmComponent component, ActivateInWorldEvent args) { - if (!_interactionSystem.InRangeUnobstructed(args.User, args.Target)) - return; - if (!TryComp(args.User, out var actor)) return; @@ -242,9 +254,9 @@ public sealed class AirAlarmSystem : EntitySystem if (!this.IsPowered(uid, EntityManager)) return; - var ui = _uiSystem.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key); + var ui = _ui.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key); if (ui != null) - _uiSystem.OpenUi(ui, actor.PlayerSession); + _ui.OpenUi(ui, actor.PlayerSession); component.ActivePlayers.Add(actor.PlayerSession.UserId); AddActiveInterface(uid); SyncAllDevices(uid); @@ -268,12 +280,20 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateAlarmMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmModeMessage args) { - var addr = string.Empty; - if (EntityManager.TryGetComponent(uid, out DeviceNetworkComponent? netConn)) addr = netConn.Address; if (AccessCheck(uid, args.Session.AttachedEntity, component)) + { + var addr = string.Empty; + if (TryComp(uid, out var netConn)) + { + addr = netConn.Address; + } + SetMode(uid, addr, args.Mode, false); + } else + { UpdateUI(uid, component); + } } private void OnUpdateAutoMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAutoModeMessage args) @@ -293,7 +313,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateDeviceDataMessage args) { if (AccessCheck(uid, args.Session.AttachedEntity, component) - && _deviceListSystem.ExistsInDeviceList(uid, args.Address)) + && _deviceList.ExistsInDeviceList(uid, args.Address)) { SetDeviceData(uid, args.Address, args.Data); } @@ -334,10 +354,14 @@ public sealed class AirAlarmSystem : EntitySystem if (!Resolve(uid, ref component)) return false; - if (!EntityManager.TryGetComponent(uid, out AccessReaderComponent? reader) || user == null) + // if it has no access reader behave as if the user has AA + if (!TryComp(uid, out var reader)) + return true; + + if (user == null) return false; - if (!_accessSystem.IsAllowed(user.Value, reader)) + if (!_access.IsAllowed(user.Value, reader)) { _popup.PopupEntity(Loc.GetString("air-alarm-ui-access-denied"), user.Value, user.Value); return false; @@ -354,8 +378,10 @@ public sealed class AirAlarmSystem : EntitySystem } var addr = string.Empty; - if (EntityManager.TryGetComponent(uid, out DeviceNetworkComponent? netConn)) + if (TryComp(uid, out var netConn)) + { addr = netConn.Address; + } if (component.AutoMode) { @@ -369,9 +395,32 @@ public sealed class AirAlarmSystem : EntitySystem } } + if (component.State != args.AlarmType) + { + TryComp(uid, out var source); + + // send low to old state's port + _deviceLink.SendSignal(uid, GetPort(component), false, source); + + // send high to new state's port, along with updating the cached state + component.State = args.AlarmType; + _deviceLink.SendSignal(uid, GetPort(component), true, source); + } + UpdateUI(uid, component); } + private string GetPort(AirAlarmComponent comp) + { + if (comp.State == AtmosAlarmType.Danger) + return comp.DangerPort; + + if (comp.State == AtmosAlarmType.Warning) + return comp.WarningPort; + + return comp.NormalPort; + } + #endregion #region Air Alarm Settings @@ -517,7 +566,7 @@ public sealed class AirAlarmSystem : EntitySystem /// private void ForceCloseAllInterfaces(EntityUid uid) { - _uiSystem.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key); + _ui.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key); } private void OnAtmosUpdate(EntityUid uid, AirAlarmComponent alarm, AtmosDeviceUpdateEvent args) @@ -585,7 +634,7 @@ public sealed class AirAlarmSystem : EntitySystem highestAlarm = AtmosAlarmType.Normal; } - _uiSystem.TrySetUiState( + _ui.TrySetUiState( uid, SharedAirAlarmInterfaceKey.Key, new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, alarm.CurrentTab, highestAlarm.Value, alarm.AutoMode)); diff --git a/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs b/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs index edf937a30c..76f1d55a6b 100644 --- a/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs +++ b/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs @@ -1,3 +1,4 @@ +using Content.Server.DeviceLinking.Components; using Content.Server.DeviceLinking.Events; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; @@ -95,11 +96,25 @@ public sealed class DeviceLinkSystem : SharedDeviceLinkSystem } } - _deviceNetworkSystem.QueuePacket(uid, sinkNetworkComponent.Address, payload, sinkNetworkComponent.ReceiveFrequency); + // force using wireless network so things like atmos devices are able to send signals + var network = (int) DeviceNetworkComponent.DeviceNetIdDefaults.Wireless; + _deviceNetworkSystem.QueuePacket(uid, sinkNetworkComponent.Address, payload, sinkNetworkComponent.ReceiveFrequency, network); } } } + /// + /// Helper function that invokes a port with a high/low binary logic signal. + /// + public void SendSignal(EntityUid uid, string port, bool signal, DeviceLinkSourceComponent? comp = null) + { + var data = new NetworkPayload + { + [DeviceNetworkConstants.LogicState] = signal ? SignalState.High : SignalState.Low + }; + InvokePort(uid, port, data, comp); + } + /// /// Checks if the payload has a port defined and if the port is present on the sink. /// Raises a containing the payload when the check passes diff --git a/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs b/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs index d8c87a90ee..360f86eebe 100644 --- a/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs +++ b/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs @@ -140,12 +140,7 @@ public sealed class LogicGateSystem : EntitySystem { comp.LastOutput = output; - var data = new NetworkPayload - { - [DeviceNetworkConstants.LogicState] = output ? SignalState.High : SignalState.Low - }; - - _deviceLink.InvokePort(uid, comp.OutputPort, data); + _deviceLink.SendSignal(uid, comp.OutputPort, output); } } } diff --git a/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs b/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs index 7da8532f2e..7bcc438b92 100644 --- a/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs +++ b/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs @@ -30,15 +30,11 @@ public sealed class SignalSwitchSystem : EntitySystem comp.State = !comp.State; _deviceLink.InvokePort(uid, comp.State ? comp.OnPort : comp.OffPort); - var data = new NetworkPayload - { - [DeviceNetworkConstants.LogicState] = comp.State ? SignalState.High : SignalState.Low - }; // only send status if it's a toggle switch and not a button if (comp.OnPort != comp.OffPort) { - _deviceLink.InvokePort(uid, comp.StatusPort, data); + _deviceLink.SendSignal(uid, comp.StatusPort, comp.State); } _audio.PlayPvs(comp.ClickSound, uid, AudioParams.Default.WithVariation(0.125f).WithVolume(8f)); diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs index 75204d4885..d17093c294 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -66,7 +66,7 @@ namespace Content.Server.DeviceNetwork.Systems /// The frequency to send on /// The data to be sent /// Returns true when the packet was successfully enqueued. - public bool QueuePacket(EntityUid uid, string? address, NetworkPayload data, uint? frequency = null, DeviceNetworkComponent? device = null) + public bool QueuePacket(EntityUid uid, string? address, NetworkPayload data, uint? frequency = null, int? network = null, DeviceNetworkComponent? device = null) { if (!Resolve(uid, ref device, false)) return false; @@ -79,7 +79,9 @@ namespace Content.Server.DeviceNetwork.Systems if (frequency == null) return false; - _nextQueue.Enqueue(new DeviceNetworkPacketEvent(device.DeviceNetId, address, frequency.Value, device.Address, uid, data)); + network ??= device.DeviceNetId; + + _nextQueue.Enqueue(new DeviceNetworkPacketEvent(network.Value, address, frequency.Value, device.Address, uid, data)); return true; } diff --git a/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs index 384e701d24..758a333c7a 100644 --- a/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs @@ -17,7 +17,7 @@ namespace Content.Server.DeviceNetwork.Systems /// private void OnBeforePacketSent(EntityUid uid, WiredNetworkComponent component, BeforePacketSentEvent args) { - if (EntityManager.GetComponent(uid).GridUid != args.SenderTransform.GridUid) + if (Transform(uid).GridUid != args.SenderTransform.GridUid) { args.Cancel(); } diff --git a/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs index cbf591624d..b27ef52eca 100644 --- a/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs @@ -20,8 +20,11 @@ namespace Content.Server.DeviceNetwork.Systems var ownPosition = args.SenderPosition; var xform = Transform(uid); + // not a wireless to wireless connection, just let it happen + if (!TryComp(args.Sender, out var sendingComponent)) + return; + if (xform.MapID != args.SenderTransform.MapID - || !TryComp(args.Sender, out var sendingComponent) || (ownPosition - xform.WorldPosition).Length() > sendingComponent.Range) { args.Cancel(); diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs index 6e08224778..4dea3d23e1 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs +++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs @@ -111,7 +111,7 @@ public sealed class MailingUnitSystem : EntitySystem [NetTarget] = component.Target }; - _deviceNetworkSystem.QueuePacket(uid, null, payload, null, device); + _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); } /// @@ -129,7 +129,7 @@ public sealed class MailingUnitSystem : EntitySystem }; component.TargetList.Clear(); - _deviceNetworkSystem.QueuePacket(uid, null, payload, null, device); + _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); } /// diff --git a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl index 02ede1e1b6..154f20eee7 100644 --- a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl +++ b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl @@ -8,7 +8,7 @@ signal-port-name-off-transmitter = Off signal-port-description-off-transmitter = This port is invoked whenever the transmitter is turned off. signal-port-name-status-transmitter = Status -signal-port-description-logic-output = This port is invoked with HIGH or LOW depending on the transmitter status. +signal-port-description-status-transmitter = This port is invoked with HIGH or LOW depending on the transmitter status. signal-port-name-left = Left signal-port-description-left = This port is invoked whenever the lever is moved to the leftmost position. @@ -36,3 +36,12 @@ signal-port-description-logic-output-high = This port is invoked whenever the in signal-port-name-logic-output-low = Low Output signal-port-description-logic-output-low = This port is invoked whenever the input has a falling edge. + +signal-port-name-air-danger = Danger +signal-port-description-air-danger = This port is invoked with HIGH when in danger mode and LOW when not. + +signal-port-name-air-warning = Warning +signal-port-description-air-warning = This port is invoked with HIGH when in warning mode and LOW when not. + +signal-port-name-air-normal = Normal +signal-port-description-air-normal = This port is invoked with HIGH when in normal mode and LOW when not. diff --git a/Resources/Prototypes/DeviceLinking/source_ports.yml b/Resources/Prototypes/DeviceLinking/source_ports.yml index 45ee812f2e..73e96978a7 100644 --- a/Resources/Prototypes/DeviceLinking/source_ports.yml +++ b/Resources/Prototypes/DeviceLinking/source_ports.yml @@ -96,3 +96,21 @@ name: signal-port-name-logic-output-low description: signal-port-description-logic-output-low defaultLinks: [ Off, Close ] + +- type: sourcePort + id: AirDanger + name: signal-port-name-air-danger + description: signal-port-description-air-danger + defaultLinks: [ DoorBolt ] + +- type: sourcePort + id: AirWarning + name: signal-port-name-air-warning + description: signal-port-description-air-warning + defaultLinks: [ DoorBolt ] + +- type: sourcePort + id: AirNormal + name: signal-port-name-air-normal + description: signal-port-description-air-normal + defaultLinks: [ DoorBolt ] diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml index cd6a438ce6..d1c13736f0 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml @@ -2,6 +2,10 @@ id: AirAlarm name: air alarm description: An air alarm. Alarms... air? + placement: + mode: SnapgridCenter + snap: + - Wallmount components: - type: WallMount - type: ApcPowerReceiver @@ -16,14 +20,22 @@ prefix: device-address-prefix-air-alarm sendBroadcastAttemptEvent: true - type: WiredNetworkConnection + # for output status ports + - type: WirelessNetworkConnection + range: 200 - type: DeviceList - type: DeviceNetworkRequiresPower + - type: DeviceLinkSource + ports: + - AirDanger + - AirWarning + - AirNormal - type: AtmosAlarmable syncWith: - - AirAlarm - - AirSensor - - GasVent - - GasScrubber + - AirAlarm + - AirSensor + - GasVent + - GasScrubber - type: AtmosAlarmableVisuals layerMap: "airAlarmBase" alarmStates: @@ -85,15 +97,15 @@ - !type:PlaySoundBehavior sound: path: /Audio/Effects/metalbreak.ogg - placement: - mode: SnapgridCenter - snap: - - Wallmount - type: entity id: AirAlarmAssembly name: air alarm assembly description: An air alarm. Doesn't look like it'll be alarming air any time soon. + placement: + mode: SnapgridCenter + snap: + - Wallmount components: - type: WallMount - type: Clickable @@ -115,7 +127,3 @@ node: assembly - type: Transform anchored: true - placement: - mode: SnapgridCenter - snap: - - Wallmount From 376521d818ecef4d97afa94d625cd8ddc8ce521c Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 17:19:35 -0400 Subject: [PATCH 14/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fa58b1805e..413009ff00 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Slava0135 - changes: - - {message: added rare immovable rod event that can happen late in the game and - can literally cut through entire station, type: Add} - - {message: immovable rods now move on spawn by default, type: Fix} - - {message: you can now warp to immovable rod as ghost, type: Tweak} - id: 4151 - time: '2023-07-02T13:40:07.0000000+00:00' - author: brainfood1183 changes: - {message: Fixed Hamlet sprite error on revival., type: Fix} @@ -3031,3 +3023,8 @@ Entries: - {message: Changed medical locker contents, type: Tweak} id: 4650 time: '2023-08-21T18:49:22.0000000+00:00' +- author: deltanedas + changes: + - {message: Air alarms now have output signal ports for each state., type: Tweak} + id: 4651 + time: '2023-08-21T21:18:30.0000000+00:00' From 3f2ea17bb7a584f9d3ecdc333c5414f4b2005f3c Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 21 Aug 2023 22:05:24 -0400 Subject: [PATCH 15/28] fix species skin colors (#19417) --- .../Humanoid/HumanoidCharacterAppearance.cs | 6 +++--- Content.Shared/Humanoid/SkinColor.cs | 2 +- .../Prototypes/Datasets/Names/skeleton_first.yml | 12 +++++++++--- Resources/Prototypes/Species/diona.yml | 1 + Resources/Prototypes/Species/skeleton.yml | 1 + 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs index 134f71fc27..4c7dca14c0 100644 --- a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs @@ -163,9 +163,9 @@ namespace Content.Shared.Humanoid break; case HumanoidSkinColor.Hues: case HumanoidSkinColor.TintedHues: - var rbyte = random.Next(0, 255); - var gbyte = random.Next(0, 255); - var bbyte = random.Next(0, 255); + var rbyte = random.NextByte(); + var gbyte = random.NextByte(); + var bbyte = random.NextByte(); newSkinColor = new Color(rbyte, gbyte, bbyte); break; } diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 44f69bf6aa..b38b426a19 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -118,7 +118,7 @@ public static class SkinColor public static Color TintedHues(Color color) { var newColor = Color.ToHsv(color); - newColor.Y = .1f; + newColor.Y *= 0.1f; return Color.FromHsv(newColor); } diff --git a/Resources/Prototypes/Datasets/Names/skeleton_first.yml b/Resources/Prototypes/Datasets/Names/skeleton_first.yml index 67c71ab69b..396a2637d7 100644 --- a/Resources/Prototypes/Datasets/Names/skeleton_first.yml +++ b/Resources/Prototypes/Datasets/Names/skeleton_first.yml @@ -12,13 +12,19 @@ - Radius - Ulna - Carpals - - Phanages + - Phalanges - Pelvis - Femur - Tibia - Fibula - Marrow - - Tarsalls + - Tarsals - Patella - Tailbone - - Boner \ No newline at end of file + - Boner + - Rib + - Hyoid + - Coccyx + - Tarsus + - Lacrimal + - Bone diff --git a/Resources/Prototypes/Species/diona.yml b/Resources/Prototypes/Species/diona.yml index a2ef013b05..3f81007889 100644 --- a/Resources/Prototypes/Species/diona.yml +++ b/Resources/Prototypes/Species/diona.yml @@ -4,6 +4,7 @@ roundStart: true prototype: MobDiona sprites: MobDionaSprites + defaultSkinTone: "#cdb369" markingLimits: MobDionaMarkingLimits dollPrototype: MobDionaDummy skinColoration: Hues diff --git a/Resources/Prototypes/Species/skeleton.yml b/Resources/Prototypes/Species/skeleton.yml index b0e41ca30b..c4dc954662 100644 --- a/Resources/Prototypes/Species/skeleton.yml +++ b/Resources/Prototypes/Species/skeleton.yml @@ -4,6 +4,7 @@ roundStart: false prototype: MobSkeletonPerson sprites: MobSkeletonSprites + defaultSkinTone: "#fff9e2" markingLimits: MobHumanMarkingLimits maleFirstNames: skeletonNamesFirst femaleFirstNames: skeletonNamesFirst From 5b6d545f5f524ddfc4f24302bf9d4c5763ed431c Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 22:06:28 -0400 Subject: [PATCH 16/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 413009ff00..291da363ee 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: brainfood1183 - changes: - - {message: Fixed Hamlet sprite error on revival., type: Fix} - id: 4152 - time: '2023-07-03T07:59:29.0000000+00:00' - author: HerCoyote23 changes: - {message: You can now speak on your department's radio channel using .X, type: Tweak} @@ -3028,3 +3023,9 @@ Entries: - {message: Air alarms now have output signal ports for each state., type: Tweak} id: 4651 time: '2023-08-21T21:18:30.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Freshly spawned diona are no longer gray., type: Fix} + - {message: Skeletons are no longer extremely saturated in color., type: Fix} + id: 4652 + time: '2023-08-22T02:05:24.0000000+00:00' From 9bf20c7f9b4df653955525a64448d99a910fb7a0 Mon Sep 17 00:00:00 2001 From: VelonacepsCalyxEggs <48419312+VelonacepsCalyxEggs@users.noreply.github.com> Date: Tue, 22 Aug 2023 05:21:45 +0300 Subject: [PATCH 17/28] Random Grille Spawner for mappers. (#19416) * random grille textures * random grille prototype --- .../Entities/Markers/Spawners/Random/grille.yml | 16 ++++++++++++++++ .../Structures/Walls/random.rsi/meta.json | 14 ++++++++++++++ .../Walls/random.rsi/randomgrille.png | Bin 0 -> 3053 bytes 3 files changed, 30 insertions(+) create mode 100644 Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml create mode 100644 Resources/Textures/Structures/Walls/random.rsi/meta.json create mode 100644 Resources/Textures/Structures/Walls/random.rsi/randomgrille.png diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml new file mode 100644 index 0000000000..3f5be4fdb1 --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml @@ -0,0 +1,16 @@ +- type: entity + name: Random Grille Spawner + id: GrilleSpawner + parent: MarkerBase + components: + - type: Sprite + layers: + - sprite: Structures/Walls/random.rsi + state: randomgrille + - type: RandomSpawner + prototypes: + - Grille + - GrilleBroken + chance: 1.0 + placement: + mode: AlignTileAny diff --git a/Resources/Textures/Structures/Walls/random.rsi/meta.json b/Resources/Textures/Structures/Walls/random.rsi/meta.json new file mode 100644 index 0000000000..e3c7e14411 --- /dev/null +++ b/Resources/Textures/Structures/Walls/random.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Grille sprite taken from https://github.com/tgstation/tgstation at commit 17c603f1d037f22081d446b9a3f3ae8d41f52e86", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "randomgrille" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Walls/random.rsi/randomgrille.png b/Resources/Textures/Structures/Walls/random.rsi/randomgrille.png new file mode 100644 index 0000000000000000000000000000000000000000..d01d60ae824d4e4ed08efa48214d89196748a3c0 GIT binary patch literal 3053 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D3usA1K~z{rJy&Ur zBxMg%pPs_*;m>7H{BAO=HRqCrh0qLKImLSn##LEe`k148W_qTts_w4x`D&1vys4_L<9pucect0!GMS9> zv)1R#V!nVzZ4>v$|1KVDea+0~%Ba*^I1&Gyc%XH=8OfAzvDwB8@h8NWTPI8{o5zJl z6X)V5MXY_oOcV=PZZ5$HJ|-s09cJ-p5=*=9!&7@z?0?}?X7S1hR@&zgKD{os@Aa9p zmzQyIX%Whc>h+cb4$Mx^pt8IM0TrfgZj5Oonoi41E#T~G6Fs=lffIYQeJDIC7$_#P zb2B)%@(~Qj2qSHPv6mL!!z8o^Gupx2)mfZxyazMT2Rvg~o)I7{C~uU$Wv$nnm@dtr zTB#wMEeKo4ZI8!1>j61X4xlZXXv{(NzT6qY*AO8%WcEbE}I;mNIaJ zfw87z9PFa&-okR{L(CqN0NzFZvN+r!0n=;1QV8H>_48yvV5T&UwMw0!T=wD?ZKAj_ zfrkuukS@;SLUjWJ%R?4an~ARCK$qBF$UbJS$`Qc( zn2-TW@let&KK{`4Vab zkVxd=bO-HFNDzI)f!gLCl7%@et!*KgEWmX62tcJdusfPyWor}BsUkjVtRR?A!eq>c zt}#Iv*jM&Z*{WdbNRa@RpuD7hnm#Lh74!jQKp_Ky0H#o{t@9U^<|Y%=1VKoXOr-O3 zSgy6~3^DlIkoSjtR$8Cpj1~$^(=~MIS>HKEmo`+#7!b(FH9>xX04mE655yaM#EDF{ zK;a2$phg*)Fh)II8~9G*oFJ)4Cw+XXhwml+Cft;sFt!P!hldl-2_NszBtr=D`O}G$ zB4U~F4Rk~%0`G)=EW(Bhhr%TU`plm3&xNP-RS<^ikop zLV+pr%pyF+iM$<>O*=cJF3gXan9yuS3iEbI4BpfEj4ngMEa}s!9(56!D&V7f6+OB) zpi4u#ZIWB%_3~ZTdaX(TQv|SxTsj7ii%(c18;GtCu(`2`VxfrI+B%ZS9KN{w8YYto zOjCY>VRJa}*X*NMu5KZkDluw)7?zviaA4ms8S@sxeE&kd4qrNjiN{TF^6LcfEA#;WI>t)5~HRh0I3fqH4Owny*pXYaEKDrPgp=pe98BXPs$^6oa&yR+FGH>*?I_~uS-#}A z&6G@}%E&Y43xyfHmAwJ)anVPGz<-L@!=gYX6EWH%ZA37+Y=EG<6mE~pbjd^*3#BA2 zg(Fib%%vj;@vSJGjS`CT6ZH|x$rwwMneMV#Ffc;~n$?T^$iQa7VKbr2U~s81Zr0A= zw|jf2@oGrBUsdsIT*EK8`6UmgrjKB0xxsTU9r=G9Armyob-p-*)oK;u>G(6EPfvsC z87`&aWc-&xw|wX_cSlkaiPxDpek8~Q__5m(7sNOHXK@V|XYu46;9h3Io9VCE(z-AH z9#g1`k>0kMcrgA)VKb2p5k?=6#Ge&jKIb$#T#a(PLw$<SfdgVeK>uZa|KE$oTf8dJkZQRGjrJ8SL?EjU%4lC6fJro~%DZ8pfu%8GsqTFsMKmmWKx_bG?X}?xr35CM&Ht8+k-*GiuH82yGULKgAysJ1o8KOo8K; z8&9(TcL`l#h+C3uPhpq~&BKP&rI^CJuOc)Yz5}Gf!KU75HRhVOjPuBpUto(PV+S z4X2<|`A*h@-w&>}vxF^-9_u`gku7FWS*!Bg;=i!jkQ0aWUe29U1x{epjB@PQ%a*1R z4Lg@>M9R8j?6M6X=0LKw%-E;Wh^hj9hQ!D6?9w^sZB{XtjbXcS3Avch)`a9op=QRT zeQdPq$WRljYb!`*64V5R$oc_`Nvw~txxR%`p^R#E4NCIzA6jCf!ZCJ2W$LMh3eQNz zq1-GsmZ*ubT-<_>g7aHr1PDZy)`eUGJM|@-5l#RMiL4c}W(?@H&h8mUwYE$#j%`L{ zi+9#!6hqk8dab&8Ibb$^(OSXS_#->?KdpPf34l@A+m^u2HnJWzRb=`NZIFGC|k(jp^%IufETg0uj&5wJ5w$808w z7B?m`OC$?|4jj}-YC|zlD5hEYmUum}?VuU6m6vZmcCurzU#A1u-fMFMl0`HbLnsRy;c$tm?3N}D(NG3w2#ZhdGg=_*H4xw^pc98+837LLU7jo<`P9>@Oi}YFNHFrhQ zs4WpbT@hxagMqfeEz~ajZ@eic+)5=c_hA&_=BxFr7zT#uIQGzUk5ThIBsvVQJDbH0 zWBUirfE^OQO<-LH;{<0!omvPdr%7~xGbDS7;)hPnfRepS?nAh_$s~&m6N{4j)U1UG zYcoyJy)+M$o)6Q>qgXxDg4hedvB!awrjiY{>w(6P9b((w;a)PxvKOHzVM>bI4|_26 zN=@Wr*r;*F^-r_VYt&otevUqU_|g65WG zNP^&ob-0K2#wv=u->4IS>-hr5Q<*Z{8BhyS4@zG{nE0cs)}N3&7G{{Vv` v`q(HLR#yN301jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjfBa4&G literal 0 HcmV?d00001 From 82d39edad8bbe23fb99dc1ce34edca0e26f95911 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 21 Aug 2023 22:22:49 -0400 Subject: [PATCH 18/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 291da363ee..2cbed15ac0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: HerCoyote23 - changes: - - {message: You can now speak on your department's radio channel using .X, type: Tweak} - id: 4153 - time: '2023-07-03T08:55:08.0000000+00:00' - author: EmoGarbage404 changes: - {message: Artifacts now make noises when activated., type: Add} @@ -3029,3 +3024,9 @@ Entries: - {message: Skeletons are no longer extremely saturated in color., type: Fix} id: 4652 time: '2023-08-22T02:05:24.0000000+00:00' +- author: func_kenobi + changes: + - {message: "CentComm allowed the station architectors to place Schr\xF6dinger's\ + \ grilles.", type: Add} + id: 4653 + time: '2023-08-22T02:21:45.0000000+00:00' From 1ec014cf3900a3d556d30d96b65b328423df4195 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Tue, 22 Aug 2023 16:08:12 +1200 Subject: [PATCH 19/28] Remove prototype ignore lists from some tests (#19366) --- Content.Client/Stealth/StealthSystem.cs | 3 ++- Content.IntegrationTests/Tests/EntityTest.cs | 7 ------- .../Tests/Minds/MindTests.EntityDeletion.cs | 2 +- .../Tests/PrototypeSaveTest.cs | 17 +---------------- .../Generation/Singularity/singularity.yml | 9 ++++++++- .../Structures/Storage/Closets/big_boxes.yml | 3 ++- 6 files changed, 14 insertions(+), 27 deletions(-) diff --git a/Content.Client/Stealth/StealthSystem.cs b/Content.Client/Stealth/StealthSystem.cs index 2dc61f03f2..7cf6e54639 100644 --- a/Content.Client/Stealth/StealthSystem.cs +++ b/Content.Client/Stealth/StealthSystem.cs @@ -63,7 +63,8 @@ public sealed class StealthSystem : SharedStealthSystem private void OnShutdown(EntityUid uid, StealthComponent component, ComponentShutdown args) { - SetShader(uid, false, component); + if (!Terminating(uid)) + SetShader(uid, false, component); } private void OnShaderRender(EntityUid uid, StealthComponent component, BeforePostShaderRenderEvent args) diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index a6d7bf30f8..d89668d4b4 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -153,17 +153,10 @@ namespace Content.IntegrationTests.Tests .Select(p => p.ID) .ToList(); - // for whatever reason, stealth boxes are breaking this test. Surplus crates have a chance of spawning them. - // TODO fix whatever is going wrong here. - HashSet ignored = new() { "GhostBox", "StealthBox", "CrateSyndicateSurplusBundle", "CrateSyndicateSuperSurplusBundle" }; - await server.WaitPost(() => { foreach (var protoId in protoIds) { - if (ignored.Contains(protoId)) - continue; - var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var ent = sEntMan.SpawnEntity(protoId, new EntityCoordinates(grid.Owner, 0.5f, 0.5f)); diff --git a/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs b/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs index 63bc52bbe8..0bace9fc5c 100644 --- a/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs +++ b/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs @@ -71,7 +71,7 @@ public sealed partial class MindTests [Test] public async Task TestGhostOnDeleteMap() { - await using var pairTracker = await SetupPair(); + await using var pairTracker = await SetupPair(dirty: true); var server = pairTracker.Pair.Server; var testMap = await PoolManager.CreateTestMap(pairTracker); var coordinates = testMap.GridCoords; diff --git a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs index 74123b5bc7..6823b2d58a 100644 --- a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs +++ b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs @@ -29,18 +29,9 @@ namespace Content.IntegrationTests.Tests; [TestFixture] public sealed class PrototypeSaveTest { - private readonly HashSet _ignoredPrototypes = new() - { - "Singularity", // physics collision uses "AllMask" (-1). The flag serializer currently fails to save this because this features un-named bits. - "constructionghost", - // Don't add to this list unless you have a good reason - // Or it is just temporary because tests stopped working and now master has too many broken entities. - }; - [Test] public async Task UninitializedSaveTest() { - // Apparently SpawnTest fails to clean up properly. Due to the similarities, I'll assume this also fails. await using var pairTracker = await PoolManager.GetServerClient(); var server = pairTracker.Pair.Server; @@ -92,9 +83,6 @@ public sealed class PrototypeSaveTest if (!prototype.MapSavable) continue; - if (_ignoredPrototypes.Contains(prototype.ID)) - continue; - if (prototype.SetSuffix == "DEBUG") continue; @@ -165,10 +153,7 @@ public sealed class PrototypeSaveTest var diff = compMapping.Except(protoMapping); if (diff != null && diff.Children.Count != 0) - { - var modComps = string.Join(",", diff.Keys.Select(x => x.ToString())); - Assert.Fail($"Prototype {prototype.ID} modifies component on spawn: {compName}. Modified fields: {modComps}"); - } + Assert.Fail($"Prototype {prototype.ID} modifies component on spawn: {compName}. Modified yaml:\n{diff}"); } else { diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index ad38290c37..d2fea2870a 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -17,6 +17,8 @@ colliderFixtureId: EventHorizonCollider consumerFixtureId: EventHorizonConsumer - type: GravityWell # To make the singularity attract things. + baseRadialAcceleration: 10 + maxRange: 4 - type: Fixtures fixtures: EventHorizonCollider: @@ -43,11 +45,16 @@ energy: 180 level: 1 radsPerLevel: 2 + energyLoss: 1 - type: RandomWalk # To make the singularity move around. + maxSpeed: 2.5 + minSpeed: 1.875 - type: SingularityDistortion - intensity: 20 + falloffPower: 2.529822 + intensity: 3645 - type: RadiationSource slope: 0.2 # its emit really far away + intensity: 2 - type: PointLight enabled: true radius: 10 diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml index f4033554ad..040aff42b4 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml @@ -50,7 +50,6 @@ - type: Tag tags: - DoorBumpOpener - - type: InteractionOutline - type: Construction graph: BaseBigBox node: basebigbox @@ -66,6 +65,7 @@ - type: Damageable damageModifierSet: FlimsyMetallic #Syndicate boxes should have a bit of protection - type: Stealth + hadOutline: true - type: StealthOnMove passiveVisibilityRate: -0.37 movementVisibilityRate: 0.20 @@ -74,6 +74,7 @@ id: BigBox parent: BaseBigBox components: + - type: InteractionOutline - type: Destructible thresholds: - trigger: From 7c5b9c497d7ac48eeb3e9a600a03d8d95f0eaba1 Mon Sep 17 00:00:00 2001 From: astriloqua <129308840+astriloqua@users.noreply.github.com> Date: Tue, 22 Aug 2023 04:21:50 +0000 Subject: [PATCH 20/28] Toilet Fix (#18622) Toilet Fix (#18622) --- Content.Server/Toilet/ToiletSystem.cs | 32 +++++++++++++++---- .../Locale/en-US/toilet/toilet-component.ftl | 2 ++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Content.Server/Toilet/ToiletSystem.cs b/Content.Server/Toilet/ToiletSystem.cs index 91685640a7..e749260e94 100644 --- a/Content.Server/Toilet/ToiletSystem.cs +++ b/Content.Server/Toilet/ToiletSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Popups; using Content.Shared.Toilet; using Content.Shared.Tools; using Content.Shared.Tools.Components; +using Content.Shared.Verbs; using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Random; @@ -37,10 +38,11 @@ namespace Content.Server.Toilet SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnInteractUsing); - SubscribeLocalEvent(OnInteractHand, new []{typeof(SharedBuckleSystem)}); + SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnSuicide); SubscribeLocalEvent(OnToiletPried); + SubscribeLocalEvent>(OnToggleSeatVerb); } private void OnSuicide(EntityUid uid, ToiletComponent component, SuicideEvent args) @@ -123,13 +125,26 @@ namespace Content.Server.Toilet } } - // just want to up/down seat? - // check that nobody seats on seat right now - if (TryComp(uid, out var strap) && strap.BuckledEntities.Count != 0) + args.Handled = true; + } + + private void OnToggleSeatVerb(EntityUid uid, ToiletComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess || !CanToggle(uid)) return; - ToggleToiletSeat(uid, component); - args.Handled = true; + var alterToiletSeatText = component.IsSeatUp ? Loc.GetString("toilet-seat-close") : Loc.GetString("toilet-seat-open"); + + var verb = new AlternativeVerb() + { + Act = () => { + if (CanToggle(uid)) + ToggleToiletSeat(uid, component); + }, + Text = alterToiletSeatText + }; + + args.Verbs.Add(verb); } private void OnExamine(EntityUid uid, ToiletComponent component, ExaminedEvent args) @@ -153,6 +168,11 @@ namespace Content.Server.Toilet UpdateSprite(uid, toilet); } + public bool CanToggle(EntityUid uid) + { + return TryComp(uid, out var strap) && strap.BuckledEntities.Count == 0; + } + public void ToggleToiletSeat(EntityUid uid, ToiletComponent? component = null) { if (!Resolve(uid, ref component)) diff --git a/Resources/Locale/en-US/toilet/toilet-component.ftl b/Resources/Locale/en-US/toilet/toilet-component.ftl index 2cbfdfbff1..7807759e42 100644 --- a/Resources/Locale/en-US/toilet/toilet-component.ftl +++ b/Resources/Locale/en-US/toilet/toilet-component.ftl @@ -5,3 +5,5 @@ toilet-component-suicide-head-message-others = {CAPITALIZE(THE($victim))} sticks toilet-component-suicide-head-message = You stick your head into {THE($owner)} and flush it! toilet-component-suicide-message-others = {CAPITALIZE(THE($victim))} bashes themselves with {THE($owner)}! toilet-component-suicide-message = You bash yourself with {THE($owner)}! +toilet-seat-close = Close Seat +toilet-seat-open = Open Seat From b0dad9ef32c8eea878bed014b0a76bd5ab24704e Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 22 Aug 2023 00:22:55 -0400 Subject: [PATCH 21/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2cbed15ac0..57f86365e8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - {message: Artifacts now make noises when activated., type: Add} - id: 4154 - time: '2023-07-03T11:14:27.0000000+00:00' - author: noudoit changes: - {message: Attempting to uncuff yourself damages you slightly, type: Tweak} @@ -3030,3 +3025,9 @@ Entries: \ grilles.", type: Add} id: 4653 time: '2023-08-22T02:21:45.0000000+00:00' +- author: astriloqua + changes: + - {message: NanoTransen has hired professionals to teach people how to use toilets. + Employees can now properly sit on toilets., type: Tweak} + id: 4654 + time: '2023-08-22T04:21:51.0000000+00:00' From bb2aa2bfdb5ee74ea5ffef0caeb3d23eb72cc4d9 Mon Sep 17 00:00:00 2001 From: kalane15 <118661099+kalane15@users.noreply.github.com> Date: Tue, 22 Aug 2023 07:28:45 +0300 Subject: [PATCH 22/28] Dropping stops examination (#19398) Dropping stops examination (#19398) --- Content.Client/Examine/ExamineSystem.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 180777f374..89a9486483 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -20,6 +20,8 @@ using Content.Shared.Eye.Blinding.Components; using Robust.Client; using static Content.Shared.Interaction.SharedInteractionSystem; using static Robust.Client.UserInterface.Controls.BoxContainer; +using Content.Shared.Interaction.Events; +using Content.Shared.Item; namespace Content.Client.Examine { @@ -50,6 +52,8 @@ namespace Content.Client.Examine SubscribeNetworkEvent(OnExamineInfoResponse); + SubscribeLocalEvent(OnExaminedItemDropped); + CommandBinds.Builder .Bind(ContentKeyFunctions.ExamineEntity, new PointerInputCmdHandler(HandleExamine, outsidePrediction: true)) .Register(); @@ -57,6 +61,19 @@ namespace Content.Client.Examine _idCounter = 0; } + private void OnExaminedItemDropped(EntityUid item, ItemComponent comp, DroppedEvent args) + { + if (!args.User.Valid) + return; + if (_playerManager.LocalPlayer == null) + return; + if (_examineTooltipOpen == null) + return; + + if (item == _examinedEntity && args.User == _playerManager.LocalPlayer.ControlledEntity) + CloseTooltip(); + } + public override void Update(float frameTime) { if (_examineTooltipOpen is not {Visible: true}) return; From ab93b38e1fde0494eaf433a013b06ca743a58a21 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 22 Aug 2023 00:29:48 -0400 Subject: [PATCH 23/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 57f86365e8..92bd6320d2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: noudoit - changes: - - {message: Attempting to uncuff yourself damages you slightly, type: Tweak} - id: 4155 - time: '2023-07-03T21:30:09.0000000+00:00' - author: dmnct changes: - {message: Added fun!, type: Add} @@ -3031,3 +3026,8 @@ Entries: Employees can now properly sit on toilets., type: Tweak} id: 4654 time: '2023-08-22T04:21:51.0000000+00:00' +- author: kalane15 + changes: + - {message: Dropping item stops its examination, type: Fix} + id: 4655 + time: '2023-08-22T04:28:45.0000000+00:00' From 93f85751f7ea03f50451c0ec5332e5e768acf0d6 Mon Sep 17 00:00:00 2001 From: Interrobang01 <113810873+Interrobang01@users.noreply.github.com> Date: Mon, 21 Aug 2023 21:43:37 -0700 Subject: [PATCH 24/28] Autocapitalize the word I in IC chat (#18633) --- Content.Server/Chat/Systems/ChatSystem.cs | 10 ++++++-- Content.Shared/Chat/SharedChatSystem.cs | 29 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 09064bd634..0c9ebe4790 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Linq; using System.Text; using Content.Server.Administration.Logs; @@ -199,8 +200,11 @@ public sealed partial class ChatSystem : SharedChatSystem bool shouldCapitalize = (desiredType != InGameICChatType.Emote); bool shouldPunctuate = _configurationManager.GetCVar(CCVars.ChatPunctuation); + // Capitalizing the word I only happens in English, so we check language here + bool shouldCapitalizeTheWordI = (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") + || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en"); - message = SanitizeInGameICMessage(source, message, out var emoteStr, shouldCapitalize, shouldPunctuate); + message = SanitizeInGameICMessage(source, message, out var emoteStr, shouldCapitalize, shouldPunctuate, shouldCapitalizeTheWordI); // Was there an emote in the message? If so, send it. if (player != null && emoteStr != message && emoteStr != null) @@ -677,11 +681,13 @@ public sealed partial class ChatSystem : SharedChatSystem } // ReSharper disable once InconsistentNaming - private string SanitizeInGameICMessage(EntityUid source, string message, out string? emoteStr, bool capitalize = true, bool punctuate = false) + private string SanitizeInGameICMessage(EntityUid source, string message, out string? emoteStr, bool capitalize = true, bool punctuate = false, bool capitalizeTheWordI = true) { var newMessage = message.Trim(); if (capitalize) newMessage = SanitizeMessageCapital(newMessage); + if (capitalizeTheWordI) + newMessage = SanitizeMessageCapitalizeTheWordI(newMessage, "i"); if (punctuate) newMessage = SanitizeMessagePeriod(newMessage); diff --git a/Content.Shared/Chat/SharedChatSystem.cs b/Content.Shared/Chat/SharedChatSystem.cs index 0517cfd2b9..24cf1c4649 100644 --- a/Content.Shared/Chat/SharedChatSystem.cs +++ b/Content.Shared/Chat/SharedChatSystem.cs @@ -162,4 +162,33 @@ public abstract class SharedChatSystem : EntitySystem message = char.ToUpper(message[0]) + message.Remove(0, 1); return message; } + + public string SanitizeMessageCapitalizeTheWordI(string message, string theWordI = "i") + { + if (string.IsNullOrEmpty(message)) + return message; + + for + ( + var index = message.IndexOf(theWordI); + index != -1; + index = message.IndexOf(theWordI, index + 1) + ) + { + // Stops the code If It's tryIng to capItalIze the letter I In the mIddle of words + // Repeating the code twice is the simplest option + if (index + 1 < message.Length && char.IsLetter(message[index + 1])) + continue; + if (index - 1 >= 0 && char.IsLetter(message[index - 1])) + continue; + + var beforeTarget = message.Substring(0, index); + var target = message.Substring(index, theWordI.Length); + var afterTarget = message.Substring(index + theWordI.Length); + + message = beforeTarget + target.ToUpper() + afterTarget; + } + + return message; + } } From 7df72a6c7244607c19eeff12c059578301930408 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Mon, 21 Aug 2023 21:43:52 -0700 Subject: [PATCH 25/28] Fix StealthSystem ensuring a comp on a terminating entity in tests (#19413) --- Content.Client/Stealth/StealthSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Stealth/StealthSystem.cs b/Content.Client/Stealth/StealthSystem.cs index 7cf6e54639..b60ffc2a40 100644 --- a/Content.Client/Stealth/StealthSystem.cs +++ b/Content.Client/Stealth/StealthSystem.cs @@ -44,7 +44,7 @@ public sealed class StealthSystem : SharedStealthSystem if (!enabled) { - if (component.HadOutline) + if (component.HadOutline && !TerminatingOrDeleted(uid)) EnsureComp(uid); return; } From 070d34c45844f2067172c949badb201c298c36d9 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Mon, 21 Aug 2023 21:44:00 -0700 Subject: [PATCH 26/28] Update RobustToolbox to f6c55085fe9a798a45b531c056f5545db1bf4475 (#19418) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 8a440d705f..f6c55085fe 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 8a440d705f753d4cec20e1a3d81b0c5fa77ef726 +Subproject commit f6c55085fe9a798a45b531c056f5545db1bf4475 From 6be5ec4f3f69d073268f3be3ffca19ca9ecf1a37 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 22 Aug 2023 00:44:41 -0400 Subject: [PATCH 27/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 92bd6320d2..2fe0ff63fd 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: dmnct - changes: - - {message: Added fun!, type: Add} - - {message: Removed fun!, type: Remove} - - {message: Changed fun!, type: Tweak} - - {message: Fixed fun!, type: Fix} - id: 4156 - time: '2023-07-03T21:31:53.0000000+00:00' - author: Geekyhobo changes: - {message: Nukie bundle prices have been adjusted for balance, type: Tweak} @@ -3031,3 +3023,9 @@ Entries: - {message: Dropping item stops its examination, type: Fix} id: 4655 time: '2023-08-22T04:28:45.0000000+00:00' +- author: Interrobang01 + changes: + - {message: The word "i" is now automatically capitalized in IC chat! Your pinky's + structural integrity is now safe!, type: Add} + id: 4656 + time: '2023-08-22T04:43:37.0000000+00:00' From 89b0dba68e2db81fc44b78174b6d6e1abcf99084 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Tue, 22 Aug 2023 16:55:52 +1200 Subject: [PATCH 28/28] Make the round end summary use recursive PVS overrides (#19083) --- .../GameTicking/GameTicker.RoundFlow.cs | 65 ++----------------- Content.Server/GameTicking/GameTicker.cs | 3 +- 2 files changed, 6 insertions(+), 62 deletions(-) diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 98794c9926..dbd029be84 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -7,7 +7,6 @@ using Content.Shared.GameTicking; using Content.Shared.Preferences; using JetBrains.Annotations; using Prometheus; -using Robust.Server.GameStates; using Robust.Server.Maps; using Robust.Server.Player; using Robust.Shared.Audio; @@ -46,22 +45,6 @@ namespace Content.Server.GameTicking [ViewVariables] private bool _startingRound; - /// - /// This is a list of players that are going to appear in the round-end - /// crew manifest so their children entities can be collected each update - /// and sent to far-away players. - /// - [ViewVariables] - private HashSet _expandPvsPlayers = new(); - - /// - /// This is the list of the children entities that should be sent to - /// all players at the end of the round, to keep distant characters from - /// looking naked in the crew manifest. - /// - [ViewVariables] - private HashSet _expandPvsEntities = new(); - [ViewVariables] private GameRunLevel _runLevel; @@ -81,16 +64,6 @@ namespace Content.Server.GameTicking } } - private void InitializeRoundFlow() - { - SubscribeLocalEvent(OnExpandPvs); - } - - private void OnEntityDeleted(EntityUid uid) - { - _expandPvsEntities.Remove(uid); - } - /// /// Returns true if the round's map is eligible to be updated. /// @@ -332,14 +305,6 @@ namespace Content.Server.GameTicking ShowRoundEndScoreboard(text); } - private void OnExpandPvs(ref ExpandPvsEvent args) - { - if (RunLevel != GameRunLevel.PostRound) - return; - - args.Entities.AddRange(_expandPvsEntities); - } - public void ShowRoundEndScoreboard(string text = "") { // Log end of round @@ -357,11 +322,6 @@ namespace Content.Server.GameTicking //Get the timespan of the round. var roundDuration = RoundDuration(); - // Should already be empty, but just in case. - _expandPvsEntities.Clear(); - _expandPvsPlayers.Clear(); - EntityManager.EntityDeleted += OnEntityDeleted; - //Generate a list of basic player info to display in the end round summary. var listOfPlayerInfo = new List(); // Grab the great big book of all the Minds, we'll need them for this. @@ -395,8 +355,9 @@ namespace Content.Server.GameTicking else if (mind.CurrentEntity != null && TryName(mind.CurrentEntity.Value, out var icName)) playerIcName = icName; - if (Exists(mind.OriginalOwnedEntity)) - _expandPvsPlayers.Add(mind.OriginalOwnedEntity.Value); + var entity = mind.OriginalOwnedEntity; + if (Exists(entity)) + _pvsOverride.AddGlobalOverride(entity.Value, recursive: true); var playerEndRoundInfo = new RoundEndMessageEvent.RoundEndPlayerInfo() { @@ -405,7 +366,7 @@ namespace Content.Server.GameTicking PlayerOOCName = contentPlayerData?.Name ?? "(IMPOSSIBLE: REGISTERED MIND WITH NO OWNER)", // Character name takes precedence over current entity name PlayerICName = playerIcName, - PlayerEntityUid = mind.OriginalOwnedEntity, + PlayerEntityUid = entity, Role = antag ? mind.AllRoles.First(role => role.Antagonist).Name : mind.AllRoles.FirstOrDefault()?.Name ?? Loc.GetString("game-ticker-unknown-role"), @@ -416,20 +377,6 @@ namespace Content.Server.GameTicking listOfPlayerInfo.Add(playerEndRoundInfo); } - // Recursively collect entities for the crew manifest. - void RecursePvsEntities(IEnumerable entities) - { - _expandPvsEntities.UnionWith(entities); - - foreach (var entity in entities) - { - if (TryComp(entity, out var xform)) - RecursePvsEntities(xform.ChildEntities); - } - } - - RecursePvsEntities(_expandPvsPlayers); - // This ordering mechanism isn't great (no ordering of minds) but functions var listOfPlayerInfoFinal = listOfPlayerInfo.OrderBy(pi => pi.PlayerOOCName).ToArray(); @@ -527,10 +474,6 @@ namespace Content.Server.GameTicking _allPreviousGameRules.Clear(); - EntityManager.EntityDeleted -= OnEntityDeleted; - _expandPvsPlayers.Clear(); - _expandPvsEntities.Clear(); - // Round restart cleanup event, so entity systems can reset. var ev = new RoundRestartCleanupEvent(); RaiseLocalEvent(ev); diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index fbe40ee6d6..d62fb2ac60 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -18,6 +18,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Roles; using Robust.Server; using Robust.Server.GameObjects; +using Robust.Server.GameStates; using Robust.Shared.Configuration; using Robust.Shared.Console; #if EXCEPTION_TOLERANCE @@ -40,6 +41,7 @@ namespace Content.Server.GameTicking [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly MindTrackerSystem _mindTracker = default!; [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly PvsOverrideSystem _pvsOverride = default!; [Dependency] private readonly IAdminLogManager _adminLogs = default!; [ViewVariables] private bool _initialized; @@ -70,7 +72,6 @@ namespace Content.Server.GameTicking "Overflow role does not have the correct name!"); InitializeGameRules(); InitializeReplays(); - InitializeRoundFlow(); _initialized = true; }