From cc25bb45eb5c1a2d1a0f43a937f9b9e82ea2e99b Mon Sep 17 00:00:00 2001 From: DoubleRiceEddiedd <149714181+DoubleRiceEddiedd@users.noreply.github.com> Date: Mon, 13 Nov 2023 07:05:32 +0800 Subject: [PATCH 001/121] Make cornmeal actually obtainable by botany (#21622) * Change the corn seed chemical to make it actually givs cornmeal * Balance cornmeal and nutrient production. --- Resources/Prototypes/Hydroponics/seeds.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml index 2c0a0c87c52..3f57bcc3de3 100644 --- a/Resources/Prototypes/Hydroponics/seeds.yml +++ b/Resources/Prototypes/Hydroponics/seeds.yml @@ -569,11 +569,11 @@ Nutriment: Min: 1 Max: 10 + PotencyDivisor: 20 + Cornmeal: + Min: 5 + Max: 15 PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - type: seed id: onion From 9d504ebc0f4b002583658164b1ae748bc7a7fafd Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 12 Nov 2023 18:06:39 -0500 Subject: [PATCH 002/121] 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 1cb9736cefb..2050a166ac8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,5 @@ Order: 1 Entries: -- author: kalane15 - changes: - - {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 @@ -2911,3 +2906,8 @@ Entries: as a ghost., type: Fix} id: 5154 time: '2023-11-12T18:36:00.0000000+00:00' +- author: eddiedd + changes: + - {message: Fresh harvested corn can actually be ground for cornmeal now., type: Fix} + id: 5155 + time: '2023-11-12T23:05:32.0000000+00:00' From a6419ba26f73144b40af852ab77ac30de98342d5 Mon Sep 17 00:00:00 2001 From: Chronophylos Date: Mon, 13 Nov 2023 00:14:26 +0100 Subject: [PATCH 003/121] Convert other attributions in Resources/Audio (#21609) * convert some attributions * use commit as source * use preferred copyright * update source with commit link * convert more attributions * finish Audio/Effects * convert attributions * convert attributions in Audio/Effects/Diseases * renamed to attributions.yml * convert attributions in Audio/Effects/Lightning * convert attributions in Audio/Effects/PowerSink * convert attributions in Audio/Effects/Shuttle * convert attributions in Audio/Effects/Weather * convert attributions in Audio/Magic * convert attributions in Audio/Voice/Reptilian * fix missing source field * use note in copyright field instead of SPDX style License Reference for Custom licenses --- .../Audio/Effects/Cargo/attributions.yml | 7 ++ Resources/Audio/Effects/Cargo/licenses.txt | 7 -- .../Audio/Effects/Diseases/attributions.yml | 14 +++ Resources/Audio/Effects/Diseases/license.txt | 3 - .../{licenses.yml => attributions.yml} | 5 +- .../Audio/Effects/Lightning/attributions.yml | 4 + .../Audio/Effects/Lightning/licenses.txt | 6 - .../Audio/Effects/PowerSink/attributions.yml | 9 ++ .../Audio/Effects/PowerSink/licenses.txt | 10 -- .../Audio/Effects/Shuttle/attributions.yml | 11 ++ Resources/Audio/Effects/Shuttle/licenses.txt | 7 -- .../Audio/Effects/Weather/attributions.yml | 23 ++++ Resources/Audio/Effects/Weather/licenses.txt | 23 ---- Resources/Audio/Effects/attributions.yml | 117 +++++++++++++++--- Resources/Audio/Effects/licenses.txt | 58 --------- Resources/Audio/Magic/attributions.yml | 18 +++ Resources/Audio/Magic/licenses.txt | 8 -- .../Audio/Voice/Reptilian/attritbutions.yml | 4 + Resources/Audio/Voice/Reptilian/license.txt | 4 - 19 files changed, 196 insertions(+), 142 deletions(-) create mode 100644 Resources/Audio/Effects/Cargo/attributions.yml delete mode 100644 Resources/Audio/Effects/Cargo/licenses.txt create mode 100644 Resources/Audio/Effects/Diseases/attributions.yml delete mode 100644 Resources/Audio/Effects/Diseases/license.txt rename Resources/Audio/Effects/Grenades/Supermatter/{licenses.yml => attributions.yml} (60%) create mode 100644 Resources/Audio/Effects/Lightning/attributions.yml delete mode 100644 Resources/Audio/Effects/Lightning/licenses.txt create mode 100644 Resources/Audio/Effects/PowerSink/attributions.yml delete mode 100644 Resources/Audio/Effects/PowerSink/licenses.txt create mode 100644 Resources/Audio/Effects/Shuttle/attributions.yml delete mode 100644 Resources/Audio/Effects/Shuttle/licenses.txt create mode 100644 Resources/Audio/Effects/Weather/attributions.yml delete mode 100644 Resources/Audio/Effects/Weather/licenses.txt delete mode 100644 Resources/Audio/Effects/licenses.txt create mode 100644 Resources/Audio/Magic/attributions.yml delete mode 100644 Resources/Audio/Magic/licenses.txt create mode 100644 Resources/Audio/Voice/Reptilian/attritbutions.yml delete mode 100644 Resources/Audio/Voice/Reptilian/license.txt diff --git a/Resources/Audio/Effects/Cargo/attributions.yml b/Resources/Audio/Effects/Cargo/attributions.yml new file mode 100644 index 00000000000..c3f950f9b56 --- /dev/null +++ b/Resources/Audio/Effects/Cargo/attributions.yml @@ -0,0 +1,7 @@ +- files: + - buzz_sigh.ogg + - buzz_two.ogg + - ping.ogg + copyright: '"buzz_sigh.ogg", "buzz_two.ogg", and "ping.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/tree/d6f15fb717e7c047f8befefabb4b7735b3c39a84/sound diff --git a/Resources/Audio/Effects/Cargo/licenses.txt b/Resources/Audio/Effects/Cargo/licenses.txt deleted file mode 100644 index 113b5869121..00000000000 --- a/Resources/Audio/Effects/Cargo/licenses.txt +++ /dev/null @@ -1,7 +0,0 @@ -The following sounds are taken from TGstation github (licensed under CC by 3.0): - - buzz_sigh.ogg from https://github.com/tgstation/tgstation/tree/d6f15fb717e7c047f8befefabb4b7735b3c39a84/sound - - buzz_two.ogg from https://github.com/tgstation/tgstation/tree/d6f15fb717e7c047f8befefabb4b7735b3c39a84/sound - - ping.ogg from https://github.com/tgstation/tgstation/tree/d6f15fb717e7c047f8befefabb4b7735b3c39a84/sound diff --git a/Resources/Audio/Effects/Diseases/attributions.yml b/Resources/Audio/Effects/Diseases/attributions.yml new file mode 100644 index 00000000000..c9972feddfc --- /dev/null +++ b/Resources/Audio/Effects/Diseases/attributions.yml @@ -0,0 +1,14 @@ +- files: [beepboop.ogg] + license: CC0-1.0 + copyright: '"beep boop.mp3" by Fidjo20 of Freesound.org' + source: https://freesound.org/people/Fidjo20/sounds/503526/ + +- files: [monkey1.ogg] + license: CC-BY-NC-4.0 + copyright: '"Howler Monkey - Single, Close, Costa Rica" by TRAVELcandies of Freesound.org' + source: https://freesound.org/people/TRAVELcandies/sounds/423396/ + +- files: [monkey2.ogg] + license: CC0-1.0 + copyright: '"Monkey screaming.wav" by Archeos of Freesound.org' + source: https://freesound.org/people/Archeos/sounds/325549/ diff --git a/Resources/Audio/Effects/Diseases/license.txt b/Resources/Audio/Effects/Diseases/license.txt deleted file mode 100644 index 412660da573..00000000000 --- a/Resources/Audio/Effects/Diseases/license.txt +++ /dev/null @@ -1,3 +0,0 @@ -beepboop.ogg taken from https://freesound.org/people/Fidjo20/sounds/503526/ -monkey1.ogg taken from https://freesound.org/people/TRAVELcandies/sounds/423396/ -monkey2.ogg taken from https://freesound.org/people/Archeos/sounds/325549/ diff --git a/Resources/Audio/Effects/Grenades/Supermatter/licenses.yml b/Resources/Audio/Effects/Grenades/Supermatter/attributions.yml similarity index 60% rename from Resources/Audio/Effects/Grenades/Supermatter/licenses.yml rename to Resources/Audio/Effects/Grenades/Supermatter/attributions.yml index a4b80f38303..4da11cd84e9 100644 --- a/Resources/Audio/Effects/Grenades/Supermatter/licenses.yml +++ b/Resources/Audio/Effects/Grenades/Supermatter/attributions.yml @@ -5,5 +5,6 @@ - whitehole_loop.ogg - whitehole_start.ogg - smbeep.ogg - license: "CC-BY-SA-3.0" - copyright: "Made by AlexMorgan3817 https://soundcloud.com/alexmorgan3817" + license: CC-BY-SA-3.0 + source: https://soundcloud.com/alexmorgan3817 + copyright: AlexMorgan3817 diff --git a/Resources/Audio/Effects/Lightning/attributions.yml b/Resources/Audio/Effects/Lightning/attributions.yml new file mode 100644 index 00000000000..fa6cc9d165f --- /dev/null +++ b/Resources/Audio/Effects/Lightning/attributions.yml @@ -0,0 +1,4 @@ +- files: [LightningShock.ogg] + license: CC-BY-NC-SA-3.0 + copyright: Citadel Station 13 + source: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5 diff --git a/Resources/Audio/Effects/Lightning/licenses.txt b/Resources/Audio/Effects/Lightning/licenses.txt deleted file mode 100644 index 65cf9df2dc0..00000000000 --- a/Resources/Audio/Effects/Lightning/licenses.txt +++ /dev/null @@ -1,6 +0,0 @@ -LightningShock.ogg taken from Citadel Station at commit: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5 - -- files: ["LightningShock.ogg"] - license: "CC-BY-NC-SA-3.0" - copyright: "LightningShock.ogg taken from Citadel Station." - source: "https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5" \ No newline at end of file diff --git a/Resources/Audio/Effects/PowerSink/attributions.yml b/Resources/Audio/Effects/PowerSink/attributions.yml new file mode 100644 index 00000000000..6248b982ff7 --- /dev/null +++ b/Resources/Audio/Effects/PowerSink/attributions.yml @@ -0,0 +1,9 @@ +- files: [electric.ogg] + license: CC0-1.0 + copyright: '"Electricity Shock 3 Full" by The-Sacha-Rush on Freesound.org' + source: https://freesound.org/people/The-Sacha-Rush/sounds/657802/ + +- files: [charge_fire.ogg] + license: CC-BY-3.0 + copyright: '"Electric Charge + Shot" by Teh_Bucket on Freesound.org. This is adapted from multiple works by dylanperitz, satanicupsman, CaptainGusterd, arightwizard, BigKahuna360, michael_grinnell, weaveofkev, MichelleGrobler, Alex_John73, sandyrb and breo2012 all of Freesound.org. The work by sandyrb is licensed under CC-BY-4.0.' + source: https://freesound.org/people/Teh_Bucket/sounds/518739/ diff --git a/Resources/Audio/Effects/PowerSink/licenses.txt b/Resources/Audio/Effects/PowerSink/licenses.txt deleted file mode 100644 index 52898e4710b..00000000000 --- a/Resources/Audio/Effects/PowerSink/licenses.txt +++ /dev/null @@ -1,10 +0,0 @@ -- files: ["electric.ogg"] - license: "CC0 1.0" - copyright: "The-Sacha-Rush" - source: "https://freesound.org/people/The-Sacha-Rush/sounds/657802/" - -- files: ["charge_fire.ogg"] - license: "CC BY 3.0" - copyright: "Teh_Bucket, dylanperitz, satanicupsman, CaptainGusterd, arightwizard, BigKahuna360, michael_grinnell, weaveofkev, MichelleGrobler, Alex_John73, sandyrb, breo2012" - source: "https://freesound.org/people/Teh_Bucket/sounds/518739/" - diff --git a/Resources/Audio/Effects/Shuttle/attributions.yml b/Resources/Audio/Effects/Shuttle/attributions.yml new file mode 100644 index 00000000000..60a665c5360 --- /dev/null +++ b/Resources/Audio/Effects/Shuttle/attributions.yml @@ -0,0 +1,11 @@ +- files: + - hyperspace_begin.ogg + - hyperspace_end.ogg + copyright: '"hyperspace_begin.ogg", and "hyperspace_end.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/tree/71a79f1f75902d2ccab27cbffb971b12b7ab042d/sound/runtime/hyperspace + +- files: [hyperspace_progress.ogg] + copyright: '"hyperspace_progress.ogg" by /tg/station. Modified for looping by metalgearsloth.' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/tree/71a79f1f75902d2ccab27cbffb971b12b7ab042d/sound/runtime/hyperspace diff --git a/Resources/Audio/Effects/Shuttle/licenses.txt b/Resources/Audio/Effects/Shuttle/licenses.txt deleted file mode 100644 index d6b07f68e8f..00000000000 --- a/Resources/Audio/Effects/Shuttle/licenses.txt +++ /dev/null @@ -1,7 +0,0 @@ -The following sounds are taken from TGstation github (licensed under CC by 3.0): - - hyperspace_begin.ogg taken from https://github.com/tgstation/tgstation/tree/71a79f1f75902d2ccab27cbffb971b12b7ab042d/sound/runtime/hyperspace - - hyperspace_end.ogg taken from https://github.com/tgstation/tgstation/tree/71a79f1f75902d2ccab27cbffb971b12b7ab042d/sound/runtime/hyperspace - - hyperspace_progress.ogg taken and modified for looping by metalgearsloth from https://github.com/tgstation/tgstation/tree/71a79f1f75902d2ccab27cbffb971b12b7ab042d/sound/runtime/hyperspace \ No newline at end of file diff --git a/Resources/Audio/Effects/Weather/attributions.yml b/Resources/Audio/Effects/Weather/attributions.yml new file mode 100644 index 00000000000..4300228743f --- /dev/null +++ b/Resources/Audio/Effects/Weather/attributions.yml @@ -0,0 +1,23 @@ +- files: + - rain.ogg + - snowstorm.ogg + - snowstorm_weak.ogg + - wind_2_1.ogg + - wind_2_2.ogg + - wind_3_1.ogg + - wind_4_1.ogg + - wind_4_2.ogg + - wind_5_1.ogg + license: CC-BY-SA-3.0 + copyright: '"rain.ogg", "snowstorm.ogg", "snowstorm_weak.ogg", "wind_2_1.ogg", "wind_2_2.ogg", "wind_3_1.ogg", "wind_4_1.ogg", "wind_4_2.ogg", "wind_5_1.ogg" by Citadel Station 13. Modified for looping.' + source: https://github.com/Citadel-Station-13/Citadel-Station-13-RP/tree/28e11dee540e61b6c42fa293c1e1da087c1c2b0a + +- files: [rain2.wav] + copyright: '"Natural Environments" by Varazuvi of SONNISS.com. See https://sonniss.com/gdc-bundle-license/ for license.' + license: Custom + source: https://gdc.sonniss.com + +- files: [rain_heavy.ogg] + copyright: '"RATH - Rain Hard Loop 08s" of SONNISS.com. See https://sonniss.com/gdc-bundle-license/ for license.' + license: Custom + source: https://gdc.sonniss.com diff --git a/Resources/Audio/Effects/Weather/licenses.txt b/Resources/Audio/Effects/Weather/licenses.txt deleted file mode 100644 index 7588e276b84..00000000000 --- a/Resources/Audio/Effects/Weather/licenses.txt +++ /dev/null @@ -1,23 +0,0 @@ -- files: - - rain.ogg - - snowstorm.ogg - - snowstorm_weak.ogg - - wind_2_1.ogg - - wind_2_2.ogg - - wind_3_1.ogg - - wind_4_1.ogg - - wind_4_2.ogg - - wind_5_1.ogg - license: "CC-BY-SA-3.0" - copyright: "Taken from https://github.com/Citadel-Station-13/Citadel-Station-13-RP/tree/28e11dee540e61b6c42fa293c1e1da087c1c2b0a and looped" - source: "https://github.com/Citadel-Station-13/Citadel-Station-13-RP/tree/28e11dee540e61b6c42fa293c1e1da087c1c2b0a" - -- files: ["rain2.wav"] - license: "Royalty free" - copyright: "Varazuvi - Natural Environments" - source: "Taken from Soniss.com - GDC" - -- files: ["rain_heavy.ogg"] - license: "Royalty free" - copyright: "RATH - Rain Hard Loop 08" - source: "Taken from Soniss.com - GDC" diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 7fd46a02417..252bc9ee14c 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -1,12 +1,12 @@ - files: ["balloon-pop"] license: "CC-BY-4.0" - copyright: "Taken from Aesterial-Arts on freesound.org and converted to mono by EmoGarbage404 (github)" + copyright: '"Balloon Pop" by Aesterial-Arts on Freesound.org. Cconverted to mono by EmoGarbage404 on GitHub.com' source: "https://freesound.org/people/Aesterial-Arts/sounds/633835/" - files: ["pill_insert.ogg", "pill_remove.ogg"] license: "CC-BY-NC-SA-3.0" copyright: "Amateur foley and audio editing by Bright0." - source: "https://github.com/Bright0" + source: "https://github.com/space-wizards/space-station-14/commit/26624f22f6329b1c8d3c122ddafff01da7277508" - files: ["teleport_arrival.ogg", "teleport_departure.ogg"] license: "CC-BY-SA-3.0" @@ -15,60 +15,149 @@ - files: ["sadtrombone.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "sadtrombone.ogg taken from Citadel Station." + copyright: "sadtrombone.ogg by Citadel Station 13" source: "https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5" - files: ["box_deploy.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "box_deploy.ogg taken from Citadel Station." + copyright: "box_deploy.ogg by Citadel Station 13" source: "https://github.com/Citadel-Station-13/Citadel-Station-13/commit/b604390f334343be80045d955705cf48ee056c61" - files: ["chime.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "chime.ogg taken from Citadel Station." + copyright: "chime.ogg by Citadel Station 13" source: "https://github.com/Citadel-Station-13/Citadel-Station-13/commit/b604390f334343be80045d955705cf48ee056c61" - files: ["tree_fell.ogg"] license: "CC0-1.0" - copyright: "Taken from felix.blume via freesound.org and cropped + mixed from stereo to mono." + copyright: '"Tree falls in a forest." by felix.blume of Freesound.org. Cropped and mixed from stereo to mono.' source: "https://freesound.org/people/felix.blume/sounds/414093/" - files: ["beep1.ogg"] license: "CC0-1.0" - copyright: "Taken from thisusernameis via freesound.org + mixed from stereo to mono." + copyright: '"beep1.wav" by thisusernameis of Freesound.org. Mixed from stereo to mono.' source: "https://freesound.org/people/thisusernameis/sounds/426891/" - files: ["hallelujah.ogg"] license: "CC-BY-SA-3.0" - copyright: "Composer: Georg Friedrich Händel; Performed by: MIT Concert Choir; Directed by William C. Cutter; + cropped and mixed from stereo to mono" + copyright: "Composer: Georg Friedrich Händel; Performed by: MIT Concert Choir; Directed by William C. Cutter; Cropped and mixed from stereo to mono." source: "https://en.wikipedia.org/wiki/File:Handel_-_messiah_-_44_hallelujah.ogg" - files: ["fence_rattle1.ogg", "fence_rattle2.ogg", "fence_rattle3.ogg"] license: "CC0-1.0" - copyright: "Taken from MWsfx via freesound.org and cropped + mixed from stereo to mono." + copyright: '"Chain Link Fence - Impacts.wav" by MWsfx of Freesound.org. Cropped and mixed from stereo to mono.' source: "https://freesound.org/people/MWsfx/sounds/575388/" - files: ["falling.ogg"] license: "CC0-1.0" - copyright: "Taken from MATRIXXX_ via freesound.org and mixed from stereo to mono." + copyright: '"Retro, Drop 02.wav" by MATRIXXX_ of Freesound.org. Mixed from stereo to mono.' source: "https://freesound.org/people/MATRIXXX_/sounds/415990/" - files: ["break_stone.ogg"] license: "CC-BY-SA-3.0" - copyright: "Taken from tgstation" + copyright: "tgstation" source: "https://github.com/tgstation/tgstation/blob/e3a835b96043fad1269ee7b0c3a6cb340a466f3a/sound/effects/break_stone.ogg" - files: ["waterswirl.ogg"] license: "CC-BY-4.0" - copyright: "Taken from InspectorJ via freesound.org and mixed from stereo to mono." + copyright: '"Water Swirl, Small, 16.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org. Mixed from stereo to mono.' source: "https://freesound.org/people/InspectorJ/sounds/398703/" - files: ["pop_high.ogg"] license: "CC-BY-4.0" - copyright: "Taken from InspectorJ via freesound.org and mixed from stereo to mono." + copyright: '"Pop, High, A (H1).wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org. Mixed from stereo to mono.' source: "https://freesound.org/people/InspectorJ/sounds/411642/" - files: ["sizzle.ogg"] license: "CC-BY-SA-3.0" copyright: "Recorded by deltanedas for SS14" - source: "https://github.com/deltanedas" + source: "https://github.com/space-wizards/space-station-14/commit/0a4c16ca21e266c24243119d944cbff8084829dd" + +- files: ["drop.ogg"] + copyright: '"FS Concrete Soldier Crouch N02" in "Soldier Footsteps" by Levan Nadashvili of SONNISS.com. See https://sonniss.com/gdc-bundle-license/ for license. Mixed from stereo to mono.' + license: Custom + source: https://gdc.sonniss.com + +- files: ["wall_bonk.ogg"] + copyright: '"Nuts and Bolts" by 344 Audio of SONNISS.com. See https://sonniss.com/gdc-bundle-license/ for license.' + license: Custom + source: https://gdc.sonniss.com + +- files: ["pop.ogg"] + copyright: '"pop.ogg" by mirrorcult of GitHub.com' + license: "CC0-1.0" + source: "https://github.com/space-wizards/space-station-14/blob/9168fc629c555b8c395d695d291faea1eeda1db6/Resources/Audio/Effects/pop.ogg" + +- files: + - demon_attack1.ogg + - demon_consume.ogg + - demon_dies.ogg + - bite.ogg + copyright: '"demon_attack1.ogg", "demon_consume.ogg", "demon_dies.ogg", and "bite.ogg" by /tg/station' + license: "CC-BY-SA-3.0" + source: "https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0" + +- files: ["bone_rattle.ogg"] + copyright: '"Rattling Bones.wav" by spookymodem of Freesound.org' + license: "CC0-1.0" + source: "https://freesound.org/people/spookymodem/sounds/202102/" + +- files: ["minibombcountdown.ogg"] + copyright: '"10 Second Countdown.wav" by Thomas Evdokimoff of Freesound.org' + license: "CC-BY-4.0" + source: "https://freesound.org/people/thomas_evdokimoff/sounds/202193/" + +- files: ["voteding.ogg"] + copyright: '"Bike, Bell Ding, Single, 01-01.wav" byInspectorJ (www.jshaw.co.uk) of Freesound.org; The volume has been reduced.' + license: "CC-BY-4.0" + source: "https://freesound.org/people/InspectorJ/sounds/484344/" + +- files: [smoke.ogg] + copyright: '"smoke.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/blob/a5d362ce84e4f0c61026236d5ec84d3c81553664/sound/effects/smoke.ogg + +- files: [double_beep.ogg] + copyright: '"Double Beep" by andersmmg of Freesound.org' + license: CC-BY-4.0 + source: https://freesound.org/people/andersmmg/sounds/511492/ + +- files: [saw.ogg] + copyright: '"01-1 Angle Grinder.wav" by domiscz of Freesound.org' + license: CC0-1.0 + source: https://freesound.org/people/domiscz/sounds/461728/ + +- files: [poster_being_set.ogg] + copyright: '"poster_being_created.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_being_created.ogg + +- files: [poster_broken.ogg] + copyright: '"poster_ripped.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg + +- files: [internals.ogg] + copyright: '"internals.ogg" by CEV-Eris. Edited by metalgearsloth to amplify volume.' + license: CC-BY-SA-3.0 + source: https://github.com/discordia-space/CEV-Eris/blob/f02a6e2c29b41c28b1cf4d8f897cb8f090f43552/sound/effects/internals.ogg + +- files: [holy.ogg] + copyright: '"AHHHH" by random_intruder of Freesound.org. Edited' + license: CC0-1.0 + source: https://freesound.org/people/random_intruder/sounds/392172/ + +- files: [fire.ogg] + copyright: '"Cardboard burning 2" by raremess of Freesound.org. Edited' + license: CC0-1.0 + source: https://freesound.org/people/raremess/sounds/222557/ + +- files: [hith_kick.ogg] + copyright: Taira Komori. See https://taira-komori.jpn.org/freesounden.html for license. + license: Custom + source: https://taira-komori.jpn.org/freesounden.html + +- files: [adminhelp.ogg] + copyright: '"jumps from reason.3.Rev.wav" by martian of Freesound.org. Modified by reversing and altering volume.' + license: CC0-1.0 + source: https://freesound.org/people/martian/sounds/19261/ diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt deleted file mode 100644 index 719cc77cd1f..00000000000 --- a/Resources/Audio/Effects/licenses.txt +++ /dev/null @@ -1,58 +0,0 @@ -adminhelp.ogg taken from https://github.com/tgstation/tgstation/blob/d775e1ac804eb9d0259573f5f29a18d320c97ef3/sound/effects/adminhelp.ogg - (available in master, therefore see master license: "All assets including icons and sound are under a Creative Commons 3.0 BY-SA license unless otherwise indicated.") - "Changed the adminhelpsound to some creative commons sound I pinched. Until somebody can get a better one. I'm sick of MAAAAAAAAOOOOOOW." - Actual source is https://freesound.org/people/martian/sounds/19261/ (CC0) - The sound had been reversed and the volume altered. - -hit_kick.ogg is made by Taira Komori -(https://taira-komori.jpn.org/freesounden.html) - -fire.ogg taken and edited from https://freesound.org/people/raremess/sounds/222557/ - -holy.ogg taken from https://freesound.org/people/random_intruder/sounds/392172/ and edited - -internals.ogg taken from CEV-Eris at https://github.com/discordia-space/CEV-Eris/blob/f02a6e2c29b41c28b1cf4d8f897cb8f090f43552/sound/effects/internals.ogg - Under license: CC BY-SA 3.0. Edited by metalgearsloth to amplify the volume - -poster_broken.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg - -poster_being_set.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg - -saw.ogg taken from https://freesound.org/people/domiscz/sounds/461728/ and clipped - CC0-1.0 -*It's actually an angle grinder - -double_beep.ogg taken from https://freesound.org/people/andersmmg/sounds/511492/ under CC BY 4.0 - -smoke.ogg taken from https://github.com/tgstation/tgstation/blob/a5d362ce84e4f0c61026236d5ec84d3c81553664/sound/effects/smoke.ogg - -voteding.ogg taken from "Bike, Bell Ding, Single, 01-01.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org at https://freesound.org/people/InspectorJ/sounds/484344/ under CC BY 3.0. The volume has been reduced. - -minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/people/thomas_evdokimoff/sounds/202193/ - -bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 - -bone_rattle.ogg licensed under CC0 1.0 and taken from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/ - -The following sounds are taken from TGstation github (licensed under CC by 3.0): - - demon_attack1.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 - - demon_consume.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 - - demon_dies.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 - -pop.ogg licensed under CC0 1.0 by mirrorcult - -box_deploy.ogg and chime.ogg taken from Citadel Station at commit: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/b604390f334343be80045d955705cf48ee056c61 - - - - files: - - "drop.ogg" - license: "Royalty free" - copyright: "Sonniss.com - GDC 2016 - Game Audio Bundle - Levan Nadashvili - Soldier Footsteps - FS Concrete Soldier Crouch N02, mixed from stereo to mono" - -- files: - - "wall_bonk.ogg" - license: "Royalty free" - copyright: "Sonniss.com - GDC 2023 - Game Audio Bundle - 344 Audio - Nuts and Bolts" - -# Do not add to this list, I only did the above because yaml scheme validator doesn't like custom licenses. diff --git a/Resources/Audio/Magic/attributions.yml b/Resources/Audio/Magic/attributions.yml new file mode 100644 index 00000000000..9efaf8ff91d --- /dev/null +++ b/Resources/Audio/Magic/attributions.yml @@ -0,0 +1,18 @@ +- files: [fireball.ogg] + copyright: '"fireball.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/commit/906fb0682bab6a0975b45036001c54f021f58ae7 + +- files: [disintegrate.ogg] + copyright: '"disintegrate.ogg" by /tg/station' + license: CC-BY-SA-3.0 + source: https://github.com/tgstation/tgstation/commit/6fde7a49fcd56d6edb844cd31a04ce026065de8b + +- files: + - forcewall.ogg + - knock.ogg + - blink.ogg + copyright: '"ForceWall.ogg", "Knock.ogg", and "blink.ogg" by Citadel Station 13' + license: CC-BY-SA-3.0 + source: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5 + diff --git a/Resources/Audio/Magic/licenses.txt b/Resources/Audio/Magic/licenses.txt deleted file mode 100644 index c8e93f558bd..00000000000 --- a/Resources/Audio/Magic/licenses.txt +++ /dev/null @@ -1,8 +0,0 @@ -https://github.com/Citadel-Station-13/Citadel-Station-13/blob/master/sound/magic/ForceWall.ogg -https://github.com/Citadel-Station-13/Citadel-Station-13/blob/master/sound/magic/blink.ogg -https://github.com/Citadel-Station-13/Citadel-Station-13/blob/master/sound/magic/Knock.ogg - -fireball.ogg taken from /tg/station at https://github.com/tgstation/tgstation/commit/906fb0682bab6a0975b45036001c54f021f58ae7 -disintegrate.ogg from /tg/station at https://github.com/tgstation/tgstation/commit/6fde7a49fcd56d6edb844cd31a04ce026065de8b - -copyright: CC BY-SA 3.0 diff --git a/Resources/Audio/Voice/Reptilian/attritbutions.yml b/Resources/Audio/Voice/Reptilian/attritbutions.yml new file mode 100644 index 00000000000..7e8b2a0ce39 --- /dev/null +++ b/Resources/Audio/Voice/Reptilian/attritbutions.yml @@ -0,0 +1,4 @@ +- files: [reptilian_scream.ogg] + copyright: '"scream_lizard.ogg" by Skyrat-SS13' + license: + source: https://github.com/Skyrat-SS13/Skyrat-tg/pull/892 diff --git a/Resources/Audio/Voice/Reptilian/license.txt b/Resources/Audio/Voice/Reptilian/license.txt deleted file mode 100644 index a38d32b6aa5..00000000000 --- a/Resources/Audio/Voice/Reptilian/license.txt +++ /dev/null @@ -1,4 +0,0 @@ -The sounds are taken from skyrag/tgdownstream -https://github.com/Skyrat-SS13/Skyrat-tg/pull/892 - -reptilian_scream.ogg \ No newline at end of file From 26986c6c7d5f82b07fa9fdeeefcf891d396cda67 Mon Sep 17 00:00:00 2001 From: Chronophylos Date: Mon, 13 Nov 2023 00:16:05 +0100 Subject: [PATCH 004/121] convert license.txt to attributions.yml in Voice/Human (#21591) * convert license.txt to attributions.yml * fix licenses identifiers * fix license identifer (again) * move incomplete attribution back --- Resources/Audio/Voice/Human/attributions.yml | 63 ++++++++++++++++++++ Resources/Audio/Voice/Human/license.txt | 24 -------- 2 files changed, 63 insertions(+), 24 deletions(-) diff --git a/Resources/Audio/Voice/Human/attributions.yml b/Resources/Audio/Voice/Human/attributions.yml index 42672b25ea0..0f6f9af2a84 100644 --- a/Resources/Audio/Voice/Human/attributions.yml +++ b/Resources/Audio/Voice/Human/attributions.yml @@ -49,3 +49,66 @@ license: "CC-BY-NC-4.0" copyright: "Taken from https://freesound.org/. Convert from WAV to OGG, is divided into several parts." source: "https://freesound.org/people/Idalize/sounds/408211/" + +- files: + - femalescream_1.ogg + - femalescream_2.ogg + - femalescream_3.ogg + - femalescream_4.ogg + - femalescream_5.ogg + - malescream_1.ogg + - malescream_2.ogg + - malescream_3.ogg + - malescream_4.ogg + - malescream_5.ogg + - malescream_6.ogg + - manlaugh_1.ogg + - manlaugh_2.ogg + - wilhelm_scream.ogg + - womanlaugh.ogg + license: "CC-BY-SA-3.0" + copyright: "/tg/station" + source: "https://github.com/tgstation/tgstation/commit/3d049e69fe71a0be2133005e65ea469135d648c8" + +- files: ["female_cough_1.ogg"] + license: "CC0-1.0" + copyright: "Ashe Kirk" + source: "https://freesound.org/people/OwlStorm/sounds/151213/" + +- files: ["female_cough_2.ogg"] + license: "CC0-1.0" + copyright: "thatkellytrna on freesound.org" + source: "https://freesound.org/people/thatkellytrna/sounds/425777/" + +- files: ["male_cough_2.ogg"] + license: "CC0-1.0" + copyright: "Harris85 on freesound.org" + source: "https://freesound.org/people/Harris85/sounds/208761/" + +- files: ["female_sneeze_1.ogg"] + license: "CC0-1.0" + copyright: "sherby168 on freesound.org" + source: "https://freesound.org/people/sherby168/sounds/540771/" + +- files: ["male_sneeze_1.ogg"] + license: "CC-BY-4.0" + copyright: "InspectorJ (www.jshaw.co.uk) of Freesound.org" + source: "https://freesound.org/people/InspectorJ/sounds/352177/" + +- files: ["male_yawn_1.ogg"] + license: "CC-BY-4.0" + copyright: "ckvoiceover on freesound.org" + source: "https://freesound.org/people/ckvoiceover/sounds/401338/" + +- files: ["female_yawn_1.ogg"] + license: "CC0-1.0" + copyright: "Reitanna on freesound.org" + source: "https://freesound.org/people/Reitanna/sounds/252239/" + +- files: + - snore1.ogg + - snore2.ogg + - snore3.ogg + license: "CC0-1.0" + copyright: "mattyharm on freesound.org" + source: "https://freesound.org/people/mattyharm/sounds/432995/" diff --git a/Resources/Audio/Voice/Human/license.txt b/Resources/Audio/Voice/Human/license.txt index d24b2874e49..85f3faa394e 100644 --- a/Resources/Audio/Voice/Human/license.txt +++ b/Resources/Audio/Voice/Human/license.txt @@ -1,25 +1 @@ -All below sounds taken from https://github.com/tgstation/tgstation/commit/3d049e69fe71a0be2133005e65ea469135d648c8 -femalescream_1 -femalescream_2 -femalescream_3 -femalescream_4 -femalescream_5 -malescream_1 -malescream_2 -malescream_3 -malescream_4 -malescream_5 -malescream_6 -manlaugh_1 -manlaugh_2 -wilhelm_scream -womanlaugh -female_cough_1.ogg taken from https://freesound.org/people/OwlStorm/sounds/151213/ -female_cough_2.ogg taken from https://freesound.org/people/thatkellytrna/sounds/425777/ and cropped male_cough_1.ogg taken from freesound (deleted user) -male_cough_2.ogg taken from https://freesound.org/people/Harris85/sounds/208761/ -female_sneeze_1.ogg taken from https://freesound.org/people/sherby168/sounds/540771/ -male_sneeze_1.ogg taken from https://freesound.org/people/InspectorJ/sounds/352177/ -male_yawn_1.ogg taken from https://freesound.org/people/ckvoiceover/sounds/401338/ user ckvoiceover CC-3.0 -female_yawn_1.ogg taken from https://freesound.org/people/Reitanna/sounds/252239/ user reitanna CC-0 -snore1, snore2, snore3.ogg taken from https://freesound.org/people/mattyharm/sounds/432995/ user mattyharm CC-0 From 7a6e93270bc4422a435690dfdb3cc1a75ef261bf Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 12 Nov 2023 23:18:48 +0000 Subject: [PATCH 005/121] egg rework (#21606) * egg and raw egg * add DamageEntity * boiling and exploding eggs --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Construction/Completions/DamageEntity.cs | 23 +++++++++++ .../Locale/en-US/flavors/flavor-profiles.ftl | 1 + .../meta/consumable/food/ingredients.ftl | 5 ++- .../en-US/reagents/meta/physical-desc.ftl | 1 + .../Entities/Objects/Consumable/Food/egg.yml | 38 ++++++++++++++++++- Resources/Prototypes/Flavors/flavors.yml | 5 +++ .../Reagents/Consumable/Food/ingredients.yml | 20 +++++++++- .../Recipes/Construction/Graphs/food/egg.yml | 22 +++++++++++ .../Recipes/Reactions/single_reagent.yml | 10 +++++ 9 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 Content.Server/Construction/Completions/DamageEntity.cs create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml diff --git a/Content.Server/Construction/Completions/DamageEntity.cs b/Content.Server/Construction/Completions/DamageEntity.cs new file mode 100644 index 00000000000..780194f2bf3 --- /dev/null +++ b/Content.Server/Construction/Completions/DamageEntity.cs @@ -0,0 +1,23 @@ +using Content.Shared.Construction; +using Content.Shared.Damage; +using Content.Shared.Damage.Systems; + +namespace Content.Server.Construction.Completions; + +/// +/// Damage the entity on step completion. +/// +[DataDefinition] +public sealed partial class DamageEntity : IGraphAction +{ + /// + /// Damage to deal to the entity. + /// + [DataField] + public DamageSpecifier Damage; + + public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager) + { + entityManager.System().TryChangeDamage(uid, Damage, origin: userUid); + } +} diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl index 3998429d1ce..db4629d64e7 100644 --- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl @@ -71,6 +71,7 @@ flavor-complex-bread = like bread flavor-complex-batter = like batter flavor-complex-butter = like butter flavor-complex-egg = like egg +flavor-complex-raw-egg = like raw egg flavor-complex-bacon = like bacon flavor-complex-chicken = like chicken flavor-complex-duck = like duck diff --git a/Resources/Locale/en-US/reagents/meta/consumable/food/ingredients.ftl b/Resources/Locale/en-US/reagents/meta/consumable/food/ingredients.ftl index 445e0b31143..603259f80f6 100644 --- a/Resources/Locale/en-US/reagents/meta/consumable/food/ingredients.ftl +++ b/Resources/Locale/en-US/reagents/meta/consumable/food/ingredients.ftl @@ -11,7 +11,10 @@ reagent-name-enzyme = universal enzyme reagent-desc-enzyme = Used in cooking various dishes. reagent-name-egg = egg -reagent-desc-egg = Used for baking. +reagent-desc-egg = Cooked chicken embryo, delicious. + +reagent-name-raw-egg = raw egg +reagent-desc-raw-egg = Used for baking. reagent-name-sugar = sugar reagent-desc-sugar = Tasty spacey sugar! diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl index 14e6e18239a..d5e21209c1c 100644 --- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl +++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl @@ -89,3 +89,4 @@ reagent-physical-desc-exotic-smelling = exotic smelling reagent-physical-desc-energizing = energizing reagent-physical-desc-exhilarating = exhilarating reagent-physical-desc-vibrant = vibrant +reagent-physical-desc-fluffy = fluffy diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml index 4f6d10d98f5..82070d420d7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml @@ -56,6 +56,16 @@ # Wow double-yolk you're so lucky! - !type:DoActsBehavior acts: [ "Destruction" ] + # all below are for egg cooking/exploding + - type: AtmosExposed + - type: Temperature + currentTemperature: 290 + - type: InternalTemperature + # ~1mm shell and ~1cm of albumen + thickness: 0.011 + area: 0.04 + # conductivity of egg shell based on a paper from Romanoff and Romanoff (1949) + conductivity: 0.456 # Splat - type: entity @@ -91,7 +101,6 @@ name: egg components: - type: Sprite - sprite: Objects/Consumable/Food/egg.rsi layers: - state: icon map: [ "enum.DamageStateVisualLayers.Base" ] @@ -101,3 +110,30 @@ icon: "" - enum.DamageStateVisualLayers.Base: white: "" + - type: Construction + graph: Egg + node: start + +- type: entity + parent: FoodEggBase + id: FoodEggBoiled + name: boiled egg + description: A delicious hardboiled egg. + components: + - type: Sprite + layers: + - state: icon + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: SolutionContainerManager + solutions: + food: + maxVol: 6 + reagents: + - ReagentId: EggCooked + Quantity: 6 + - type: Temperature + # preserve temperature from the boiling step + currentTemperature: 344 + - type: Construction + graph: Egg + node: boiled diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml index c4c518ad89b..5202c94498a 100644 --- a/Resources/Prototypes/Flavors/flavors.yml +++ b/Resources/Prototypes/Flavors/flavors.yml @@ -229,6 +229,11 @@ flavorType: Complex description: flavor-complex-egg +- type: flavor + id: raw-egg + flavorType: Complex + description: flavor-complex-raw-egg + - type: flavor id: bacon flavorType: Complex diff --git a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml index dfa85240647..84d00fa0c14 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml @@ -65,10 +65,26 @@ - type: reagent id: Egg + name: reagent-name-raw-egg + group: Foods + desc: reagent-desc-raw-egg + physicalDesc: reagent-physical-desc-mucus-like + flavor: raw-egg + color: white + recognizable: true + metabolisms: + Food: + effects: + - !type:AdjustReagent + reagent: UncookedAnimalProteins + amount: 0.5 + +- type: reagent + id: EggCooked name: reagent-name-egg group: Foods desc: reagent-desc-egg - physicalDesc: reagent-physical-desc-mucus-like + physicalDesc: reagent-physical-desc-fluffy flavor: egg color: white recognizable: true @@ -77,7 +93,7 @@ effects: - !type:AdjustReagent reagent: Protein - amount: 0.5 + amount: 1 - type: reagent id: Blackpepper diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml b/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml new file mode 100644 index 00000000000..f5eea53bcc2 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml @@ -0,0 +1,22 @@ +# egg explodes when heated!!! +- type: constructionGraph + id: Egg + start: start + graph: + - node: start + edges: + - to: boiled + steps: + - minTemperature: 344 + - node: boiled + entity: FoodEggBoiled + edges: + - to: explode + completed: + - !type:DamageEntity + damage: + Blunt: 10 + steps: + # egg explodes some time after the water in it boils and increases pressure, guessing ~110C + - minTemperature: 383 + - node: explode diff --git a/Resources/Prototypes/Recipes/Reactions/single_reagent.yml b/Resources/Prototypes/Recipes/Reactions/single_reagent.yml index cd15576d29d..5a40435471d 100644 --- a/Resources/Prototypes/Recipes/Reactions/single_reagent.yml +++ b/Resources/Prototypes/Recipes/Reactions/single_reagent.yml @@ -8,6 +8,16 @@ products: Protein: 0.5 +- type: reaction + id: EggCooking + impact: Low + minTemp: 344 + reactants: + Egg: + amount: 0.5 + products: + EggCooked: 0.5 + - type: reaction id: BloodToWine impact: Low From e7754124f6f9ee8fece97ca9f057a3d468bfbc68 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 12 Nov 2023 18:19:52 -0500 Subject: [PATCH 006/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2050a166ac8..08d0f257724 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- 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' - author: Errant changes: - {message: 'Mutes no longer make a sound when they die, and can''t fake their death @@ -2911,3 +2905,9 @@ Entries: - {message: Fresh harvested corn can actually be ground for cornmeal now., type: Fix} id: 5155 time: '2023-11-12T23:05:32.0000000+00:00' +- author: deltanedas + changes: + - {message: 'Raw eggs are no longer safe to eat, you have to make a dish or boil + them first.', type: Tweak} + id: 5156 + time: '2023-11-12T23:18:48.0000000+00:00' From 652abd9518ca490d68d0608993b3e33723efb241 Mon Sep 17 00:00:00 2001 From: Vasilis Date: Mon, 13 Nov 2023 00:24:07 +0100 Subject: [PATCH 007/121] Puppy Ian. Awwww (And a puppy crate) (#21508) * Awwww * May as well add a crate * forgor * Im dumb * Ok im done being dumb * You monster... --- .../catalog/fills/crates/livestock-crates.ftl | 5 ++++- .../Prototypes/Catalog/Cargo/cargo_livestock.yml | 10 ++++++++++ .../Prototypes/Catalog/Fills/Crates/npc.yml | 8 ++++++++ .../Entities/Markers/Spawners/mobs.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 2 ++ Resources/Prototypes/Entities/Mobs/NPCs/pets.yml | 16 ++++++++++++++++ 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/prototypes/catalog/fills/crates/livestock-crates.ftl b/Resources/Locale/en-US/prototypes/catalog/fills/crates/livestock-crates.ftl index 9742b83b340..78a4e3686ed 100644 --- a/Resources/Locale/en-US/prototypes/catalog/fills/crates/livestock-crates.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/fills/crates/livestock-crates.ftl @@ -19,6 +19,9 @@ ent-CrateNPCDuck = Duck crate ent-CrateNPCCorgi = Corgi crate .desc = A crate containing a single corgi. +ent-CrateNPCPuppyCorgi = Puppy Corgi crate + .desc = A crate containing a single puppy corgi. Awww. + ent-CrateNPCCow = Cow crate .desc = A crate containing a single cow. @@ -53,4 +56,4 @@ ent-CrateNPCLizard = Lizard crate .desc = A crate containing a lizard. ent-CrateNPCKangaroo = Kangaroo crate - .desc = A crate containing a kangaroo. \ No newline at end of file + .desc = A crate containing a kangaroo. diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml index d82e4d8d26c..86c79b133e7 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml @@ -68,6 +68,16 @@ category: Livestock group: market +- type: cargoProduct + id: LivestockPupCorgi + icon: + sprite: Mobs/Pets/corgi.rsi + state: puppy + product: CrateNPCPuppyCorgi + cost: 1200 + category: Livestock + group: market + - type: cargoProduct id: LivestockCow icon: diff --git a/Resources/Prototypes/Catalog/Fills/Crates/npc.yml b/Resources/Prototypes/Catalog/Fills/Crates/npc.yml index 6ff49fb8ec9..e9ac33c412d 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/npc.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/npc.yml @@ -77,6 +77,14 @@ contents: - id: MobCorgi +- type: entity + id: CrateNPCPuppyCorgi + parent: CrateLivestock + components: + - type: StorageFill + contents: + - id: MobCorgiPuppy + - type: entity id: CrateNPCCow parent: CrateLivestock diff --git a/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml b/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml index a4528c01b29..3655f9e5af9 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml @@ -31,6 +31,7 @@ - MobCorgiIan - MobCorgiIanOld - MobCorgiLisa + - MobCorgiIanPup - type: entity name: Possum Morty Spawner diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 22b1b348a75..72e8f41d1ba 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -2078,6 +2078,8 @@ states: Alive: Base: puppy + Critical: + Base: puppy_dead Dead: Base: puppy_dead - type: Grammar diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 5d05b8a62d5..4e0f1d3b85c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -83,6 +83,22 @@ proper: true gender: female +- type: entity + name: Puppy Ian + parent: MobCorgiPuppy + id: MobCorgiIanPup + description: Favourite puppy corgi. Awww. + components: + - type: Grammar + attributes: + proper: true + gender: male + - type: Butcherable # A puppy? You monster... + spawned: + - id: FoodMeatCorgi + amount: 2 + - id: MaterialHideCorgi + - type: entity name: Runtime parent: MobCat From 4dbbd68af4ceb1d7db29353eaa96e009236e4318 Mon Sep 17 00:00:00 2001 From: Whisper <121047731+QuietlyWhisper@users.noreply.github.com> Date: Sun, 12 Nov 2023 18:24:28 -0500 Subject: [PATCH 008/121] update death squad role description for more universal uses. (#21611) * update death squad role description for more universal uses. * caps * replace security glasses with sechud so they can see eachother --- Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl | 4 ++-- Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml | 2 +- TODO.md | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index ef469e50894..d4075e123d3 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -181,8 +181,8 @@ ghost-role-information-behonker-name = Behonker ghost-role-information-behonker-description = You are an antagonist, bring death and honks to those who do not follow the honkmother. ghost-role-information-Death-Squad-name = Death Squad Operative -ghost-role-information-Death-Squad-description = Prepare for an all-out offensive on the station. As a heavily armed operative, your mission is to obliterate all life in your path. No witnesses. +ghost-role-information-Death-Squad-description = One of Nanotrasen's top internal affairs agents. Await orders from CentComm or an official. ghost-role-information-Shiva-name = Shiva ghost-role-information-Shiva-description = Shiva, the stations first defender. Help the Head of Security in their work -ghost-role-information-Shiva-rules = Protect security staff and the crew from danger. Stay with Security staff or around the Security department, try to disable criminals and not kill them if the situation allows for it. +ghost-role-information-Shiva-rules = Protect security staff and the crew from danger. Stay with Security staff or around the Security department, try to disable criminals and not kill them if the situation allows for it. \ No newline at end of file diff --git a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml index f6479b1fce0..e5c85c9a633 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml @@ -48,7 +48,7 @@ jumpsuit: ClothingUniformJumpsuitDeathSquad back: ClothingBackpackDeathSquadFilled mask: ClothingMaskGasDeathSquad - eyes: ClothingEyesGlassesSecurity + eyes: ClothingEyesHudSecurity ears: ClothingHeadsetAltCentCom gloves: ClothingHandsGlovesCombat outerClothing: ClothingOuterHardsuitDeathsquad diff --git a/TODO.md b/TODO.md index fff2a6a2d00..83d78d953dd 100644 --- a/TODO.md +++ b/TODO.md @@ -4,4 +4,6 @@ - [ ] https://github.com/space-wizards/space-station-14/commit/d07ea20f74bedc584cef22f1bad1a9f50b80baf1 - Probably not required -- [ ] Proper announcement attributions \ No newline at end of file +- [ ] Proper announcement attributions + +- [ ] Move Shiva localization into /DeltaV/ \ No newline at end of file From a64f04715bee802b03a6f19a4ba1a0689cde1cde Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 12 Nov 2023 18:25:11 -0500 Subject: [PATCH 009/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 08d0f257724..fe7e8d8a1d3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,5 @@ Order: 1 Entries: -- author: Errant - changes: - - {message: 'Mutes no longer make a sound when they die, and can''t fake their death - while in crit. They can still summon up their remaining strength to whisper - their first-last words.', type: Tweak} - id: 4657 - time: '2023-08-22T06:05:16.0000000+00:00' - author: tom-leys changes: - {message: 'To increase employee retention and new staff experience, we''ve installed @@ -2911,3 +2904,12 @@ Entries: them first.', type: Tweak} id: 5156 time: '2023-11-12T23:18:48.0000000+00:00' +- author: VasilisThePikachu + changes: + - {message: 'Added a Puppy Ian, Awww.', type: Add} + - {message: Puppy Ian can be randomly chosen to be hop's pet along with the other + corgis., type: Add} + - {message: 'Added a puppy corgi crate, it contains a single puppy for hard times. + It can be order by cargo.', type: Add} + id: 5157 + time: '2023-11-12T23:24:07.0000000+00:00' From 7c81a8517abb3a2de8a8853962e080a8c834e4d9 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 13 Nov 2023 10:29:46 +1100 Subject: [PATCH 010/121] fix implant action icon bug (#21597) --- .../Systems/Actions/ActionUIController.cs | 8 ++++++-- .../Entities/Objects/Misc/subdermal_implants.yml | 11 +++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs index e2de86201e7..340aa5447dd 100644 --- a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs +++ b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs @@ -767,11 +767,15 @@ private void OnActionUnpressed(GUIBoundKeyEventArgs args, ActionButton button) private bool OnMenuBeginDrag() { + // TODO ACTIONS + // The dragging icon shuld be based on the entity's icon style. I.e. if the action has a large icon texture, + // and a small item/provider sprite, then the dragged icon should be the big texture, not the provider. if (_actionsSystem != null && _actionsSystem.TryGetActionData(_menuDragHelper.Dragged?.ActionId, out var action)) { - if (EntityManager.TryGetComponent(action.EntityIcon, out SpriteComponent? sprite)) + if (EntityManager.TryGetComponent(action.EntityIcon, out SpriteComponent? sprite) + && sprite.Icon?.GetFrame(RsiDirection.South, 0) is {} frame) { - _dragShadow.Texture = sprite.Icon?.GetFrame(RsiDirection.South, 0); + _dragShadow.Texture = frame; } else if (action.Icon != null) { diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index bc7a3a38ad3..99274e99048 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -1,15 +1,14 @@ - type: entity - parent: BaseItem id: BaseSubdermalImplant name: implant description: A microscopic chip that's injected under the skin. abstract: true components: - - type: SubdermalImplant - - type: Tag - tags: - - SubdermalImplant - - HideContextMenu + - type: SubdermalImplant + - type: Tag + tags: + - SubdermalImplant + - HideContextMenu #Fun implants From a4356b3ca9d6d42a843cdf08197f95b710aa8e76 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 12 Nov 2023 18:30:50 -0500 Subject: [PATCH 011/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fe7e8d8a1d3..cde01c62923 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,5 @@ Order: 1 Entries: -- author: tom-leys - changes: - - {message: 'To increase employee retention and new staff experience, we''ve installed - a short range teleporter on our Arrivals Shuttle. However we only had sufficient - budget to use it once per shift per staff member.', type: Add} - - {message: 'You might notice yourself adjusting as you step off the arrivals shuttle, - with our patented rotation acclimation system. It might make you dizzy, but - it helps the station make sense.', type: Tweak} - id: 4658 - time: '2023-08-22T10:46:50.0000000+00:00' - author: onoira changes: - {message: Nanotrasen no longer uses disappearing ink for official books and documents. @@ -2913,3 +2903,9 @@ Entries: It can be order by cargo.', type: Add} id: 5157 time: '2023-11-12T23:24:07.0000000+00:00' +- author: ElectroJr + changes: + - {message: Fixed being unable to re-add the storage implant action to the actions + bar once it has been removed., type: Fix} + id: 5158 + time: '2023-11-12T23:29:46.0000000+00:00' From 0a7a63dd33f48bf7947f8d1b940b842c586a6ebc Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Mon, 13 Nov 2023 02:41:45 +0300 Subject: [PATCH 012/121] Thief stuff: Gloves, Spy Crew Monitor, Invisible Crate, Toy (#21551) * add some stuff * finish pack * Update encryption_keys.yml * revert secret channels * revert spy key * add spy crew monitor * add invisible crate * add void cloak --- .../Catalog/Fills/Crates/service.yml | 1 + .../Entities/Clothing/Hands/specific.yml | 9 +++ .../Entities/Clothing/Neck/cloaks.yml | 11 ++++ .../Markers/Spawners/Random/maintenance.yml | 1 + .../Entities/Markers/Spawners/Random/toy.yml | 1 + .../Objects/Devices/encryption_keys.yml | 1 - .../Entities/Objects/Fun/figurines.yml | 9 +++ .../Medical/handheld_crew_monitor.yml | 27 ++++++++- .../Structures/Storage/Crates/crates.yml | 11 ++++ .../Neck/Cloaks/void.rsi/equipped-NECK.png | Bin 0 -> 1802 bytes .../Clothing/Neck/Cloaks/void.rsi/icon.png | Bin 0 -> 365 bytes .../Neck/Cloaks/void.rsi/inhand-left.png | Bin 0 -> 1019 bytes .../Neck/Cloaks/void.rsi/inhand-right.png | Bin 0 -> 1088 bytes .../Clothing/Neck/Cloaks/void.rsi/meta.json | 52 ++++++++++++++++++ .../Objects/Fun/figurines.rsi/meta.json | 5 +- .../Fun/figurines.rsi/thiefcharacter.png | Bin 0 -> 550 bytes .../Objects/Tools/spy_device.rsi/icon.png | Bin 0 -> 587 bytes .../Tools/spy_device.rsi/inhand-left.png | Bin 0 -> 292 bytes .../Tools/spy_device.rsi/inhand-right.png | Bin 0 -> 278 bytes .../Objects/Tools/spy_device.rsi/meta.json | 32 +++++++++++ 20 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/void.rsi/equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/void.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/void.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/void.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/void.rsi/meta.json create mode 100644 Resources/Textures/Objects/Fun/figurines.rsi/thiefcharacter.png create mode 100644 Resources/Textures/Objects/Tools/spy_device.rsi/icon.png create mode 100644 Resources/Textures/Objects/Tools/spy_device.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Tools/spy_device.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Tools/spy_device.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 2b7c5db0f77..a1ee9e70f9d 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -74,6 +74,7 @@ - id: ClothingMaskMime - id: ClothingShoesClown - id: ClothingUniformJumpskirtJanimaid + - id: ClothingNeckCloakVoid - id: RevolverCapGun - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml index 87a0961569e..3837c0ab60f 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml @@ -21,3 +21,12 @@ interfaces: - key: enum.ChameleonUiKey.Key type: ChameleonBoundUserInterface + +- type: entity + parent: ClothingHandsChameleon + id: ClothingHandsChameleonThief + suffix: Chameleon, Thieving + components: + - type: Thieving + stripTimeReduction: 2 + stealthy: true \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml b/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml index 2111ac63022..d5ee9c1f5ae 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml @@ -159,3 +159,14 @@ toggleable-clothing: !type:ContainerSlot {} - type: TypingIndicatorClothing proto: moth + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCloakVoid + name: void cloak + description: A cloak of darkness. For those who have gone to the dark side of the force. + components: + - type: Sprite + sprite: Clothing/Neck/Cloaks/void.rsi + - type: TypingIndicatorClothing + proto: alien \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 4938b6cf980..9f5a076dc1c 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -18,6 +18,7 @@ - ClothingNeckCloakAdmin - ClothingNeckCloakBoat # DeltaV - adds boat cloak to maints spawner. Makes more sense than admin cloak o.o - ClothingNeckCloakMoth + - ClothingNeckCloakVoid - ClothingNeckCloakGoliathCloak - ToySkeleton - Basketball diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml index a5c170bd802..da76abb9f68 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml @@ -137,5 +137,6 @@ - ToyFigurineRatServant - ToyFigurineMouse - ToyFigurineHamlet + - ToyFigurineThief chance: 0.90 offset: 0.2 diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index 72822997caf..1c8a14dc76b 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -247,4 +247,3 @@ layers: - state: crypt_rusted - state: pirate_label - diff --git a/Resources/Prototypes/Entities/Objects/Fun/figurines.yml b/Resources/Prototypes/Entities/Objects/Fun/figurines.yml index c491ef264b5..ef4f08d7fc4 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/figurines.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/figurines.yml @@ -455,3 +455,12 @@ components: - type: Sprite state: skeletonprize + +- type: entity + parent: BaseFigurine + id: ToyFigurineThief + name: thief character figure + description: Hiding in the shadows... + components: + - type: Sprite + state: thiefcharacter diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml index 6eaea1ee0e6..eec97d7373d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml @@ -42,4 +42,29 @@ - type: ItemSlots slots: cell_slot: - name: power-cell-slot-component-slot-name-default \ No newline at end of file + name: power-cell-slot-component-slot-name-default + +- type: entity + id: SpyCrewMonitor + name: Spy Monitor + description: A spy device capable of connecting to crew monitoring servers. + parent: HandheldCrewMonitor + components: + - type: Sprite + sprite: Objects/Tools/spy_device.rsi + state: icon + - type: Item + sprite: Objects/Tools/spy_device.rsi + - type: PowerCellDraw + useRate: 40 #Should be weaker than the original + +- type: entity + id: SpyCrewMonitorEmpty + parent: SpyCrewMonitor + suffix: Empty + components: + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index 68f24484861..05e41eb7889 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -558,3 +558,14 @@ sprite: Structures/Storage/Crates/trashcart_jani.rsi - type: AccessReader access: [["Janitor"]] + +- type: entity + parent: CrateBaseWeldable + id: InvisibleCrate + suffix: Stealth + components: + - type: Stealth + hadOutline: true + - type: StealthOnMove + passiveVisibilityRate: -0.10 + movementVisibilityRate: 0.10 diff --git a/Resources/Textures/Clothing/Neck/Cloaks/void.rsi/equipped-NECK.png b/Resources/Textures/Clothing/Neck/Cloaks/void.rsi/equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..cde2c669b6a35009f2f2edb07da4f60744b47e25 GIT binary patch literal 1802 zcma)7dr;E(7XJYX*p`@$*Huxxt6tkIZMqff3rZ}LE!{PDKzGiY^o>4)Mk0f2qaI|E(!vv&gkXh&rD z{@7gh(j6=vdB8#JmRYi+>K5YLVI%wEVK|W9Gs&NXlA!4w1p|gooH8dV z2lq~xxoXQTkFK{31FX~srofc0pC)>EuAVuoDI9M}wQO|N{|*lWZ(~Mly;Go_Y4U$F z0;0D|m~}3?AIWQf54K#%E;HAF@aaMQq$d{_CT>^v++z;;cKnd`&<;=fZ;&AAKhM8e zJ?}w{(lp65sNYJS7DQuSE~u9zKrc z=Rf8vwFS}Qf<4{O(;|;SG*VquO55|m7pGenoQxLpeUL6Hw^v6;Zk?Pj*K~X#^V7UF zm3mPxvo7CcFKllHG-T5$1PzZX9cRESq=Iok7h8hbdEur9EknbP77GljfO6oa-HTgn z$fcznHeCUfQDAlR*%VbhMD^&3 z!0baLJ!;x@-%Be^_j2eJ# z%}T4oxSJ=H2o+?miZS{oQ$u87*$B_#x_CsGRh0p=5JqxY-onwXrLPWIS&=BGf5e1p zb@N5p6UtG=nx=|kJ6Aq~>?I%yt-_YVM%=%B*y>>HGB=X|yOF!Ld8e1phFj~gmRyI! z^TEiZm})&ozoMAbRv;YM^c--}dr-Ll`<{;pR0R!0`=6kB_Gdy{h&H-fv9?;(R1_b3 zLEwJ-OHYA8i7o@a9|+Hyt?hH97lFG_-Tgp)4dhhqK_?*=vnC1op#FNald$T1x7?Mx zjfU>7JNcTK*HqCS0ay-)PkBGgOpLi|A=!1k$r*jnnX8^624inM<;J=GO>AG+ z#GWRJ$9C}y>EF(%c}57AXCZ$#bEXqbp@>oCp-FG^F`bR=N0vz(*<@x_+#VNdVjmjG zcRa^?*KMQ33!v0S(YA>grZNX3#=PuX=-9049IUl!2!Y)owcR|_SOJsY=nnd@^3wdj z3O$scD%MttDYly3$L}wGs7Wj6S!OO$-UB#37-XFv zA1T5HM`*(9p#UW~Jx$=8lJ?CfQK9C$PaLFRhPb5CMWg6{d)AG& z!R3~%r^yOs%&|Z-?l07tqn`=nD&M0<{&4RvtHpTH=PsZSb-XVnp&$O3EyN~+7?}qF zpRaSZ%2=Mt6lWQMGuE7SAFY<0{{R3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Neck/Cloaks/void.rsi/icon.png b/Resources/Textures/Clothing/Neck/Cloaks/void.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e959dd99e746bc15cd24168f3165708117f947f GIT binary patch literal 365 zcmV-z0h0cSP)Px$CrLy>R9J=Wl|c%FFc3w5i;1EZ7GHP z-ApEbUWSkWQBhG*|D;UoDbsoiUHf|TEfD*VVx>|nO+cwM#0~(klN7n;*XxCaqwD8! z6nU=}Wm->lSs`x{oQ}8ITHAN1%jy}^nzrvm5J_nBym@S)Fm5hy64a>B_T97w;k^U4 zxhr=HzFgiUsLRTGXI25+27@uP*p9gEyBWk_3{J-z3l$7tn-0d{P!unDEBLGY0_K}f5`Xu@bXiS@|Px&wMj%lRCt{2nomd+Q5?s=FLXr;cNE<5vcs^Dh5wLNOJk`+5PHx+57|LP=qepN zcl#9CzsIN z%g_)|nHh}OpQj*>K`G2&gs|A6B{V$98v^*c#J%e!{;1_qH=|6guSY7C0syesB3hnW z#wmUU>SmOkCQdFHBb?^U2B@1+ruY?@+uJa=x6u$#8DI(S>gZ&OzeXqy02uTq0N@s( zS>qZ4Ds#gGM>0U~uY+1&4_(us_!abwce9KU0MI@h;>rTOzpiLqS4Su7>gZ(c!yzZ6 z7Exih!~FX4iQ8w#!r9-cR4UtuRO$~5N}+2Sk}F5HaWio;S3mc705D$t2A)}&CDb3- zaOMmcosJOzI7lDjAbkh`_&5`{J#MJAuVkEZRQW1Tt??vmGk}ND=@@yU)H3V$5Ar5- z2LP~l*$+@F^?9BIqth|6b{xm7YbCkI1J;wk>3+Zw1Av?cCYMXE7mc&OTk?1((;slC z6THYs1H2aCHPQgD1$d1#z-s|sV{5?B%}3{6Az$5{X2@!(S#NQ*fO^L)!oV002ovPDHLkV1i_`-p&93 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Neck/Cloaks/void.rsi/inhand-right.png b/Resources/Textures/Clothing/Neck/Cloaks/void.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e93991a361ea093694bb43b3a817bad31777b4 GIT binary patch literal 1088 zcmV-G1i$-Px&`bk7VRCt{2noVdEK^TVLmDVCkvn?c34+$aEDjKDjwzd-Rpoe;}1$!_aiU?jj zh)54!di11J58gy5;w6_Bw1`#o&=Sx~L~JVlfUcW^Zi1RrYp^Yhhi$f-?oW1;Y__)Z zK*(fgXY$Us-#0TmGXR6ZU@#aA27|$1Fc=I5gR!OHG*=Fv1^|$Bf_}?L-27t>;nCBe z$qDp!byGnUA^D@)a(cX)tf|=b8jYaI2><{W83IWsXfO~!iEfpyZF&`ubb|689srca z13;lr0P%W3(g|99E1aRIRgIZ$T>}6B?`cMFS2rzI*ybZt%4Q*Dv*11ahBN|APN2<4 z6kSI+kph4qegObo-5LXsbb@vchm_xKK0^CP`Y7+=5ex)Cyj}zcTAgY`)pQPr(A(8b zd%L1qiOzn-5L*&{80{~ z94C@L%3(3TT5uMZ`4%dtKX1s!bCDsCY*zVQ)K7lQt?Jf3G~Ey|8s?PiIdj){11>TI zKwrC=Zc8DsnbGxtdJ=CejoH}2Q*vT45A5_*R;j@ROs`Yk@*cnp;I;s_u{WHRc?mH@ z70>ZGZBMMky;*qx@lUhLy?XWN5nEn1&EN7KV9x+McFCXrgjmnnviEFS4+uXncl{!p z(g3kjS1sS``b4Nw3_H%?ep~g_+yheAoLL5of0~uQE%yFaaU=w4X@vOPl+t)7a4ZDW zMhIUyUQr#je%gA}r4LBmdXDg@@g%Aq4K<=}ouE-zqz27baGYjS4uf`J25?(|+b{#T zEx>J<0o)c)33?l#l~U0>fF>uDb$In=qvdV$Dmb&WBqt6X)n+c_Y}aSo05ow=PPF&{ ze>;MlxRxpJC^=??@k%XW_L57%Kma4pLUioJ zOUp(myB?^5+)n^wayoVKMoC`y?x>t-@qu69ar_)8I?5ZtmI26zY1%*1hv~5w8~~6< z*Qo%x;c9G6Zx7m00PNedm%jV>o;z@oV*asl`#Oh1czu7GN@YCKb|;vdSwWkR(B=RFszegV0B&an=$cz|R5PH(K|EKv9jwD>^YOs?t7W@_gFQb#|hG=4F!tk(nb z2*4j}KyaYd(a}KiM>*582|qJyIy?F|0@?kEP)0jTEK&>Y41J`9{^ux(qW!URj!0!9Jf=|)030;)Mh z!LbCG(2#}5peO4P>j4`|Hyx<}Xy+t60iJRI)D+|v0SrGHQ={EmO%biZzRkby0$P&` zfU2bVxf@1g+>IOJ>Bt=*X^uO_jHvT!6mkbp%?XIoB1b>M<^n)hFZTI$ILE(=k&I{_ z7{ux%7XX65=iO)&etsvDsKSFHm3IV}rfF|MZ2*!h!W0}Q;1HrK3opy}Knvjg!47tQ zdvX*TqpEu~xF5EHeg_WVM~e-XXhT&$9F_1#L;Uo79Eeyv)Gty@aaddK<| o;!l9X)62}iTRQsRKc#u-6WHwD^*fPXQUCw|07*qoM6N<$g8oVHkpKVy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/spy_device.rsi/icon.png b/Resources/Textures/Objects/Tools/spy_device.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5c71b3ef7573ede88d7dddc5b3531b3159992572 GIT binary patch literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^2|(^|yJ zK2sy^Gq?Bwle3+C2j15$WV-SB&fDh?b}NXQTG!r5nDYNk2J6{di;L=OYB{e~NjKd2 z$!*WLZOiPfAD9kxJ8WL|?48V${Z$zXqM?h*f2{s$=EoPd9R9QF z#n-#GrVJEqc+%7@vFNQ9Jz=58hzc1{yyZ8RzzQzmw;OIGVX6hE&XX zdut=-AqSCTAH@q>OT-ito(uU+(9+J(=1X|UvaOJtGli>LM6A7~J>ezSp~#LT^<(7+ zAN&uG72IcCq#tT02s8)?{!G_!S+VNZaVy`;3e^#k5$vm0>CcWhrM9h)FDXOz#hl5% zO5*$1pR>9*=Ov5GrkUb`Cxz83A3dqLGdndr^yz*3ua=iNXS~@KXeevTZxz4BXW##% z&EKZ!8}BHYIrDy4hY!RSAh|$2AC z8FzZU{>v%qOh7{z7#iv%mvHU*UK%5vJn8GLo}#X8%Qtqkr2UB&p2S;l?&Lq2Ym-<1 zE|~LPdKs7A@wp+blUH%b*J~^5(~zb=x52{rf_IEFGXsOhbq2jV VX4~7#neKyJ<>~6@vd$@?2>@vVZb1M5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/spy_device.rsi/meta.json b/Resources/Textures/Objects/Tools/spy_device.rsi/meta.json new file mode 100644 index 00000000000..718fde7d580 --- /dev/null +++ b/Resources/Textures/Objects/Tools/spy_device.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-3.0", + "copyright": "Created by TheShuEd(Github) for SS14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From 0b476b5bcbaef4a09ef4b2f7df072e543d3949b1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 12 Nov 2023 18:42:48 -0500 Subject: [PATCH 013/121] 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 cde01c62923..9acae8d6a0d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,5 @@ Order: 1 Entries: -- author: onoira - changes: - - {message: Nanotrasen no longer uses disappearing ink for official books and documents. - These can now be modified., type: Fix} - - {message: New pen technology enables stylish ways of writing. See the guidebook - for more info., type: Add} - id: 4659 - time: '2023-08-22T11:50:04.0000000+00:00' - author: Whisper changes: - {message: Smile the Slime now has unique ghost role text rather than standard @@ -2909,3 +2901,8 @@ Entries: bar once it has been removed., type: Fix} id: 5158 time: '2023-11-12T23:29:46.0000000+00:00' +- author: TheShuEd + changes: + - {message: New Thief figurine! New void cloak!, type: Add} + id: 5159 + time: '2023-11-12T23:41:45.0000000+00:00' From 0147b39a7189a54a97dcaa9e53a0bfd951032336 Mon Sep 17 00:00:00 2001 From: Nim <128169402+Nimfar11@users.noreply.github.com> Date: Mon, 13 Nov 2023 02:42:48 +0200 Subject: [PATCH 014/121] Space Sharkminnow (#20658) * sharkminnow * fix * salvage --- .../ghost/roles/ghost-role-component.ftl | 3 + .../Body/Organs/Animal/bloodsucker.yml | 26 +++++++ .../Body/Prototypes/Animal/bloodsucker.yml | 21 +++++ .../Chemistry/metabolizer_types.yml | 4 + .../Markers/Spawners/Random/salvage.yml | 6 ++ .../Entities/Markers/Spawners/mobs.yml | 14 ++++ .../Prototypes/Entities/Mobs/NPCs/carp.yml | 66 ++++++++++++++++ Resources/Prototypes/Reagents/biological.yml | 10 +++ .../Aliens/Carps/sharkminnow.rsi/alive.png | Bin 0 -> 6876 bytes .../Aliens/Carps/sharkminnow.rsi/dead.png | Bin 0 -> 1454 bytes .../Carps/sharkminnow.rsi/dead_mouth.png | Bin 0 -> 129 bytes .../Aliens/Carps/sharkminnow.rsi/icon.png | Bin 0 -> 1143 bytes .../Aliens/Carps/sharkminnow.rsi/meta.json | 72 ++++++++++++++++++ .../Aliens/Carps/sharkminnow.rsi/mouth.png | Bin 0 -> 437 bytes 14 files changed, 222 insertions(+) create mode 100644 Resources/Prototypes/Body/Organs/Animal/bloodsucker.yml create mode 100644 Resources/Prototypes/Body/Prototypes/Animal/bloodsucker.yml create mode 100644 Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/alive.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/dead_mouth.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/mouth.png diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index d4075e123d3..5c98a9d0959 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -68,6 +68,9 @@ ghost-role-information-salvage-carp-description = Defend the loot inside the sal ghost-role-information-sentient-carp-name = Sentient Carp ghost-role-information-sentient-carp-description = Help the dragon flood the station with carps! +ghost-role-information-salvage-shark-name = Space sharkminnow on salvage wreck +ghost-role-information-salvage-shark-description = Help the younger fellow carp protect their prey. Smell the blood! + ghost-role-information-willow-name = Willow the kangaroo ghost-role-information-willow-description = You're a kangaroo named willow! willow likes to box. diff --git a/Resources/Prototypes/Body/Organs/Animal/bloodsucker.yml b/Resources/Prototypes/Body/Organs/Animal/bloodsucker.yml new file mode 100644 index 00000000000..8a1afc37bb1 --- /dev/null +++ b/Resources/Prototypes/Body/Organs/Animal/bloodsucker.yml @@ -0,0 +1,26 @@ +- type: entity + id: OrganBloodsuckerStomach + parent: OrganAnimalStomach + name: stomach + noSpawn: true + components: + - type: Metabolizer + metabolizerTypes: [ Bloodsucker ] + +- type: entity + id: OrganBloodsuckerLiver + parent: OrganAnimalLiver + name: liver + noSpawn: true + components: + - type: Metabolizer + metabolizerTypes: [ Bloodsucker ] + +- type: entity + id: OrganBloodsuckerHeart + parent: OrganAnimalHeart + name: heart + noSpawn: true + components: + - type: Metabolizer + metabolizerTypes: [ Bloodsucker ] diff --git a/Resources/Prototypes/Body/Prototypes/Animal/bloodsucker.yml b/Resources/Prototypes/Body/Prototypes/Animal/bloodsucker.yml new file mode 100644 index 00000000000..dd8750714ef --- /dev/null +++ b/Resources/Prototypes/Body/Prototypes/Animal/bloodsucker.yml @@ -0,0 +1,21 @@ +- type: body + id: Bloodsucker + name: "bloodsucker" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganBloodsuckerStomach + liver: OrganBloodsuckerLiver + heart: OrganBloodsuckerHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 56895860143..259387b6d5c 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -5,6 +5,10 @@ id: Animal name: animal +- type: metabolizerType + id: Bloodsucker + name: bloodsucker + - type: metabolizerType id: Dragon name: dragon diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml index a933a7ecbb9..80e3aa94606 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/salvage.yml @@ -147,6 +147,9 @@ - sprite: Mobs/Aliens/Carps/space.rsi state: icon - type: RandomSpawner + rarePrototypes: + - MobSharkSalvage + rareChance: 0.2 prototypes: - MobCarpSalvage - MobCarpSalvage @@ -196,6 +199,9 @@ suffix: 75 components: - type: RandomSpawner + rarePrototypes: + - MobSharkSalvage + rareChance: 0.2 prototypes: - MobCarpSalvage - MobCarpSalvage diff --git a/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml b/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml index 3655f9e5af9..cbd892255ee 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/mobs.yml @@ -307,6 +307,20 @@ prototypes: - MobCarpHolo +- type: entity + name: Space Sharkminnow Spawner + id: SpawnMobShark + parent: MarkerBase + components: + - type: Sprite + layers: + - state: green + - state: icon + sprite: Mobs/Aliens/Carps/sharkminnow.rsi + - type: ConditionalSpawner + prototypes: + - MobShark + - type: entity name: Hamster Hamlet Spawner id: SpawnMobHamsterHamlet diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 2dc36f7515d..af344ac7ebc 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -192,3 +192,69 @@ damage: types: Slash: 6 + +- type: entity + name: sharkminnow + parent: BaseMobCarp + id: MobShark + description: A dangerous shark from the blackness of endless space, who loves to drink blood. + components: + - type: Sprite + sprite: Mobs/Aliens/Carps/sharkminnow.rsi + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: alive + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] + state: mouth + shader: unshaded + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.40 + density: 100 + mask: + - FlyingMobMask + layer: + - FlyingMobLayer + - type: MobThresholds + thresholds: + 0: Alive + 180: Dead + - type: Stamina + critThreshold: 150 + - type: DamageStateVisuals + states: + Alive: + Base: alive + BaseUnshaded: mouth + Dead: + Base: dead + BaseUnshaded: dead_mouth + - type: Body + prototype: Bloodsucker + requiredLegs: 1 + - type: Butcherable + spawned: + - id: FoodMeatFish + amount: 4 + - type: MeleeWeapon + damage: + types: + Slash: 12 + Bloodloss: 5 + +- type: entity + id: MobSharkSalvage + parent: MobShark + suffix: "Salvage Ruleset" + components: + - type: GhostRole + prob: 0.2 + name: ghost-role-information-salvage-shark-name + allowMovement: true + allowSpeech: true + description: ghost-role-information-salvage-shark-description + - type: GhostTakeoverAvailable + - type: SalvageMobRestrictions diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 45311604107..a96b65666d4 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -22,6 +22,16 @@ - !type:AdjustReagent reagent: UncookedAnimalProteins amount: 0.5 + Medicine: + effects: + - !type:HealthChange + conditions: + - !type:OrganType + type: Bloodsucker + damage: + groups: + Brute: -4 + Burn: -2 plantMetabolism: - !type:PlantAdjustWater amount: 0.5 diff --git a/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/alive.png b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/alive.png new file mode 100644 index 0000000000000000000000000000000000000000..b4429e3a7d726b25a0a6b10fad550e849cfb4d79 GIT binary patch literal 6876 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..3d74b187047b588a3b7c97501cd43e317d26c527 GIT binary patch literal 1454 zcmV;f1yTBmP)Px)Xh}ptRA_e~=s)*E0rHD#i?)jR0Yo9rUD7tnd@K(B4ZdcAO@QspDy5>4mL>||HxVJZiaK_ z{Jih?e&=ImV1fxInBXd*UDd`JT^H$a7=TCR@|k%AE{xF!BG>6?^R1Q`HU(!4=9M`x zgvgpE0Zk)j7-w=~>M~e;C~VuNrEdi1sY2r6;vxV) z)oQ2K$>_Ssbvk5ClSaEec7a@{Lq^xf_MN;Z+w-9ijdq({r=y)mfRKylIvv%yVp;09 zGpH(KiQ0xSvX~qz$NBF&o;OzLd?>`0>uP5bAS=Z%3Sz~w*sRx2ZQ{pC(vsYKC`8}{ zjm>(U70bf$JT=cR5+G}uY`N~c{|A1&eOu=22y&f{CM}d3N%HfdkQ$eY$FU7#g#2c` zJ`iNv^SPVb}G>y%AU4?4J zvV`M#Y6F>@jdq(oPeSYKOHeRqRFgbe>U2gW(_Oa6D& zF753B@TA#P4*1KYOcnpt@uiY&7|J2p2ZPjEO(xkW6j)6rsnlv*AC~EjLV>Jlswf>W-!RyaIzHg)!dxAHWwDi@9ruwj^n5_k>ocDg%Jnj80i)aQU*{$ zDzzG0uB+}z;nU+H{#*GUUQ~)K1_Hb~Jfzm^smKTWeO~taRD~csHAO2Bpeh8hXp}#y zRVuDaIvgfy7?fR?8<7aTZkJdzN~u=EX*9T(NI1pmI5^NL- zM2?RY`Rj{|JU=*KeQk~H*RP3L78TbWbwD2ASBHlqq9pldFi6SsMyk<+R7&jZ@2kTd z3x~M|gcTYJa(@y^OJ8<1~shB1kg#r&!DF7aAZ)?f{ zKl#tDUE}M|zvM-w_)hWwR=@v4A`)SzS|w$g!`t6ov!*E$k;owO!}r{LwW{u?mzHQB9}^lnyVGish(wq>IG`B}4%)M` z>WX2ov%k-sK!9hx9*Iaqt+lM{eEkULm3{!7;c*_OH1H+sxraA#eB8O6Tt5G zX|&svG>w3!@v`4%c}V_#EXJ>;l3Mq^W%07pIYnIJ!e8pgr4tNNN{V^XY?2O#c~mZ+ zo5!VmmGGw%o=3h~9XT7mdVlWyFXgMmmg{P=gkC233tMCyRxC^Ogcwv1&%2Ox8HY>z zF64NgswPA78kZ2T%ltCue-XOsFMtzFFu?>9OfbO&6MT&L7sQq*5EIyug8%>k07*qo IM6N<$f{Bp7XaE2J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/dead_mouth.png b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/dead_mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..dab110c9adabeea83725e127aef55b10e939eb16 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R})}AhoAsLNt zFKy&yP~c&9-2DGSz=b8tI-B09{W#$XRPbWsF6Ov5tF0fOz4K|2oZ+X|N&eG-!VC=? Y`JMy{efZP#{xgW{>FVdQ&MBb@0AJ%Q=Kufz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/icon.png b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4faa816fd0b6617eebd14c5741e402dc56b75d GIT binary patch literal 1143 zcmV--1c>{IP)Px(F-b&0RA_x4s%`cG zw%*s+2Z*$OgSc>&Dxt7sDT$l4a1jRv@Jb9I#N7hU&7A?;eA$*({F?#pnLEF8&&Rz3 zthCbqTb~Zzs80uP)OF*@`-GWRf4_L4K6g6&@c1zRCtoUv6F*;5i@N3=fnEmg2uWtnx-FpN|t~&<*@5Tn8SL=T02h&*zny z5>BTx+@wajtk(g!3Pa#K{5)EE5u5NqyRCm;cbtgbGT`A3_W=_gz5~ZUFRG=ckmP+P zohHLD-_NR53fU}9Vz^e}U;v{O0-)Dh=$T7Pq5XVb39MWJoJ4|)S`C<-Qpc^Q^;m@*9qEfJr2W2T$+)XQw!HX(Y7`GMXg3S7;sUm>9o15*U6;Q z6tdaKxRXdMr52V_!~%cRY;xdv95tH+K|nYdkhCnq!GItLBI6ge8augMm0XQ z6vL20Hp|||hIYb)KdV-$^m>#=_r=dhvauCG#m6RTpH;!8^O0GM6Icc{k zWV1RFCcK|Y(N{{_Z*Of$3!aN*uAAaTcGPTAa$UWm$E_Ac+Xja95wzRGRUaLxO*^R@ zW3HK)W_G}Ymwc902dMOVls%8W8gC@B>SpoxmC|)Hj}tRFAn?-jClsM7+P2Q?q-D`p zN?*l^qHR;@^{jXk0L%?>Dz=&1sI0okga<71UkJ11N|Y+Y4Z2kixV@o(Hr0+ zy6JplI=c)fW=f%w>uRu@+Uh)tJF)0{!b&Txw9-l|t+dh<`VWEMzaZcCs1*PJ002ov JPDHLkV1mhBH(LMz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/meta.json new file mode 100644 index 00000000000..2f8d02bed27 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/meta.json @@ -0,0 +1,72 @@ +{ + "version": 1, + "size": { + "x": 48, + "y": 48 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Nimfar11 (Github) for Space Station 14", + "states": [ + { + "name": "icon" + }, + { + "name": "mouth", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "dead_mouth" + }, + { + "name": "dead" + }, + { + "name": "alive", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/mouth.png b/Resources/Textures/Mobs/Aliens/Carps/sharkminnow.rsi/mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b97b5e77c102574d8dc78cfb8818e44fd424b2 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^6M*;t2OE%led3irkYX$ja(7}_cTVOdke%=8;uumf z=j~lXzrzj!4i|5BEOzj0tQFxp*CEm;6c}(QQbJ0|)s5qc#Gd56*Q0LziL}fv?*p2G z0IP2EJI58(=Kf05HZuNxc*4xcPwTG#-+VWS+qeJNnKR1^dv4F(T_JUR2H(Zofvf80 zZ9AeA{QTql>--z5t9zzjf4;+BX3^Gf>ic)9{M}!^^+}TZ+O1_$N{g;MbAR#vnAknV zzH50i7ytU_?ow0v?bH4@_6VDaWPRBC*Wk%5-su)eK^|Adwu zPh0up!u_e2J}%tPeYO3<{l-_$PnK`BezxjP-KI`OuFe0k+c9^=KV6N#0cXYb-CVGr z`Lg0F+2y~i1OComQ180*vGe~`TF3Jr$}TFYfBA!V1KbD)eLIGiTgqO1{>=jpK~Gmd Jmvv4FO#q3;t9$?e literal 0 HcmV?d00001 From fa953fab107780acd0992f10bf8698447974244d Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 12 Nov 2023 19:43:52 -0500 Subject: [PATCH 015/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9acae8d6a0d..fc6ed058446 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: Whisper - changes: - - {message: Smile the Slime now has unique ghost role text rather than standard - slimes., type: Add} - id: 4660 - time: '2023-08-22T12:00:20.0000000+00:00' - author: Alekshhh changes: - {message: Changed various head locker contents., type: Tweak} @@ -2906,3 +2900,9 @@ Entries: - {message: New Thief figurine! New void cloak!, type: Add} id: 5159 time: '2023-11-12T23:41:45.0000000+00:00' +- author: Nimfar11 + changes: + - {message: Added space sharkminnow from the carp family., type: Add} + - {message: Added Bloodsucker's animal organs to heal by drinking blood., type: Add} + id: 5160 + time: '2023-11-13T00:42:48.0000000+00:00' From 574bc268623d2956494f8cd05cecc8b81cec5225 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 13 Nov 2023 08:48:47 +0000 Subject: [PATCH 016/121] fix egg debug assert (#21628) Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Shared/Damage/Systems/DamageOnHighSpeedImpactSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Damage/Systems/DamageOnHighSpeedImpactSystem.cs b/Content.Shared/Damage/Systems/DamageOnHighSpeedImpactSystem.cs index f099a337598..4371ac83a83 100644 --- a/Content.Shared/Damage/Systems/DamageOnHighSpeedImpactSystem.cs +++ b/Content.Shared/Damage/Systems/DamageOnHighSpeedImpactSystem.cs @@ -49,7 +49,8 @@ private void HandleCollide(EntityUid uid, DamageOnHighSpeedImpactComponent compo _damageable.TryChangeDamage(uid, component.Damage * damageScale); - _audio.PlayPvs(component.SoundHit, uid, AudioParams.Default.WithVariation(0.125f).WithVolume(-0.125f)); + if (_gameTiming.IsFirstTimePredicted) + _audio.PlayPvs(component.SoundHit, uid, AudioParams.Default.WithVariation(0.125f).WithVolume(-0.125f)); _color.RaiseEffect(Color.Red, new List() { uid }, Filter.Pvs(uid, entityManager: EntityManager)); } From b016948618ad18044e3713f7b65d480151b48ee7 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Mon, 13 Nov 2023 05:04:33 -0500 Subject: [PATCH 017/121] List antags in custody in round end screen (#21566) * List antags in custody in round end screen * Only show the message for traitors --- Content.Server/Objectives/ObjectivesSystem.cs | 39 +++++++++++++++++-- .../Locale/en-US/objectives/round-end.ftl | 8 +++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Content.Server/Objectives/ObjectivesSystem.cs b/Content.Server/Objectives/ObjectivesSystem.cs index 3f7e92963a8..511558216d5 100644 --- a/Content.Server/Objectives/ObjectivesSystem.cs +++ b/Content.Server/Objectives/ObjectivesSystem.cs @@ -1,7 +1,10 @@ -using Content.Server.GameTicking; +using Content.Server.GameTicking; using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; +using Content.Server.Shuttles.Systems; +using Content.Shared.Cuffs.Components; using Content.Shared.Mind; +using Content.Shared.Mobs.Systems; using Content.Shared.Objectives.Components; using Content.Shared.Objectives.Systems; using Content.Shared.Random; @@ -18,6 +21,7 @@ public sealed class ObjectivesSystem : SharedObjectivesSystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly MindSystem _mind = default!; + [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; public override void Initialize() { @@ -71,12 +75,18 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) { // first get the total number of players that were in these game rules combined var total = 0; + var totalInCustody = 0; foreach (var (_, minds) in summary) { total += minds.Count; + totalInCustody += minds.Where(m => IsInCustody(m)).Count(); } var result = Loc.GetString("objectives-round-end-result", ("count", total), ("agent", agent)); + if (agent == Loc.GetString("traitor-round-end-agent-name")) + { + result += "\n" + Loc.GetString("objectives-round-end-result-in-custody", ("count", total), ("custody", totalInCustody), ("agent", agent)); + } // next add all the players with its own prepended text foreach (var (prepend, minds) in summary) { @@ -123,14 +133,16 @@ private void AddSummary(ref string result, string agent, List minds) result += "\n"; + var custody = IsInCustody(mindId, mind) ? Loc.GetString("objectives-in-custody") + " " : ""; + var objectives = mind.AllObjectives.ToArray(); if (objectives.Length == 0) { - result += Loc.GetString("objectives-no-objectives", ("title", title), ("agent", agent)); + result += Loc.GetString("objectives-no-objectives", ("custody", custody), ("title", title), ("agent", agent)); continue; } - result += Loc.GetString("objectives-with-objectives", ("title", title), ("agent", agent)); + result += Loc.GetString("objectives-with-objectives", ("custody", custody), ("title", title), ("agent", agent)); foreach (var objectiveGroup in objectives.GroupBy(o => Comp(o).Issuer)) { @@ -197,6 +209,27 @@ private void AddSummary(ref string result, string agent, List minds) return null; } + + /// + /// Returns whether a target is considered 'in custody' (cuffed on the shuttle). + /// + private bool IsInCustody(EntityUid mindId, MindComponent? mind = null) + { + if (!Resolve(mindId, ref mind)) + return false; + + // Ghosting will not save you + bool originalEntityInCustody = false; + EntityUid? originalEntity = GetEntity(mind.OriginalOwnedEntity); + if (originalEntity.HasValue && originalEntity != mind.OwnedEntity) + { + originalEntityInCustody = TryComp(originalEntity, out var origCuffed) && origCuffed.CuffedHandCount > 0 + && _emergencyShuttle.IsTargetEscaping(originalEntity.Value); + } + + return originalEntityInCustody || (TryComp(mind.OwnedEntity, out var cuffed) && cuffed.CuffedHandCount > 0 + && _emergencyShuttle.IsTargetEscaping(mind.OwnedEntity.Value)); + } } /// diff --git a/Resources/Locale/en-US/objectives/round-end.ftl b/Resources/Locale/en-US/objectives/round-end.ftl index 4c0e5884ca3..129d809823e 100644 --- a/Resources/Locale/en-US/objectives/round-end.ftl +++ b/Resources/Locale/en-US/objectives/round-end.ftl @@ -3,12 +3,16 @@ objectives-round-end-result = {$count -> *[other] There were {$count} {MAKEPLURAL($agent)}. } +objectives-round-end-result-in-custody = {$custody} out of {$count} {MAKEPLURAL($agent)} were in custody. + objectives-player-user-named = [color=White]{$name}[/color] ([color=gray]{$user}[/color]) objectives-player-user = [color=gray]{$user}[/color] objectives-player-named = [color=White]{$name}[/color] -objectives-no-objectives = {$title} was a {$agent}. -objectives-with-objectives = {$title} was a {$agent} who had the following objectives: +objectives-no-objectives = [bold][color=red]{$custody}[/color]{$title} was a {$agent}. +objectives-with-objectives = [bold][color=red]{$custody}[/color]{$title} was a {$agent} who had the following objectives: objectives-objective-success = {$objective} | [color={$markupColor}]Success![/color] objectives-objective-fail = {$objective} | [color={$markupColor}]Failure![/color] ({$progress}%) + +objectives-in-custody = | IN CUSTODY | \ No newline at end of file From d11a2f8aa8e036ab837c1356ff988fda9079538b Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 05:05:39 -0500 Subject: [PATCH 018/121] 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 fc6ed058446..2bd7cc0ed14 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,5 @@ Order: 1 Entries: -- author: Alekshhh - changes: - - {message: Changed various head locker contents., type: Tweak} - id: 4661 - time: '2023-08-22T14:49:53.0000000+00:00' - author: Doru991 changes: - {message: Zombies' eyes turn red the way they were supposed to., type: Fix} @@ -2906,3 +2901,9 @@ Entries: - {message: Added Bloodsucker's animal organs to heal by drinking blood., type: Add} id: 5160 time: '2023-11-13T00:42:48.0000000+00:00' +- author: themias + changes: + - {message: The round end summary screen now lists the syndies in custody. (Cuffed + on the shuttle), type: Add} + id: 5161 + time: '2023-11-13T10:04:33.0000000+00:00' From 9dd9d35417ac0faa9a5b7a0119323b76039ad01b Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 13 Nov 2023 22:10:56 +1100 Subject: [PATCH 019/121] Reduce space music grid range (#21630) Don't want it to play if they're on a single spaced tile but 10 is probably overkill. --- Resources/Prototypes/audio.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/Prototypes/audio.yml b/Resources/Prototypes/audio.yml index ecbb5884d16..b06af26d597 100644 --- a/Resources/Prototypes/audio.yml +++ b/Resources/Prototypes/audio.yml @@ -203,14 +203,13 @@ rules: - !type:AlwaysTrueRule -# TODO: Need to make sure no grids nearby - type: rules id: InSpace rules: - !type:InSpaceRule - !type:GridInRangeRule inverted: true - range: 10 + range: 1 # TODO - type: rules From 1c5cc8812e6f14137e6c07658bb024acfd44df3d Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 06:12:00 -0500 Subject: [PATCH 020/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2bd7cc0ed14..38bd2ad21d7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,5 @@ Order: 1 Entries: -- author: Doru991 - changes: - - {message: Zombies' eyes turn red the way they were supposed to., type: Fix} - - {message: 'When a zombie is cloned, the cloned person''s eyes are visible again.', - type: Fix} - id: 4662 - time: '2023-08-23T04:52:00.0000000+00:00' - author: deltanedas changes: - {message: 'R&D has developed the construction cyborg module for engineering cyborgs, @@ -2907,3 +2900,9 @@ Entries: on the shuttle), type: Add} id: 5161 time: '2023-11-13T10:04:33.0000000+00:00' +- author: metalgearsloth + changes: + - {message: Make space ambient music more likely to play by reducing the required + space range., type: Tweak} + id: 5162 + time: '2023-11-13T11:10:56.0000000+00:00' From 32bc263207ba445a7765b884dc31568f5b81dd2a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 13 Nov 2023 23:41:35 +1100 Subject: [PATCH 021/121] Add shadow biome (#21276) --- .../Entities/Tiles/shadow_basalt.yml | 10 +-- .../Procedural/biome_ore_templates.yml | 73 +++++++++++++++++ .../Prototypes/Procedural/biome_templates.yml | 79 +++++++++++++++++++ 3 files changed, 157 insertions(+), 5 deletions(-) diff --git a/Resources/Prototypes/Entities/Tiles/shadow_basalt.yml b/Resources/Prototypes/Entities/Tiles/shadow_basalt.yml index e5835239cfe..0c8670dcbb3 100644 --- a/Resources/Prototypes/Entities/Tiles/shadow_basalt.yml +++ b/Resources/Prototypes/Entities/Tiles/shadow_basalt.yml @@ -22,7 +22,7 @@ - type: entity id: ShadowBasaltTwo - parent: BasaltOne + parent: ShadowBasaltOne placement: mode: SnapgridCenter components: @@ -33,7 +33,7 @@ - type: entity id: ShadowBasaltThree - parent: BasaltOne + parent: ShadowBasaltOne placement: mode: SnapgridCenter components: @@ -44,7 +44,7 @@ - type: entity id: ShadowBasaltFour - parent: BasaltOne + parent: ShadowBasaltOne placement: mode: SnapgridCenter components: @@ -55,7 +55,7 @@ - type: entity id: ShadowBasaltFive - parent: BasaltOne + parent: ShadowBasaltOne placement: mode: SnapgridCenter components: @@ -80,4 +80,4 @@ - 0: basalt4: "" - 0: - basalt5: "" \ No newline at end of file + basalt5: "" diff --git a/Resources/Prototypes/Procedural/biome_ore_templates.yml b/Resources/Prototypes/Procedural/biome_ore_templates.yml index 1d4bc062d31..c9830f2c17e 100644 --- a/Resources/Prototypes/Procedural/biome_ore_templates.yml +++ b/Resources/Prototypes/Procedural/biome_ore_templates.yml @@ -143,6 +143,79 @@ groupCount: 1 radius: 4 +# Shadow basalt variant +# Low value +- type: biomeMarkerLayer + id: ChromiteOreTin + proto: WallRockChromiteTin + entityMask: WallRockChromite + maxCount: 30 + groupCount: 10 + radius: 4 + +- type: biomeMarkerLayer + id: ChromiteOreQuartz + proto: WallRockChromiteQuartz + entityMask: WallRockChromite + maxCount: 30 + groupCount: 10 + radius: 4 + +# Medium value +# Gold +- type: biomeMarkerLayer + id: ChromiteOreGold + proto: WallRockChromiteGold + entityMask: WallRockChromite + maxCount: 30 + groupCount: 5 + radius: 4 + +# Silver +- type: biomeMarkerLayer + id: ChromiteOreSilver + proto: WallRockChromiteSilver + entityMask: WallRockChromite + maxCount: 30 + groupCount: 5 + radius: 4 + +# High value +# Plasma +- type: biomeMarkerLayer + id: ChromiteOrePlasma + proto: WallRockChromitePlasma + entityMask: WallRockChromite + maxCount: 12 + groupCount: 5 + radius: 4 + +# Uranium +- type: biomeMarkerLayer + id: ChromiteOreUranium + proto: WallRockChromiteUranium + entityMask: WallRockChromite + maxCount: 12 + groupCount: 5 + radius: 4 + +- type: biomeMarkerLayer + id: ChromiteOreBananium + proto: WallRockChromiteBananium + entityMask: WallRockChromite + maxCount: 12 + groupCount: 5 + radius: 4 + +# Artifact Fragment +- type: biomeMarkerLayer + id: ChromiteOreArtifactFragment + proto: WallRockChromiteArtifactFragment + entityMask: WallRockChromite + maxCount: 6 + groupCount: 1 + radius: 4 + # Snow variant # Low value - type: biomeMarkerLayer diff --git a/Resources/Prototypes/Procedural/biome_templates.yml b/Resources/Prototypes/Procedural/biome_templates.yml index cfd543d76e1..b2914b9ba6b 100644 --- a/Resources/Prototypes/Procedural/biome_templates.yml +++ b/Resources/Prototypes/Procedural/biome_templates.yml @@ -480,6 +480,85 @@ entities: - FloorLiquidPlasmaEntity +# Shadow -> Derived from lava +- type: biomeTemplate + id: Shadow + layers: + - !type:BiomeEntityLayer + threshold: 0.70 + noise: + frequency: 1 + seed: 3 + allowedTiles: + - FloorChromite + entities: + - ShadowBasaltOne + - ShadowBasaltTwo + - ShadowBasaltThree + - ShadowBasaltFour + - ShadowBasaltFive + - !type:BiomeEntityLayer + threshold: 0.97 + noise: + frequency: 1 + seed: 2 + allowedTiles: + - FloorChromite + entities: + - CrystalPink + - !type:BiomeEntityLayer + threshold: 0.97 + noise: + seed: 1 + noiseType: OpenSimplex2 + frequency: 1 + allowedTiles: + - FloorChromite + entities: + - ShadowTree01 + - ShadowTree02 + - ShadowTree03 + - ShadowTree04 + - ShadowTree05 + - ShadowTree06 + # Rock formations + - !type:BiomeEntityLayer + threshold: -0.2 + invert: true + noise: + seed: 0 + noiseType: Perlin + fractalType: Ridged + octaves: 1 + frequency: 0.1 + gain: 0 + allowedTiles: + - FloorChromite + entities: + - WallRockChromite + # chasm time + - !type:BiomeEntityLayer + allowedTiles: + - FloorChromite + threshold: 0.2 + noise: + seed: 3 + frequency: 0.1 + fractalType: FBm + octaves: 5 + lacunarity: 2 + gain: 0.4 + entities: + - FloorChromiteChasm + - !type:BiomeDummyLayer + id: Loot + # Fill chromite + - !type:BiomeTileLayer + threshold: -1 + variants: + - 0 + tile: FloorChromite + # Caves - type: biomeTemplate id: Caves From 717d9ed6ad10439b1b8afbc0cc195799c78e640b Mon Sep 17 00:00:00 2001 From: Debug <49997488+DebugOk@users.noreply.github.com> Date: Sun, 19 Nov 2023 22:04:53 +0100 Subject: [PATCH 022/121] Update TODO.md --- TODO.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 83d78d953dd..07630c5577f 100644 --- a/TODO.md +++ b/TODO.md @@ -6,4 +6,6 @@ - [ ] Proper announcement attributions -- [ ] Move Shiva localization into /DeltaV/ \ No newline at end of file +- [ ] Move Shiva localization into /DeltaV/ + +- [ ] https://github.com/space-wizards/space-station-14/commit/eb0c86f803648c0ad8387f7255e15c402dc41653 - Does this have to do with storage refactor is it actually generic? \ No newline at end of file From 2911a74c4a6ffa214239342a97d5511ba66d1b51 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:39:33 +1100 Subject: [PATCH 023/121] Bump expedition timer to 11mins (#21635) We've had it at like, 18, 12, and 7, I think 7 is too low and 18 is definitely too high. Ideally: - 2 minutes to get inside - 7 or so minutes inside. - 2 minutes as a buffer to either fulton themselves out or run out if necessary. --- Content.Shared/CCVar/CCVars.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 817cdec41e4..24b85b92de5 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1526,7 +1526,7 @@ public static readonly CVarDef /// Duration for missions /// public static readonly CVarDef - SalvageExpeditionDuration = CVarDef.Create("salvage.expedition_duration", 420f, CVar.REPLICATED); + SalvageExpeditionDuration = CVarDef.Create("salvage.expedition_duration", 660f, CVar.REPLICATED); /// /// Cooldown for missions. From 1017b617c662929afbc58b6dfde5e304e756e539 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 17:40:40 -0500 Subject: [PATCH 024/121] 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 38bd2ad21d7..2280a0e7ece 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: deltanedas - changes: - - {message: 'R&D has developed the construction cyborg module for engineering cyborgs, - now they can construct anything with steel glass or rods.', type: Add} - id: 4663 - time: '2023-08-23T21:34:39.0000000+00:00' - author: Nairodian changes: - {message: 'Added several new Arachnid markings, including appendage stripes, chest @@ -2906,3 +2900,8 @@ Entries: space range., type: Tweak} id: 5162 time: '2023-11-13T11:10:56.0000000+00:00' +- author: metalgearsloth + changes: + - {message: Expedition timer bumped from 7 minutes to 11 minutes., type: Tweak} + id: 5163 + time: '2023-11-13T22:39:34.0000000+00:00' From 15ea2eb5437497920a659ec8c6b09ad9c58456c0 Mon Sep 17 00:00:00 2001 From: Simon <63975668+Simyon264@users.noreply.github.com> Date: Mon, 13 Nov 2023 23:43:08 +0100 Subject: [PATCH 025/121] the voices don't stop (fix pda ring) (#21640) --- Content.Server/MassMedia/Systems/NewsSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/MassMedia/Systems/NewsSystem.cs b/Content.Server/MassMedia/Systems/NewsSystem.cs index 93663474ac7..a36d8b0afd9 100644 --- a/Content.Server/MassMedia/Systems/NewsSystem.cs +++ b/Content.Server/MassMedia/Systems/NewsSystem.cs @@ -207,7 +207,8 @@ private void TryNotify() while (query.MoveNext(out var uid, out var comp, out var ringer, out var cont)) { - if (!_cartridgeLoaderSystem.HasProgram(uid, false, comp, cont)) + if (!_cartridgeLoaderSystem.TryGetProgram(uid, out _, out var newsReadCartridgeComponent, false, comp, cont) + || !newsReadCartridgeComponent.NotificationOn) continue; _ringer.RingerPlayRingtone(uid, ringer); From 27d06006575b2e8a7d99cbe7d08de0225f8b4a3c Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 17:44:14 -0500 Subject: [PATCH 026/121] 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 2280a0e7ece..4f37cecfd5d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: Nairodian - changes: - - {message: 'Added several new Arachnid markings, including appendage stripes, chest - designs, chelicerae and an overlay.', type: Add} - id: 4664 - time: '2023-08-23T21:37:42.0000000+00:00' - author: crazybrain changes: - {message: 'The dead body examine text is more accurate for dead, disconnected @@ -2905,3 +2899,8 @@ Entries: - {message: Expedition timer bumped from 7 minutes to 11 minutes., type: Tweak} id: 5163 time: '2023-11-13T22:39:34.0000000+00:00' +- author: Simyon + changes: + - {message: Muting the station news notification on your PDA now works again., type: Fix} + id: 5164 + time: '2023-11-13T22:43:09.0000000+00:00' From f79baba6d7aaa350ea225a9453ce7cd41e8ad3b0 Mon Sep 17 00:00:00 2001 From: Bakke Date: Mon, 13 Nov 2023 23:53:54 +0100 Subject: [PATCH 027/121] Fix CanImplant returning true when there's no implant (#21637) In CanImplant, FirstOrDefault would make up a new implant with default values if there wasn't any to inject. This resulted in localization errors and exceptions. Replacing with FirstOrNull fixes the issue. --- Content.Shared/Implants/SharedImplanterSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Implants/SharedImplanterSystem.cs b/Content.Shared/Implants/SharedImplanterSystem.cs index 404e6da5089..b3b2421f205 100644 --- a/Content.Shared/Implants/SharedImplanterSystem.cs +++ b/Content.Shared/Implants/SharedImplanterSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Whitelist; using Robust.Shared.Containers; using Robust.Shared.Serialization; +using Robust.Shared.Utility; namespace Content.Shared.Implants; @@ -82,7 +83,7 @@ public bool CanImplant( [NotNullWhen(true)] out EntityUid? implant, [NotNullWhen(true)] out SubdermalImplantComponent? implantComp) { - implant = component.ImplanterSlot.ContainerSlot?.ContainedEntities.FirstOrDefault(); + implant = component.ImplanterSlot.ContainerSlot?.ContainedEntities.FirstOrNull(); if (!TryComp(implant, out implantComp)) return false; From d23ec8ec5c5fd6f6c1262a85169957c12b492a08 Mon Sep 17 00:00:00 2001 From: Bakke Date: Mon, 13 Nov 2023 23:55:24 +0100 Subject: [PATCH 028/121] Fix voice mask popup location (#21638) The voice mask confirmation and error popups were placed at the cursor, which made the popup render hidden under the voice mask UI. This moves the message to the player entity, and colors the error feedback red to make it more distinct. --- Content.Server/VoiceMask/VoiceMaskSystem.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.cs b/Content.Server/VoiceMask/VoiceMaskSystem.cs index b6d9a2cce02..0ed794c1c44 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Popups; using Content.Shared.Database; using Content.Shared.Inventory.Events; +using Content.Shared.Popups; using Content.Shared.Preferences; using Content.Shared.VoiceMask; using Robust.Server.GameObjects; @@ -35,7 +36,7 @@ private void OnChangeName(EntityUid uid, VoiceMaskComponent component, VoiceMask { if (message.Name.Length > HumanoidCharacterProfile.MaxNameLength || message.Name.Length <= 0) { - _popupSystem.PopupCursor(Loc.GetString("voice-mask-popup-failure"), message.Session); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-failure"), uid, message.Session, PopupType.SmallCaution); return; } @@ -45,7 +46,7 @@ private void OnChangeName(EntityUid uid, VoiceMaskComponent component, VoiceMask else _adminLogger.Add(LogType.Action, LogImpact.Medium, $"Voice of {ToPrettyString(uid):mask} set: {component.VoiceName}"); - _popupSystem.PopupCursor(Loc.GetString("voice-mask-popup-success"), message.Session); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), uid, message.Session); TrySetLastKnownName(uid, message.Name); From 871499841078517b3b9964f465a6a0349f8f4ff6 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 13 Nov 2023 22:57:52 +0000 Subject: [PATCH 029/121] make explosions affect containers (#21625) Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../EntitySystems/ExplosionSystem.Processing.cs | 13 +++++++++++++ .../Explosion/EntitySystems/ExplosionSystem.cs | 3 +++ 2 files changed, 16 insertions(+) diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index 102b461fe02..aa3f114c0e1 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -406,6 +406,19 @@ private void ProcessEntity( _damageableSystem.TryChangeDamage(uid, damage, ignoreResistances: true, damageable: damageable); } + // if it's a container, try to damage all its contents + if (_containersQuery.TryGetComponent(uid, out var containers)) + { + foreach (var container in containers.Containers.Values) + { + foreach (var ent in container.ContainedEntities) + { + // setting throw force to 0 to prevent offset items inside containers + ProcessEntity(ent, epicenter, damage, 0f, id, _transformQuery.GetComponent(uid)); + } + } + } + // throw if (xform != null // null implies anchored && !xform.Anchored diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index aa1ad71b16c..2ddf314fa11 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -21,6 +21,7 @@ using Robust.Server.Player; using Robust.Shared.Audio; using Robust.Shared.Configuration; +using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Components; using Robust.Shared.Player; @@ -51,6 +52,7 @@ public sealed partial class ExplosionSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transformSystem = default!; private EntityQuery _transformQuery; + private EntityQuery _containersQuery; private EntityQuery _damageQuery; private EntityQuery _physicsQuery; private EntityQuery _projectileQuery; @@ -104,6 +106,7 @@ public override void Initialize() InitVisuals(); _transformQuery = GetEntityQuery(); + _containersQuery = GetEntityQuery(); _damageQuery = GetEntityQuery(); _physicsQuery = GetEntityQuery(); _projectileQuery = GetEntityQuery(); From 15ffd57c996cd52557f7470e92d3090873a2a644 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 17:58:56 -0500 Subject: [PATCH 030/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4f37cecfd5d..d0438b44e1e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: crazybrain - changes: - - {message: 'The dead body examine text is more accurate for dead, disconnected - players.', type: Tweak} - id: 4665 - time: '2023-08-23T21:41:54.0000000+00:00' - author: Potato1234_x changes: - {message: Changed shape of short hair to be like the old one., type: Tweak} @@ -2904,3 +2898,9 @@ Entries: - {message: Muting the station news notification on your PDA now works again., type: Fix} id: 5164 time: '2023-11-13T22:43:09.0000000+00:00' +- author: deltanedas + changes: + - {message: Explosions now damage items in containers like backpacks or equipped + items., type: Tweak} + id: 5165 + time: '2023-11-13T22:57:52.0000000+00:00' From 2486d52e7f3ea933e8ea3ead5e28a58d2d920675 Mon Sep 17 00:00:00 2001 From: Tunguso4ka <71643624+Tunguso4ka@users.noreply.github.com> Date: Tue, 14 Nov 2023 01:00:51 +0200 Subject: [PATCH 031/121] space cleaner and fuel dispensers (#21610) * cleaner and oil wall dispensers * fuel * meta jason * yaml * fixed error * suggest Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com> * fuck webedit --------- Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com> --- .../Structures/Storage/Tanks/tanks.yml | 1 + .../Structures/Wallmounts/walldispenser.yml | 77 ++++++++++++++++++ .../Storage/tanks.rsi/cleanerdispenser.png | Bin 0 -> 1069 bytes .../Storage/tanks.rsi/fueldispenser.png | Bin 0 -> 1105 bytes .../Structures/Storage/tanks.rsi/meta.json | 11 ++- .../Storage/tanks.rsi/pepperdispenser.png | Bin 0 -> 1096 bytes 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Entities/Structures/Wallmounts/walldispenser.yml create mode 100644 Resources/Textures/Structures/Storage/tanks.rsi/cleanerdispenser.png create mode 100644 Resources/Textures/Structures/Storage/tanks.rsi/fueldispenser.png create mode 100644 Resources/Textures/Structures/Storage/tanks.rsi/pepperdispenser.png diff --git a/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml b/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml index 5f3b841565d..8a7965fdd77 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml @@ -178,3 +178,4 @@ fillBaseName: watertank-2- - type: ExaminableSolution solution: tank + diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/walldispenser.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/walldispenser.yml new file mode 100644 index 00000000000..26416c0ea6e --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/walldispenser.yml @@ -0,0 +1,77 @@ +- type: entity + id: CleanerDispenser + name: space cleaner dispenser + description: Wallmount reagent dispenser. + components: + - type: WallMount + arc: 180 + - type: Sprite + sprite: Structures/Storage/tanks.rsi + state: cleanerdispenser + - type: Appearance + - type: InteractionOutline + - type: Clickable + - type: Transform + anchored: true + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 5 + behaviors: + - !type:SolutionExplosionBehavior + solution: tank + - trigger: + !type:DamageTypeTrigger + damageType: Piercing + damage: 5 + behaviors: + - !type:SolutionExplosionBehavior + solution: tank + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:SpillBehavior + solution: tank + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/metalbreak.ogg + - !type:DoActsBehavior + acts: ["Destruction"] + - type: SolutionContainerManager + solutions: + tank: + reagents: + - ReagentId: SpaceCleaner + Quantity: 5000 + - type: DrainableSolution + solution: tank + - type: ReagentTank + - type: ExaminableSolution + solution: tank + +- type: entity + parent: CleanerDispenser + id: FuelDispenser + name: fuel dispenser + components: + - type: Sprite + sprite: Structures/Storage/tanks.rsi + state: fueldispenser + - type: SolutionContainerManager + solutions: + tank: + reagents: + - ReagentId: WeldingFuel + Quantity: 1000 diff --git a/Resources/Textures/Structures/Storage/tanks.rsi/cleanerdispenser.png b/Resources/Textures/Structures/Storage/tanks.rsi/cleanerdispenser.png new file mode 100644 index 0000000000000000000000000000000000000000..0d42fa402e435e1fbc12cffb18239c35a4cc8c2e GIT binary patch literal 1069 zcmV+|1k(G7P)(vT3CfBo+ykScb4D8;y1qCG% zR3Ivqri(UYQRRzFxU2NM1K-cy79H4n$*Y#sM)6>(3e9A{1nWjm-UOz@)X=&-i zC|c=(-+XObmUDUoS!j$wT=(+BKq|G?!es$>#x36ophO z)qVz|-uKzi#IKh~q{0?l!f>DP%nt%eyPzq9pSO zQU_7s68?4vMN#lPk3ylq>gp;1P{?FjE}#<$G*_{zs#G4{A`C+ki3F;uQvKx%0KzaN znM|@Z|2eX}Z{lEdVHhGR3JIVQMTcy+m4PUV$mjF%g@Z3(sZ@%cHUHbTjb&MgqKIJ_ zh@yxr%k1s#p=w&o4R|7f@$vCvPjow&oSbab>vcTOdud#jkt8W5&}t8ef5%xXG+$89 z^Ww~iqDV6Nat*gC!MPDQIOBpO0mS`rS`(fdfo62IT8&P_h@Gd?>3^pL2cwilvE_Fw zoEw2AW@cvzMUjz_5r&6{(K8vAS5|<(FoypWKi$2H_-Eu{7@}!fOXufGz%)&wD59^g n4>-Ofq9|(F0~ff!e~v!@r2Ft1c|%pH00000NkvXXu0mjfrGe~> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/tanks.rsi/fueldispenser.png b/Resources/Textures/Structures/Storage/tanks.rsi/fueldispenser.png new file mode 100644 index 0000000000000000000000000000000000000000..333ffde9a9cd0519f7f3b7344a6402d1e15ca16f GIT binary patch literal 1105 zcmV-X1g`suP)f#B!^H?MQO{IA=t#m1}|nm?A>(_)SCb%xGicA&2!p$HSf$b&pR^|J zKF|F8JTo&hXqt90fjVyMYa}B9MqiwT4Kwx4>JpOBe-5-`nkI%Z2!$xSyDQBT&~=?$F2|SIxA^(s zeE`x%nmyw&A3o?{WMqUwSAipEle-5u34(xiZJq7J8dcL|a&j_^B}o#pEaQ0|Ksb^Y zD&Tn@f*|nl;X@Qf0l;-#Y};mbb~X%_%jLp5f*_zM3eM*lgbe84rm$_BJ9~SifUgDy zFirDf0+wYV%QB{El1wJ)?(Qa&$>6#!sZ@&o{(cr07g1G}_V#xA`}^72+G1yC2Y{{z z1K75W7So8uVtm)x34o#~M5EE>6)++Ky=@Z3e44+q$RK^*%ob`8inm& z5N#VNa6`2|85;wRyWepfo-Ql^G^YR@kCLKDT<^I;WUov|ROQLaGu|6WA&L^)nLT#$ zCaGi_q9{>uG&ZvPc(oe0Z{6bly?c1oDxUA7sw%^yqx?8GhhZ4a5l|EbrxsyuX^n)@ z%I^LlS2{Xb`gNOx(MoRrkVLYZ<==Nu6p^x3p(oWxHk-wDU6RQp8yg#VKr$Y0xPZ67%0;yLZ2m-siyBLOnZQEf$%d$wP(}<#oVHk*_h%C!gDiu^sYq$Z=B``id ze&!e545p^0YUOen*L7b6mt`bL3JEmY1LEIF)(G`KsO!3+GNLGkDnjEYxHJMU&$u8- zz_9|rE1U4r2-K@9l}fZ3MwmPni~T!K@N$*1C^r0Vgi9k($IR?3z9=$0Jj~G05PCe$ z+WI>17sl|P;`>LB5dW;)_kA=?Ync2}2^5P(f*|19wQB$;c7$n~1VPZS2VUbf{&V~R Xdl>ufOHIYt00000NkvXXu0mjfe%1a$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/tanks.rsi/meta.json b/Resources/Textures/Structures/Storage/tanks.rsi/meta.json index 93b557cf5a2..c4d31e80b26 100644 --- a/Resources/Textures/Structures/Storage/tanks.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/tanks.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/8442af39ee82b813194f71db82edd2923d97818d, watercooler Taken from paradise at https://github.com/ParadiseSS13/Paradise/commit/ae2258d9235752ac6d80ec11e36553fe3b6ae59e", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/8442af39ee82b813194f71db82edd2923d97818d, watercooler Taken from paradise at https://github.com/ParadiseSS13/Paradise/commit/ae2258d9235752ac6d80ec11e36553fe3b6ae59e, dispensers taken from paradise at https://github.com/ParadiseSS13/Paradise/commit/846ce475b2258a4336d8895f07f2c0f4053963bc", "size": { "x": 32, "y": 32 @@ -117,6 +117,15 @@ }, { "name": "generictank-1" + }, + { + "name": "cleanerdispenser" + }, + { + "name": "fueldispenser" + }, + { + "name": "pepperdispenser" } ] } diff --git a/Resources/Textures/Structures/Storage/tanks.rsi/pepperdispenser.png b/Resources/Textures/Structures/Storage/tanks.rsi/pepperdispenser.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b99b524446dd701aafb921634bae454f2068bd GIT binary patch literal 1096 zcmV-O1h@N%P)dAG#Z;aRR4f+R z+uJ)rU~zHr*en|9KYK1o(jk(^63}%$H0;~nWbM%-%0X?t*7rvCBpKk^wQHO`dlpqy ziO1vY?CdZ-JV+3Vqt+xG3~i>vcI49_IB)+Ri^KK zANn$k^Hi(V<|D z5oaW2@NQCN*30p6p~MHN)=>VufqWm>-rfe1n5KzgoQFb;t*v{_6VP>?d_K=7oxS{a z@ht!zyz+qEnHk=;+ZY-eqR?BQyt>Lq7cLM40n44stS>E5HBClGM?+tcNCZVu@H`J7 z9LWo*`CI2m)9vmARgbQ4@kY z6`x<63Kz8&YC;eM@U7(_s#UIBzRb-VH}I-eJl{uERR%9z;)mO}F$|+Q0zwFuk}vb= z!%cccgkLKj(XKAO+}xM%S3DBk-At^nqedilynwdeUW5?1u1h+dW@Tjs4@f5x4HwX{ z1nR3;RaNFvDSq~ST3T9ARh5NIh6TX)eWHrOOeTY(?7J|YG%HX3%Rg{7?jw=4_OG?8T)!!VF#8AVa3R4S;N)^GzJOJHPVL_z|M_JI6%f;B?@1$A9Ftc)znM59mFaHA_YH3A1`T#7^h!v1(( z6P_A@dUmB!iB`i1gU93Xf9DDgW~s<>!|z5oH3D@^Oitpv?lDY5uXqwhA_^A>o7K;QyKv!26aCAomLC~-VUf>1(bNmS!?EBEu{@2q0 O0000 Date: Tue, 14 Nov 2023 02:23:03 +0300 Subject: [PATCH 032/121] Cak (#21639) * added fun * change recipe, add OwO * fix? --- .../ghost/roles/ghost-role-component.ftl | 6 ++- .../Objects/Consumable/Food/Baked/cake.yml | 37 ++++++++++++++++++ .../Recipes/Cooking/meal_recipes.yml | 13 ++++++ Resources/Textures/Mobs/Pets/cat.rsi/cak.png | Bin 11178 -> 1626 bytes 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 5c98a9d0959..8ced4a9ce04 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -188,4 +188,8 @@ ghost-role-information-Death-Squad-description = One of Nanotrasen's top interna ghost-role-information-Shiva-name = Shiva ghost-role-information-Shiva-description = Shiva, the stations first defender. Help the Head of Security in their work -ghost-role-information-Shiva-rules = Protect security staff and the crew from danger. Stay with Security staff or around the Security department, try to disable criminals and not kill them if the situation allows for it. \ No newline at end of file +ghost-role-information-Shiva-rules = Protect security staff and the crew from danger. Stay with Security staff or around the Security department, try to disable criminals and not kill them if the situation allows for it. + +ghost-role-information-Cak-name = Cak +ghost-role-information-Cak-description = You are the chef's favorite child. You're a living cake cat. +ghost-role-information-Cak-rules = You are a living edible sweet cat. Your task is to find your place in this world where everything wants to eat you. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index 09f5ce27ff5..12c0b30533b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -549,6 +549,43 @@ Quantity: 3 # Tastes like sweetness, cake, jam. +- type: entity + name: cak + id: MobCatCake + parent: FoodCakeBase + description: It's a cake. It's a cat. It's a cak. + components: + - type: Sprite + noRot: true + drawdepth: Mobs + sprite: Mobs/Pets/cat.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: cak + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 50 + mask: + - MobMask + layer: + - MobLayer + - type: RotationVisuals + defaultRotation: 0 + horizontalRotation: 0 + - type: Item + size: Ginormous + - type: GhostRole + prob: 1 + name: ghost-role-information-Cak-name + allowMovement: true + description: ghost-role-information-Cak-description + rules: ghost-role-information-Cak-rules + - type: GhostTakeoverAvailable + - type: OwOAccent # Suppermatter # I can't figure out where to put this. It kind of acts like a cake I guess? diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 92ec1052467..24cbc3cf79a 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1259,6 +1259,19 @@ solids: FoodCakePlain: 1 +- type: microwaveMealRecipe + id: RecipeCatCake + name: cat cake recipe + result: MobCatCake + time: 15 + reagents: + Milk: 15 + Cognizine: 5 + solids: + FoodCakePlain: 1 + FoodSnackRaisins: 1 + OrganAnimalHeart: 1 + - type: microwaveMealRecipe id: RecipeGrapeTart name: grape tart recipe diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cak.png b/Resources/Textures/Mobs/Pets/cat.rsi/cak.png index 19e657b7cbb3807df80c49b6e3155a150e08224d..ced709d1e8f1564b2cbe5d568f49ff37d5baf028 100644 GIT binary patch delta 1240 zcmV;}1Sk8dSK17aBNYLJX+uL$Nkc;*aB^>EX>4Tx04R~Oi5PVOf7!JENB{r?kx4{B zRCt{2n!j%3L>$MzcDQ7Al8W8)r8^f$C=!8&6B73X2&G7YXm|odm5%0$2th}MA|3#p zgeWMs$O{}NMbPAev<*UY9k=YBD4f|%q_ru$Ki{k~V|&Kl97yw#thHyyzklLPGEb(ij%Vou&qtZudadKeo-99v9(-V{W^!Gl-By4 zGGK9f0>&87+s8b78|dwWF^0wIiHo?#jK|~JmgbyeJRUdBe?;p5EKX0beRu=_V2l+9 z0Bj!~Ve!jPwjvu7MNvSlyu$3fIF(W&ilX&pz{W?PSO5R;6I+pu`A=j3vHSgQ<@Gv< zqA0l0y0dej_a5#>UzzJvU^Q4#WYaV?)(OL~FvLc-4J)JmG5|oH{I(LWqnWd&Irtd;nyO-Rf+xphXbg=tBRC zM}Ku8rZIAQ1_0pw547brI6npf;NI@nZEkmCb^*@we+(pt<@5}4dRCO%;GO~U954R- z7?8>U#M|{p8`L1UI8N9HV0Hnd`77}J>Ke(V#LhO)UyJ2AaCPl$j4e{mi(l6uIClYZ z{+;(f4U$WlzY*R7$)zkDr)xsW`O0+@tOGy_$aw%o5XuIv1JX&(l5PqL{ofSp0Mse4 zHNXW^e~?{*@6-h*FaNPBUk9cP^msfTkH_Qjcsw3wy4dv4<;T&sva0;K@ir(%!;EtV z&YANT7$HQ)o;)tjU1X^DvL}z7<<$A3eI1r^UVLV<4FVb3yR!iyMAl}>d~tdLAw<@@ zv#}z(u`NsI$sZlYj~D9A@!mn>j~qgXY-eW&e@T)QWv&}0REJ5XjjSdp~j<*Yqzl`C?L>|M9~&jqg+IsxoYe z_YQ)(v8=NUP+LvMTc3T|SXNctuDgMLVWhVYnE~kKmu(c%U}!UV#c>>vPE$~u*c8Wc ze^BiU^+0TWq)vt>EuyyZ`&<%rpy}jA7C>5wN}6Cht8JT0Mt2b zq6_DB_UL#z=;Oo5w7Av<$7GLj44~9CIX~z>FdC%J0lK6=IM$Y{&I8aoZ^Aqgs))KO zuw18$36Rbfovu1t)c;MkR0cp-em{=!e_V(g<Qn@T%V0Q0zgVpQO=*N42|(%85{U zE#5RMEZ18%Rk~Cgo9q{;3_#PR?%P-rFVl32UT0hFR9J1@-+%kjI1n|h=L*TJHp?`% zUXvyB+5phnd!4YR_1Zx4>sp`cy^hTEcs!o}75@Uu`_GYizMUrk0000 literal 11178 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

e(AJpi5KdDEb5b(7@9w9k)diCbw^tKk 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 b?uRgVRZj)@dYK)w;IWkC)MX2$&4d0AjMA-4 From 804f8bd11e7db6b0cf833db476dc765f1e5b521a Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 18:24:08 -0500 Subject: [PATCH 033/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d0438b44e1e..4c1694d5ff2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,5 @@ Order: 1 Entries: -- author: Potato1234_x - changes: - - {message: Changed shape of short hair to be like the old one., type: Tweak} - id: 4666 - time: '2023-08-23T21:42:33.0000000+00:00' - author: Potato1234_x changes: - {message: Changed the contents of the snack vendor to better fit snacks., type: Tweak} @@ -2904,3 +2899,10 @@ Entries: items., type: Tweak} id: 5165 time: '2023-11-13T22:57:52.0000000+00:00' +- author: TheShuEd + changes: + - {message: 'Now chefs can make a cake cat. You will need: 1 Cake plain, 1 raisin + snack, 1 animal heart, 5u cognizine, 15u milk, 15 second in microwave. And new + sweet ghost role CAK is created!', type: Add} + id: 5166 + time: '2023-11-13T23:23:03.0000000+00:00' From 30fd037189fd5c1502c44336bf565abe04c4a6ea Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 14 Nov 2023 02:55:47 +0300 Subject: [PATCH 034/121] Pet Carrier (Zookeeper gameplay?) (#21545) * add visual * fix item + entityStorage problem, add generation in maints * make pet carrier two-handed * added to cargo * add resistlocker component --- .../SharedEntityStorageComponent.cs | 8 ++- .../SharedEntityStorageSystem.cs | 5 +- .../Catalog/Cargo/cargo_service.yml | 10 +++ .../Markers/Spawners/Random/maintenance.yml | 1 + .../Entities/Objects/Misc/pet_carrier.yml | 66 ++++++++++++++++++ .../Objects/Storage/petcarrier.rsi/icon.png | Bin 0 -> 982 bytes .../Storage/petcarrier.rsi/inhand-left.png | Bin 0 -> 659 bytes .../Storage/petcarrier.rsi/inhand-right.png | Bin 0 -> 659 bytes .../Objects/Storage/petcarrier.rsi/meta.json | 34 +++++++++ .../petcarrier.rsi/pet_carrier_base.png | Bin 0 -> 847 bytes .../petcarrier.rsi/pet_carrier_door.png | Bin 0 -> 254 bytes .../petcarrier.rsi/pet_carrier_open.png | Bin 0 -> 279 bytes .../Objects/Storage/petcarrier.rsi/welded.png | Bin 0 -> 331 bytes 13 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/icon.png create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/meta.json create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_base.png create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_door.png create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_open.png create mode 100644 Resources/Textures/Objects/Storage/petcarrier.rsi/welded.png diff --git a/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs b/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs index 80f38188ea9..b4cd18f4d5c 100644 --- a/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs +++ b/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.Physics; using Content.Shared.Whitelist; using Robust.Shared.Audio; @@ -64,6 +64,12 @@ public abstract partial class SharedEntityStorageComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public float EnteringRange = 0.18f; + ///

+ /// If true, there may be mobs inside the container, even if the container is an Item + /// + [DataField] + public bool ItemCanStoreMobs = false; + /// /// Whether or not to show the contents when the storage is closed /// diff --git a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs index 2d85f79e038..65cf6c5e4cf 100644 --- a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Numerics; using Content.Shared.Body.Components; @@ -417,6 +417,9 @@ private bool CanFit(EntityUid toInsert, EntityUid container, SharedEntityStorage var storeEv = new StoreMobInItemContainerAttemptEvent(); RaiseLocalEvent(container, ref storeEv); allowedToEat = storeEv is { Handled: true, Cancelled: false }; + + if (component.ItemCanStoreMobs) + allowedToEat = true; } } diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index 0ddf41a464f..f010f1ef2f8 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -137,3 +137,13 @@ cost: 2000 category: Service group: market + +- type: cargoProduct + id: ServiceAnimalCarrier + icon: + sprite: Objects/Storage/petcarrier.rsi + state: icon + product: PetCarrier + cost: 500 + category: Service + group: market \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 9f5a076dc1c..9ded479f2dd 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -185,6 +185,7 @@ - CableHVStack10 - CableMVStack10 - CableApcStack10 + - PetCarrier chance: 0.6 offset: 0.0 diff --git a/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml b/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml new file mode 100644 index 00000000000..2e19d0ba196 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml @@ -0,0 +1,66 @@ +- type: entity + id: PetCarrier + name: big pet carrier + description: Allows large animals to be carried comfortably. + parent: BaseStructureDynamic + components: + - type: Sprite + noRot: true + drawdepth: Objects + sprite: Objects/Storage/petcarrier.rsi + layers: + - state: pet_carrier_base + map: ["enum.StorageVisualLayers.Base"] + - state: pet_carrier_door + map: ["enum.StorageVisualLayers.Door"] + - state: welded + visible: false + map: ["enum.WeldableLayers.BaseWelded"] + - type: Icon + sprite: Objects/Storage/petcarrier.rsi + state: icon + - type: InteractionOutline + - type: Physics + - type: MultiHandedItem + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.45 + density: 25 + mask: + - SmallMobMask + layer: + - MachineLayer + - type: EntityStorage + capacity: 1 + airtight: false + itemCanStoreMobs: true + - type: Weldable + - type: ResistLocker + - type: PlaceableSurface + isPlaceable: false + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Appearance + - type: EntityStorageVisuals + stateDoorOpen: pet_carrier_open + stateDoorClosed: pet_carrier_door + - type: ContainerContainer + containers: + entity_storage: !type:Container + paper_label: !type:ContainerSlot + - type: ItemSlots + - type: Item + size: Ginormous + sprite: Objects/Storage/petcarrier.rsi \ No newline at end of file diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/icon.png b/Resources/Textures/Objects/Storage/petcarrier.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a3b9f90e97391cf24da5b55b457392df787d0f GIT binary patch literal 982 zcmV;{11bE8P)^L*+)>8MkXn4tX zznz`;=9}-$o7oydp%9#>8Q`2v6#<9cju?gkaw!=?h+dIsRJpSn0!1bh9XypvW!v`m z_Mo(^Ec=|;*@25CCD~`Q*-ZVCM@Nbz6bac!ZPbbPmb`AJ^e&9GxQ~@F{At7bNkN78ccjbnVClCm5z;Xf6cY3{Ev;qY4 z;}o!dA61}W0zN;R#p`QpS-gX5Ud)7cTYY`jKOxaq6#>DP78l`DI1JzC=IC={QF$Oqi$zUn2?BU8$3LR4On95kz2{?*V3~MY2;|s$Y!yaF$3Sm1g4^w;ZM%sCw6?T} zV$z2k@f{tvp|V<81xW%3rB60u3pfQt-l^$n`dn96Cy8fq3VvZCgh2XaEQCPjNS&LV zg^`gFFc%ep79%NnJv0oRot;osSy?~|5Dz@hQxYDJhc?N{o{O(yr34(s6R0RJr|~oq z*k2fj)z~$dn3#b0<|f@v$+@651<7O*uD7<*w$)e+$NPrSEiDQlc<}BJ1|4Ov5s!mb zBgzp4E|r$jIE?lxAP#BSTy1UiUPubk#)DKzOB0|az{4)y#pdVdX$l$|8sO{XB>mj7 zl4CX+rCsy!Oe8{6(C%_&V)5D+Vesi4#`}B}anJ}oh998Q>1ewV?*&3>nlS#u7oEc7 zB5UErb{jAo3pAcK1=67?dr!{h<7{ruVxowEn;j0(KCmS(zbt{Y3L(_>xgNUoL9pBH zFgY~^W|I*t)*6ULBeY*WCTSvH&_gF)VB(9ivsX|6vTFfl>X_^eCnsqv-19NwGyN5E zuZlph&&zlRf@t_k2MogYsfutqoub%<7hl(y0hrAt>VGBzY2#@cmzS4;$>bAZB#Tiy z2xWX`0>Qq!ScQ-1<<@0TYYZ$=zkfnNAOZi$&i&uP)Px%O-V#SRCt{2+A(O`Ko|w!ccn`gXXsJ_%G4oCI%Y8m1}`1Dq~NJjb_bH|jZ=9t zh9*!?T{>mTRPc~RP*SpVF*Fc5Wb%P<2*yOR@pv6v1Pl+_>Xr*=Pl45XYsQ@dzSdh~=}1;1KuW2s zgY$^?!&d7pNGVmVRzsuFh@FC3BVc9!yH?|-&n%*Cy%8|%BJpZA>?VC8w(ZHWElLfg zPRpULiGD9p+uBngvw+f=)%HXA3HxcZ2tEbcBU==960NT4$Cu3h0|aeP)+q`*N+*wq zh=_=Yh=_=Yh{)9cbOyknFJ|A*w?}6Hq?D@Tx}jUImX~2!Rwm!)XPr&3EK3A^NL#o5 z*4P7tcZ2r7;D29U;?DE1l*{4H^RSW6k9KwqUxJiU4Sav*y_Mb5sXfCajJC$w$0c-J z7l*bD0B{`VKK*%dfsX4YK3Os@DtG`G_&(alrL@%pFnj^l!8rh+SS(JZOSxRAj7j~b zWuh2Ofq>&Uc)zt3N`seSLiBsF2O~tkXEX)O)_~h<0IwrQfVjO*-$9*o35MJDMpHmF zD`LHRhK+n4KzI#!v$lry>KRnCl6nzT&5DQ&aM(4fA29tH3@Ul|N&WixHk4-?{AB%j t@iLs5LGVCEYXC3`c&-+CLWPK)tiRZd8)p=8W03#=002ovPDHLkV1mkCHrfCH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/inhand-right.png b/Resources/Textures/Objects/Storage/petcarrier.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..d633c112256dce7f80557ec03bee24b19ebe008e GIT binary patch literal 659 zcmV;E0&M+>P)Px%O-V#SRCt{2+A(O`Ko|w!ccn`gXXsJ_%G4oCI%Y8m1}`1Dq~NJjb_bH|jZ=9t zh9*!?T{>mTRPc~RP*SpVF*Fc5Wb%P<2*yOR@pv6v1Pl+_>Xr*=Pl45XYsQ@dzSdh~=}1;1KuW2s zgY$^?!&d7pNGVmVRzsuFh@FC3BVc9!yH?|-&n%*Cy%8|%BJpZA>?VC8w(ZHWElLfg zPRpULiGD9p+uBngvw+f=)%HXA3HxcZ2tEbcBU==960NT4$Cu3h0|aeP)+q`*N+*wq zh=_=Yh=_=Yh{)9cbOyknFJ|A*w?}6Hq?D@Tx}jUImX~2!Rwm!)XPr&3EK3A^NL#o5 z*4P7tcZ2r7;D29U;?DE1l*{4H^RSW6k9KwqUxJiU4Sav*y_Mb5sXfCajJC$w$0c-J z7l*bD0B{`VKK*%dfsX4YK3Os@DtG`G_&(alrL@%pFnj^l!8rh+SS(JZOSxRAj7j~b zWuh2Ofq>&Uc)zt3N`seSLiBsF2O~tkXEX)O)_~h<0IwrQfVjO*-$9*o35MJDMpHmF zD`LHRhK+n4KzI#!v$lry>KRnCl6nzT&5DQ&aM(4fA29tH3@Ul|N&WixHk4-?{AB%j t@iLs5LGVCEYXC3`c&-+CLWPK)tiRZd8)p=8W03#=002ovPDHLkV1mkCHrfCH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/meta.json b/Resources/Textures/Objects/Storage/petcarrier.rsi/meta.json new file mode 100644 index 00000000000..0843ad299ce --- /dev/null +++ b/Resources/Textures/Objects/Storage/petcarrier.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from TGstation at https://github.com/tgstation/tgstation/commit/8b1ffd1e49a2d30a0aab63264106a3ec0e07f415 and edited by TheShuEd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "pet_carrier_base" + }, + { + "name": "pet_carrier_door" + }, + { + "name": "pet_carrier_open" + }, + { + "name": "icon" + }, + { + "name": "welded" + } + ] +} diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_base.png b/Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_base.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4e86d740b11bbddb827a3edc141f08fb9bc1e0 GIT binary patch literal 847 zcmV-V1F-ywP)Px&2}wjjR9J=WS36G|K@k4-o=7283(~m9rO)S*e}FJZ zDO^#6hB7iu3S0+MUcXsZ8e;rKp^6czv zY5s0wgBW9AOenqtA_5WN*Tuz>a6X?G$}3?8S2T?nV;GG_vv>Vo4~b-QHh<`L@oIH- zHrI6>E1E{X$Kz1OQkcNgs28253N@q(H6)Tr^n1NPJwF6yKvz{t8-~zWs!&6tn8R8& zD&OjbaY(_kJQ(s0r6i(?rE8!^mW?ead~a5O@YkB@>oq3D?qwfkrWh zMlmN`w=4^#l9+sC0+osd(`O50S;ks6E35(lFw13BDq`}B2rR>rId^_{dpmpXcDq7( z@BQ2L^_l*Ik8C6Y912|W4Z<72dK z8~v;EcmzO%FDJui2ICNL2Y2nnuL1%vPn#r3Gow))&z~{1SSL98kPKkyED+})#^5;qHSN~Cd-_4ad+#Bz7u1VejCHQDKl}hr1XYn2O6>Vi z6&aieM~|Ceoom#KTcID65!x{a2+&lo3WB53R0SAJ^&%kBui4h#k9ao`fO_#$q+hfD Z_yY}_n$>D_vl;*Z002ovPDHLkV1hJ-c)0)o literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_door.png b/Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_door.png new file mode 100644 index 0000000000000000000000000000000000000000..4208bb961fb338f950208b15724890ab741dfee7 GIT binary patch literal 254 zcmVPx#xJg7oR9J=W)J+P5Fc1ac*A}IKqOpp_Ey zLl@$FtG7@Y-xvYL7-MWJh{(p|P{;hy@*F}gx(|ar6$PrY1OU9|*_)r!giG57Jv-Qb zSD=-$z3!HQsuN$i~*b%;%=r@Ct5y zpFI6z9E0BeucsjE1T5|IM`VnF5CU2$oATwm`x*0j1Aqps!o2*k>i_@%07*qoM6N<$ Eg4-c*4gdfE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_open.png b/Resources/Textures/Objects/Storage/petcarrier.rsi/pet_carrier_open.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc200bded5944271b66bf5ef24ff3eaada60ff2 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}7d>4ZLn2z= zPB|#pqQK*NSgc`hMB`o$RuL!Gh2q*9#4{ACPx-Y;vWtl6SBl$MJo_ljyg;LCk%pJD z;6x>*y=nqZ3SyE!@1CDKU0G@AoOUl0&Vqw?Ee}7}=u~6W(`gMlr~K+V>l5G8D$4`~ zJKHCm4|=EBAAKQuN92Q5tb!BEp7;1X(Pt`plqzJ?(!JI8>+k3bzs>L5Vm9hL8pWY_ z;R;KNkdC2hqmZA{Q=WUjE3F@9$$ts(ePGdd|MQBk+AEK#vobK8`>evyP#Sx7Tkhf3 bWuIBUB{t+IFE8^3dXB-<)z4*}Q$iB}i=k@* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/petcarrier.rsi/welded.png b/Resources/Textures/Objects/Storage/petcarrier.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..93b9c1dbc8a507d616faae479186d8d9daeed50e GIT binary patch literal 331 zcmV-R0kr;!P)Px$1xZ9fR9J=WmCccZFbstsTY+w*15$=cP#318O&2afWrPm!%^i48&XVkaWgwHo z`nxem^0TZTpwVbF8vmWH)cEu-u^JU#f-83@rQoU2FU6y0TG?I3vv-zvrzl?=J}pCBJjI<=MesM%5@m3 d)^X$G`~X@jXKP|A2qypl002ovPDHLkV1k~xlMVm? literal 0 HcmV?d00001 From 8ba8cf510e57ca5d59eaee068e49422aa89acbbc Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 18:56:52 -0500 Subject: [PATCH 035/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4c1694d5ff2..00910000c27 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: Potato1234_x - changes: - - {message: Changed the contents of the snack vendor to better fit snacks., type: Tweak} - - {message: 'Added C&Ds, Bob''s sunflower seeds and Sweetie''s pistachios.', type: Add} - id: 4667 - time: '2023-08-23T21:49:25.0000000+00:00' - author: Lank changes: - {message: 'The Syndicate EMAG now provides cyborgs with an updated lawset on use, @@ -2906,3 +2900,9 @@ Entries: sweet ghost role CAK is created!', type: Add} id: 5166 time: '2023-11-13T23:23:03.0000000+00:00' +- author: TheShuEd + changes: + - {message: Animal carriers can now be found in the maintenance or bought in cargo. + They are useful for carrying someone heavy in your arms., type: Add} + id: 5167 + time: '2023-11-13T23:55:48.0000000+00:00' From 7eef08d1c0ac5dd086c5186304b6a9e92de9c671 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 13 Nov 2023 22:27:14 -0500 Subject: [PATCH 036/121] Minimalist Action Bar (#21352) --- Content.Client/Input/ContentContexts.cs | 5 - .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 4 - .../Screens/DefaultGameScreen.xaml | 2 +- .../Screens/DefaultGameScreen.xaml.cs | 2 +- .../Screens/SeparatedChatGameScreen.xaml.cs | 2 +- .../Systems/Actions/ActionUIController.cs | 257 ++++-------------- .../Systems/Actions/Controls/ActionButton.cs | 25 +- .../Actions/Controls/ActionButtonContainer.cs | 47 +++- .../Systems/Actions/Widgets/ActionsBar.xaml | 4 +- .../Actions/Widgets/ActionsBar.xaml.cs | 23 +- Content.Shared/Input/ContentKeyFunctions.cs | 17 -- Resources/keybinds.yml | 40 --- 12 files changed, 111 insertions(+), 317 deletions(-) diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 8efd977b206..ba8b72788e6 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -80,11 +80,6 @@ public static void SetupContexts(IInputContextContainer contexts) common.AddFunction(boundKey); } - foreach (var boundKey in ContentKeyFunctions.GetLoadoutBoundKeys()) - { - common.AddFunction(boundKey); - } - var aghost = contexts.New("aghost", "common"); aghost.AddFunction(EngineKeyFunctions.MoveUp); aghost.AddFunction(EngineKeyFunctions.MoveDown); diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index c68e7f3af95..87b1f10352f 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -224,10 +224,6 @@ void AddCheckBox(string checkBoxName, bool currentState, Action + - diff --git a/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs index c35d831035e..a8a53e83c78 100644 --- a/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs +++ b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs @@ -17,7 +17,6 @@ public DefaultGameScreen() SetAnchorPreset(MainViewport, LayoutPreset.Wide); SetAnchorPreset(ViewportContainer, LayoutPreset.Wide); SetAnchorAndMarginPreset(TopLeft, LayoutPreset.TopLeft, margin: 10); - SetAnchorAndMarginPreset(Actions, LayoutPreset.BottomLeft, margin: 10); SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80); SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5); SetAnchorAndMarginPreset(Chat, LayoutPreset.TopRight, margin: 10); @@ -25,6 +24,7 @@ public DefaultGameScreen() Chat.OnResized += ChatOnResized; Chat.OnChatResizeFinish += ChatOnResizeFinish; + Actions.ActionsContainer.Columns = 1; } private void ChatOnResizeFinish(Vector2 _) diff --git a/Content.Client/UserInterface/Screens/SeparatedChatGameScreen.xaml.cs b/Content.Client/UserInterface/Screens/SeparatedChatGameScreen.xaml.cs index 41c4a85e7ee..e0c66b7a8bb 100644 --- a/Content.Client/UserInterface/Screens/SeparatedChatGameScreen.xaml.cs +++ b/Content.Client/UserInterface/Screens/SeparatedChatGameScreen.xaml.cs @@ -19,7 +19,7 @@ public SeparatedChatGameScreen() SetAnchorPreset(ViewportContainer, LayoutPreset.Wide); SetAnchorPreset(MainViewport, LayoutPreset.Wide); SetAnchorAndMarginPreset(VoteMenu, LayoutPreset.TopLeft, margin: 10); - SetAnchorAndMarginPreset(Actions, LayoutPreset.BottomLeft, margin: 10); + SetAnchorAndMarginPreset(Actions, LayoutPreset.TopLeft, margin: 10); SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80); SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5); SetAnchorAndMarginPreset(Alerts, LayoutPreset.CenterRight, margin: 10); diff --git a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs index 340aa5447dd..5a992786a29 100644 --- a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs +++ b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs @@ -1,6 +1,5 @@ using System.Linq; using System.Numerics; -using System.Runtime.InteropServices; using Content.Client.Actions; using Content.Client.Construction; using Content.Client.Gameplay; @@ -49,17 +48,14 @@ public sealed class ActionUIController : UIController, IOnStateChanged _pages = new(); - private int _currentPageIndex = DefaultPageIndex; + private readonly List _actions = new(); private readonly DragDropHelper _menuDragHelper; private readonly TextureRect _dragShadow; private ActionsWindow? _window; private ActionsBar? ActionsBar => UIManager.GetActiveUIWidgetOrNull(); private MenuButton? ActionButton => UIManager.GetActiveUIWidgetOrNull()?.ActionButton; - private ActionPage CurrentPage => _pages[_currentPageIndex]; public bool IsDragging => _menuDragHelper.IsDragging; @@ -79,14 +75,6 @@ public ActionUIController() SetSize = new Vector2(64, 64), MouseFilter = MouseFilterMode.Ignore }; - - var pageCount = ContentKeyFunctions.GetLoadoutBoundKeys().Length; - var buttonCount = ContentKeyFunctions.GetHotbarBoundKeys().Length; - for (var i = 0; i < pageCount; i++) - { - var page = new ActionPage(buttonCount); - _pages.Add(page); - } } public override void Initialize() @@ -139,15 +127,6 @@ public void OnStateEntered(GameplayState state) }, false, true)); } - var loadoutKeys = ContentKeyFunctions.GetLoadoutBoundKeys(); - for (var i = 0; i < loadoutKeys.Length; i++) - { - var boundId = i; // This is needed, because the lambda captures it. - var boundKey = loadoutKeys[i]; - builder = builder.Bind(boundKey, - InputCmdHandler.FromDelegate(_ => ChangePage(boundId))); - } - builder .Bind(ContentKeyFunctions.OpenActionsMenu, InputCmdHandler.FromDelegate(_ => ToggleWindow())) @@ -178,7 +157,7 @@ private bool TargetingOnUse(in PointerInputCmdArgs args) if (!_timing.IsFirstTimePredicted || _actionsSystem == null || SelectingTargetFor is not { } actionId) return false; - if (_playerManager.LocalPlayer?.ControlledEntity is not { } user) + if (_playerManager.LocalEntity is not { } user) return false; if (!EntityManager.TryGetComponent(user, out ActionsComponent? comp)) @@ -332,76 +311,16 @@ public void OnStateExited(GameplayState state) private void TriggerAction(int index) { if (_actionsSystem == null || - CurrentPage[index] is not { } actionId || + !_actions.TryGetValue(index, out var actionId) || !_actionsSystem.TryGetActionData(actionId, out var baseAction)) { return; } if (baseAction is BaseTargetActionComponent action) - ToggleTargeting(actionId, action); + ToggleTargeting(actionId.Value, action); else - _actionsSystem?.TriggerAction(actionId, baseAction); - } - - private void ChangePage(int index) - { - if (_actionsSystem == null) - return; - - var lastPage = _pages.Count - 1; - if (index < 0) - { - index = lastPage; - } - else if (index > lastPage) - { - index = 0; - } - - _currentPageIndex = index; - var page = _pages[_currentPageIndex]; - _container?.SetActionData(_actionsSystem, page); - - ActionsBar!.PageButtons.Label.Text = $"{_currentPageIndex + 1}"; - } - - private void OnLeftArrowPressed(ButtonEventArgs args) - { - ChangePage(_currentPageIndex - 1); - } - - private void OnRightArrowPressed(ButtonEventArgs args) - { - ChangePage(_currentPageIndex + 1); - } - - private void AppendAction(EntityUid action) - { - if (_container == null) - return; - - foreach (var button in _container.GetButtons()) - { - if (button.ActionId != null) - continue; - - SetAction(button, action); - return; - } - - foreach (var page in _pages) - { - for (var i = 0; i < page.Size; i++) - { - var pageAction = page[i]; - if (pageAction != null) - continue; - - page[i] = action; - return; - } - } + _actionsSystem?.TriggerAction(actionId.Value, baseAction); } private void OnActionAdded(EntityUid actionId) @@ -416,18 +335,10 @@ private void OnActionAdded(EntityUid actionId) if (action is BaseTargetActionComponent targetAction && action.Toggled) StartTargeting(actionId, targetAction); - foreach (var page in _pages) - { - for (var i = 0; i < page.Size; i++) - { - if (page[i] == actionId) - { - return; - } - } - } + if (_actions.Contains(actionId)) + return; - AppendAction(actionId); + _actions.Add(actionId); } private void OnActionRemoved(EntityUid actionId) @@ -435,40 +346,18 @@ private void OnActionRemoved(EntityUid actionId) if (_container == null) return; - // stop targeting if the action is removed if (actionId == SelectingTargetFor) StopTargeting(); - foreach (var button in _container.GetButtons()) - { - if (button.ActionId == actionId) - { - SetAction(button, null); - } - } - - foreach (var page in _pages) - { - for (var i = 0; i < page.Size; i++) - { - if (page[i] == actionId) - { - page[i] = null; - } - } - } + _actions.RemoveAll(x => x == actionId); } private void OnActionsUpdated() { QueueWindowUpdate(); - if (_container == null) - return; - foreach (var button in _container.GetButtons()) - { - button.UpdateIcons(); - } + if (_actionsSystem != null) + _container?.SetActionData(_actionsSystem, _actions.ToArray()); } private void ActionButtonPressed(ButtonEventArgs args) @@ -512,8 +401,8 @@ private bool MatchesFilter(BaseActionComponent action, Filters filter) return filter switch { Filters.Enabled => action.Enabled, - Filters.Item => action.Container != null && action.Container != _playerManager.LocalPlayer?.ControlledEntity, - Filters.Innate => action.Container == null || action.Container == _playerManager.LocalPlayer?.ControlledEntity, + Filters.Item => action.Container != null && action.Container != _playerManager.LocalEntity, + Filters.Innate => action.Container == null || action.Container == _playerManager.LocalEntity, Filters.Instant => action is InstantActionComponent, Filters.Targeted => action is BaseTargetActionComponent, _ => throw new ArgumentOutOfRangeException(nameof(filter), filter, null) @@ -580,7 +469,7 @@ private void SearchAndDisplay() if (_actionsSystem == null) return; - if (_playerManager.LocalPlayer?.ControlledEntity is not { } player) + if (_playerManager.LocalEntity is not { } player) return; var search = _window.SearchBar.Text; @@ -615,7 +504,7 @@ private void SearchAndDisplay() PopulateActions(actions); } - private void SetAction(ActionButton button, EntityUid? actionId) + private void SetAction(ActionButton button, EntityUid? actionId, bool updateSlots = true) { if (_actionsSystem == null) return; @@ -627,22 +516,30 @@ private void SetAction(ActionButton button, EntityUid? actionId) button.ClearData(); if (_container?.TryGetButtonIndex(button, out position) ?? false) { - CurrentPage[position] = actionId; + _actions.RemoveAt(position); } - - return; } - - if (button.TryReplaceWith(actionId.Value, _actionsSystem) && + else if (button.TryReplaceWith(actionId.Value, _actionsSystem) && _container != null && _container.TryGetButtonIndex(button, out position)) { - CurrentPage[position] = actionId; + if (position >= _actions.Count) + { + _actions.Add(actionId); + } + else + { + _actions[position] = actionId; + } } + + if (updateSlots) + _container?.SetActionData(_actionsSystem, _actions.ToArray()); } private void DragAction() { + EntityUid? swapAction = null; if (UIManager.CurrentlyHovered is ActionButton button) { if (!_menuDragHelper.IsDragging || _menuDragHelper.Dragged?.ActionId is not { } type) @@ -651,14 +548,18 @@ private void DragAction() return; } - SetAction(button, type); + swapAction = button.ActionId; + SetAction(button, type, false); } if (_menuDragHelper.Dragged is {Parent: ActionButtonContainer} old) { - SetAction(old, null); + SetAction(old, swapAction, false); } + if (_actionsSystem != null) + _container?.SetActionData(_actionsSystem, _actions.ToArray()); + _menuDragHelper.EndDrag(); } @@ -737,6 +638,7 @@ private void OnActionUnpressed(GUIBoundKeyEventArgs args, ActionButton button) if (args.Function != EngineKeyFunctions.UIClick || _actionsSystem == null) return; + //todo: make dragging onto the same spot NOT trigger again if (UIManager.CurrentlyHovered == button) { _menuDragHelper.EndDrag(); @@ -813,9 +715,6 @@ private void UnloadGui() return; } - ActionsBar.PageButtons.LeftArrow.OnPressed -= OnLeftArrowPressed; - ActionsBar.PageButtons.RightArrow.OnPressed -= OnRightArrowPressed; - if (_window != null) { _window.OnOpen -= OnWindowOpened; @@ -846,9 +745,6 @@ private void LoadGui() return; } - ActionsBar.PageButtons.LeftArrow.OnPressed += OnLeftArrowPressed; - ActionsBar.PageButtons.RightArrow.OnPressed += OnRightArrowPressed; - RegisterActionContainer(ActionsBar.ActionsContainer); _actionsSystem?.LinkAllActions(); @@ -856,12 +752,6 @@ private void LoadGui() public void RegisterActionContainer(ActionButtonContainer container) { - if (_container != null) - { - _container.ActionPressed -= OnActionPressed; - _container.ActionUnpressed -= OnActionPressed; - } - _container = container; _container.ActionPressed += OnActionPressed; _container.ActionUnpressed += OnActionUnpressed; @@ -877,12 +767,12 @@ private void AssignSlots(List assignments) if (_actionsSystem == null) return; - foreach (ref var assignment in CollectionsMarshal.AsSpan(assignments)) + for (var i = 0; i < assignments.Count; i++) { - _pages[assignment.Hotbar][assignment.Slot] = assignment.ActionId; + _actions[i] = assignments[i].ActionId; } - _container?.SetActionData(_actionsSystem, _pages[_currentPageIndex]); + _container?.SetActionData(_actionsSystem, _actions.ToArray()); } public void RemoveActionContainer() @@ -918,8 +808,8 @@ private void OnComponentLinked(ActionsComponent component) if (_actionsSystem == null) return; - LoadDefaultActions(component); - _container?.SetActionData(_actionsSystem, _pages[DefaultPageIndex]); + LoadDefaultActions(); + _container?.SetActionData(_actionsSystem, _actions.ToArray()); QueueWindowUpdate(); } @@ -930,7 +820,7 @@ private void OnComponentUnlinked() StopTargeting(); } - private void LoadDefaultActions(ActionsComponent component) + private void LoadDefaultActions() { if (_actionsSystem == null) return; @@ -938,36 +828,11 @@ private void LoadDefaultActions(ActionsComponent component) var actions = _actionsSystem.GetClientActions().Where(action => action.Comp.AutoPopulate).ToList(); actions.Sort(ActionComparer); - var offset = 0; - var totalPages = _pages.Count; - var pagesLeft = totalPages; - var currentPage = DefaultPageIndex; - while (pagesLeft > 0) + _actions.Clear(); + foreach (var (action, _) in actions) { - var page = _pages[currentPage]; - var pageSize = page.Size; - - for (var slot = 0; slot < pageSize; slot++) - { - var actionIndex = slot + offset; - if (actionIndex < actions.Count) - { - page[slot] = actions[slot + offset].Id; - } - else - { - page[slot] = null; - } - } - - offset += pageSize; - currentPage++; - if (currentPage == totalPages) - { - currentPage = 0; - } - - pagesLeft--; + if (!_actions.Contains(action)) + _actions.Add(action); } } @@ -1078,34 +943,4 @@ private void StopTargeting() handOverlay.IconOverride = null; handOverlay.EntityOverride = null; } - - - //TODO: Serialize this shit - private sealed class ActionPage - { - private readonly EntityUid?[] _data; - - public ActionPage(int size) - { - _data = new EntityUid?[size]; - } - - public EntityUid? this[int index] - { - get => _data[index]; - set => _data[index] = value; - } - - public static implicit operator EntityUid?[](ActionPage p) - { - return p._data.ToArray(); - } - - public void Clear() - { - Array.Fill(_data, null); - } - - public int Size => _data.Length; - } } diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs index 31c5a28e520..6b2033e78c0 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs @@ -49,6 +49,8 @@ public BoundKeyFunction? KeyBind private readonly SpriteView _smallItemSpriteView; private readonly SpriteView _bigItemSpriteView; + private Texture? _buttonBackgroundTexture; + public EntityUid? ActionId { get; private set; } private BaseActionComponent? _action; public bool Locked { get; set; } @@ -138,9 +140,9 @@ public ActionButton(IEntityManager entities, SpriteSystem? spriteSys = null, Act }); Cooldown = new CooldownGraphic {Visible = false}; + AddChild(Button); AddChild(_bigActionIcon); AddChild(_bigItemSpriteView); - AddChild(Button); AddChild(HighlightRect); AddChild(Label); AddChild(Cooldown); @@ -167,7 +169,7 @@ public ActionButton(IEntityManager entities, SpriteSystem? spriteSys = null, Act protected override void OnThemeUpdated() { base.OnThemeUpdated(); - Button.Texture = Theme.ResolveTexture("SlotBackground"); + _buttonBackgroundTexture = Theme.ResolveTexture("SlotBackground"); Label.FontColorOverride = Theme.ResolveColorOrSpecified("whiteText"); } @@ -263,6 +265,7 @@ private void SetActionIcon(Texture? texture) public void UpdateIcons() { UpdateItemIcon(); + UpdateBackground(); if (_action == null) { @@ -278,6 +281,18 @@ public void UpdateIcons() SetActionIcon(_action.Icon != null ? _spriteSys.Frame0(_action.Icon) : null); } + public void UpdateBackground() + { + if (_action == null) + { + Button.Texture = null; + } + else + { + Button.Texture = _buttonBackgroundTexture; + } + } + public bool TryReplaceWith(EntityUid actionId, ActionsSystem system) { if (Locked) @@ -363,7 +378,8 @@ public void Depress(GUIBoundKeyEventArgs args, bool depress) public void DrawModeChanged() { - HighlightRect.Visible = _beingHovered; + _controller ??= UserInterfaceManager.GetUIController(); + HighlightRect.Visible = _beingHovered && (_action != null || _controller.IsDragging); // always show the normal empty button style if no action in this slot if (_action == null) @@ -373,8 +389,7 @@ public void DrawModeChanged() } // show a hover only if the action is usable or another action is being dragged on top of this - _controller ??= UserInterfaceManager.GetUIController(); - if (_beingHovered && (_controller.IsDragging || _action.Enabled)) + if (_beingHovered && (_controller.IsDragging || _action!.Enabled)) { SetOnlyStylePseudoClass(ContainerButton.StylePseudoClassHover); } diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs index 9986c61ad63..5e26c192d7c 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs @@ -1,12 +1,19 @@ +using System.Linq; using Content.Client.Actions; +using Content.Shared.Input; +using Robust.Client.Input; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Shared.Utility; namespace Content.Client.UserInterface.Systems.Actions.Controls; [Virtual] public class ActionButtonContainer : GridContainer { + [Dependency] private readonly IEntityManager _entity = default!; + [Dependency] private readonly IInputManager _input = default!; + public event Action? ActionPressed; public event Action? ActionUnpressed; public event Action? ActionFocusExited; @@ -14,7 +21,6 @@ public class ActionButtonContainer : GridContainer public ActionButtonContainer() { IoCManager.InjectDependencies(this); - UserInterfaceManager.GetUIController().RegisterActionContainer(this); } public ActionButton this[int index] @@ -22,17 +28,42 @@ public ActionButton this[int index] get => (ActionButton) GetChild(index); } - public void SetActionData(ActionsSystem system, params EntityUid?[] actionTypes) + private void BuildActionButtons(int count) { - ClearActionData(); + var keys = ContentKeyFunctions.GetHotbarBoundKeys(); - for (var i = 0; i < actionTypes.Length; i++) + Children.Clear(); + for (var index = 0; index < count; index++) { - var action = actionTypes[i]; - if (action == null) - continue; + Children.Add(MakeButton(index)); + } + + ActionButton MakeButton(int index) + { + var button = new ActionButton(_entity); + + if (keys.TryGetValue(index, out var boundKey)) + { + button.KeyBind = boundKey; + + var binding = _input.GetKeyBinding(boundKey); + button.Label.Text = binding.GetKeyString(); + } - ((ActionButton) GetChild(i)).UpdateData(action.Value, system); + return button; + } + } + + public void SetActionData(ActionsSystem system, params EntityUid?[] actionTypes) + { + var uniqueCount = Math.Min(system.GetClientActions().Count(), actionTypes.Length + 1); + BuildActionButtons(uniqueCount); + + for (var i = 0; i < uniqueCount; i++) + { + if (!actionTypes.TryGetValue(i, out var action)) + action = null; + ((ActionButton) GetChild(i)).UpdateData(action, system); } } diff --git a/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml b/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml index 7e4d60a0571..1d317f6155d 100644 --- a/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml +++ b/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml @@ -13,7 +13,7 @@ VerticalAlignment="Center" MaxSize="64 9999" Name="ActionsContainer" - Access="Public"/> - + Access="Public" + Rows="1"/> diff --git a/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml.cs b/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml.cs index ff3c32cc0e6..8e95992ff64 100644 --- a/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml.cs +++ b/Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml.cs @@ -1,6 +1,4 @@ -using Content.Client.UserInterface.Systems.Actions.Controls; -using Content.Shared.Input; -using Robust.Client.AutoGenerated; +using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; @@ -9,28 +7,9 @@ namespace Content.Client.UserInterface.Systems.Actions.Widgets; [GenerateTypedNameReferences] public sealed partial class ActionsBar : UIWidget { - [Dependency] private readonly IEntityManager _entity = default!; - public ActionsBar() { RobustXamlLoader.Load(this); - IoCManager.InjectDependencies(this); - - var keys = ContentKeyFunctions.GetHotbarBoundKeys(); - for (var index = 1; index < keys.Length; index++) - { - ActionsContainer.Children.Add(MakeButton(index)); - } - ActionsContainer.Children.Add(MakeButton(0)); - - ActionButton MakeButton(int index) - { - var boundKey = keys[index]; - var button = new ActionButton(_entity); - button.KeyBind = boundKey; - button.Label.Text = index.ToString(); - return button; - } } } diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 840320b0d3b..f4307cd058c 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -84,23 +84,6 @@ public static BoundKeyFunction[] GetHotbarBoundKeys() => Hotbar1, Hotbar2, Hotbar3, Hotbar4, Hotbar5, Hotbar6, Hotbar7, Hotbar8, Hotbar9, Hotbar0 }; - public static readonly BoundKeyFunction Loadout0 = "Loadout0"; - public static readonly BoundKeyFunction Loadout1 = "Loadout1"; - public static readonly BoundKeyFunction Loadout2 = "Loadout2"; - public static readonly BoundKeyFunction Loadout3 = "Loadout3"; - public static readonly BoundKeyFunction Loadout4 = "Loadout4"; - public static readonly BoundKeyFunction Loadout5 = "Loadout5"; - public static readonly BoundKeyFunction Loadout6 = "Loadout6"; - public static readonly BoundKeyFunction Loadout7 = "Loadout7"; - public static readonly BoundKeyFunction Loadout8 = "Loadout8"; - public static readonly BoundKeyFunction Loadout9 = "Loadout9"; - - public static BoundKeyFunction[] GetLoadoutBoundKeys() => - new[] - { - Loadout1, Loadout2, Loadout3, Loadout4, Loadout5, Loadout6, Loadout7, Loadout8, Loadout9, Loadout0 - }; - public static readonly BoundKeyFunction Vote0 = "Vote0"; public static readonly BoundKeyFunction Vote1 = "Vote1"; public static readonly BoundKeyFunction Vote2 = "Vote2"; diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 1b82435861a..b3ba05def26 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -510,43 +510,3 @@ binds: - function: Hotbar9 type: State key: Num9 -- function: Loadout0 - type: State - key: Num0 - mod1: Shift -- function: Loadout1 - type: State - key: Num1 - mod1: Shift -- function: Loadout2 - type: State - key: Num2 - mod1: Shift -- function: Loadout3 - type: State - key: Num3 - mod1: Shift -- function: Loadout4 - type: State - key: Num4 - mod1: Shift -- function: Loadout5 - type: State - key: Num5 - mod1: Shift -- function: Loadout6 - type: State - key: Num6 - mod1: Shift -- function: Loadout7 - type: State - key: Num7 - mod1: Shift -- function: Loadout8 - type: State - key: Num8 - mod1: Shift -- function: Loadout9 - type: State - key: Num9 - mod1: Shift From 8b7fe0c3189b611158e589362bb1bd08008a1f18 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 13 Nov 2023 22:28:21 -0500 Subject: [PATCH 037/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 00910000c27..23d545891a2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,5 @@ Order: 1 Entries: -- author: Lank - changes: - - {message: 'The Syndicate EMAG now provides cyborgs with an updated lawset on use, - making typical laws only apply to the user and preventing your new "friend" - from outing your activities, in addition to stunning the cyborg for a short - time.', type: Tweak} - id: 4668 - time: '2023-08-23T23:55:00.0000000+00:00' - author: lapatison changes: - {message: 'Gardening cyborg module has been splitted into harvesting (scythe, @@ -2906,3 +2898,13 @@ Entries: They are useful for carrying someone heavy in your arms., type: Add} id: 5167 time: '2023-11-13T23:55:48.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: The action bar now dynamically expands to the amount of actions present., + type: Tweak} + - {message: The action bar is now positioned along the top of the screen in the + separated UI mode., type: Tweak} + - {message: Fixed the action bar not displaying the correct hotkeys for actions., + type: Fix} + id: 5168 + time: '2023-11-14T03:27:14.0000000+00:00' From 3dfb173bce870938a7b3b80d68e79a677b8ee884 Mon Sep 17 00:00:00 2001 From: Justin Pfeifler Date: Tue, 14 Nov 2023 04:52:18 -0600 Subject: [PATCH 038/121] Add Check For Gravity On Thrown Items (#21647) --- Content.Shared/Throwing/ThrownItemSystem.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index 073252eb927..4cc4516f3d9 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -1,6 +1,7 @@ using System.Linq; using Content.Shared.Administration.Logs; using Content.Shared.Database; +using Content.Shared.Gravity; using Content.Shared.Physics; using Content.Shared.Physics.Pull; using Robust.Shared.Physics; @@ -21,6 +22,7 @@ public sealed class ThrownItemSystem : EntitySystem [Dependency] private readonly SharedBroadphaseSystem _broadphase = default!; [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; private const string ThrowingFixture = "throw-fixture"; @@ -111,13 +113,13 @@ public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) } } - EntityManager.EventBus.RaiseLocalEvent(uid, new StopThrowEvent {User = thrownItemComponent.Thrower}, true); + EntityManager.EventBus.RaiseLocalEvent(uid, new StopThrowEvent { User = thrownItemComponent.Thrower }, true); EntityManager.RemoveComponent(uid); } public void LandComponent(EntityUid uid, ThrownItemComponent thrownItem, PhysicsComponent physics, bool playSound) { - if (thrownItem.Landed || thrownItem.Deleted || Deleted(uid)) + if (thrownItem.Landed || thrownItem.Deleted || _gravity.IsWeightless(uid) || Deleted(uid)) return; thrownItem.Landed = true; From 82aa1d6a0f2d209bb0e707f8694bc1b7fa6cdb41 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:55:45 +1100 Subject: [PATCH 039/121] Flammable system bug fixes. (#21594) --- .../Atmos/Components/FlammableComponent.cs | 9 +- .../Atmos/EntitySystems/FlammableSystem.cs | 113 ++++++++---------- Content.Shared/Timing/UseDelaySystem.cs | 19 ++- 3 files changed, 64 insertions(+), 77 deletions(-) diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs index 94bc78318c2..679b5510586 100644 --- a/Content.Server/Atmos/Components/FlammableComponent.cs +++ b/Content.Server/Atmos/Components/FlammableComponent.cs @@ -6,16 +6,15 @@ namespace Content.Server.Atmos.Components [RegisterComponent] public sealed partial class FlammableComponent : Component { - [ViewVariables] - public bool Resisting = false; - - [ViewVariables] - public readonly List Collided = new(); + [DataField] + public bool Resisting; [ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool OnFire { get; set; } [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float FireStacks { get; set; } [ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index 716c5b88e5b..e045b552a2e 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -56,6 +56,7 @@ public sealed class FlammableSystem : EntitySystem private float _timer; private readonly Dictionary, float> _fireEvents = new(); + private readonly List _toRemove = new(); public override void Initialize() { @@ -73,7 +74,6 @@ public override void Initialize() SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnExtinguishUsingInHand); SubscribeLocalEvent(OnExtinguishActivateInWorld); } @@ -142,29 +142,26 @@ private void OnInteractUsing(EntityUid uid, FlammableComponent flammable, Intera private void OnExtinguishActivateInWorld(EntityUid uid, ExtinguishOnInteractComponent component, ActivateInWorldEvent args) { - TryHandExtinguish(uid, component); - } - - private void OnExtinguishUsingInHand(EntityUid uid, ExtinguishOnInteractComponent component, UseInHandEvent args) - { - TryHandExtinguish(uid, component); - } + if (args.Handled) + return; - private void TryHandExtinguish(EntityUid uid, ExtinguishOnInteractComponent component) - { if (!TryComp(uid, out FlammableComponent? flammable)) return; + if (!flammable.OnFire) return; - if (TryComp(uid, out UseDelayComponent? useDelay) && _useDelay.ActiveDelay(uid, useDelay)) + + args.Handled = true; + + if (!_useDelay.BeginDelay(uid)) return; - _useDelay.BeginDelay(uid); _audio.PlayPvs(component.ExtinguishAttemptSound, uid); if (_random.Prob(component.Probability)) { AdjustFireStacks(uid, component.StackDelta, flammable); - } else + } + else { _popup.PopupEntity(Loc.GetString(component.ExtinguishFailed), uid); } @@ -173,52 +170,56 @@ private void OnCollide(EntityUid uid, FlammableComponent flammable, ref StartCol { var otherUid = args.OtherEntity; + // Collisions cause events to get raised directed at both entities. We only want to handle this collision + // once, hence the uid check. + if (otherUid.Id < uid.Id) + return; + // Normal hard collisions, though this isn't generally possible since most flammable things are mobs // which don't collide with one another, shouldn't work here. if (args.OtherFixtureId != FlammableFixtureID && args.OurFixtureId != FlammableFixtureID) return; - if (!EntityManager.TryGetComponent(otherUid, out FlammableComponent? otherFlammable)) + if (!flammable.FireSpread) + return; + + if (!TryComp(otherUid, out FlammableComponent? otherFlammable) || !otherFlammable.FireSpread) return; - if (!flammable.FireSpread || !otherFlammable.FireSpread) + if (!flammable.OnFire && !otherFlammable.OnFire) + return; // Neither are on fire + + if (flammable.OnFire && otherFlammable.OnFire) + { + // Both are on fire -> equalize fire stacks. + var avg = (flammable.FireStacks + otherFlammable.FireStacks) / 2; + flammable.FireStacks = flammable.CanExtinguish ? avg : Math.Max(flammable.FireStacks, avg); + otherFlammable.FireStacks = otherFlammable.CanExtinguish ? avg : Math.Max(otherFlammable.FireStacks, avg); + UpdateAppearance(uid, flammable); + UpdateAppearance(otherUid, otherFlammable); return; + } + // Only one is on fire -> attempt to spread the fire. if (flammable.OnFire) { - if (otherFlammable.OnFire) + otherFlammable.FireStacks += flammable.FireStacks / 2; + Ignite(otherUid, uid, otherFlammable); + if (flammable.CanExtinguish) { - if (flammable.CanExtinguish) - { - var fireSplit = (flammable.FireStacks + otherFlammable.FireStacks) / 2; - flammable.FireStacks = fireSplit; - otherFlammable.FireStacks = fireSplit; - } - else - { - otherFlammable.FireStacks = flammable.FireStacks / 2; - } - } - else - { - if (!flammable.CanExtinguish) - { - otherFlammable.FireStacks += flammable.FireStacks / 2; - Ignite(otherUid, uid, otherFlammable); - } - else - { - flammable.FireStacks /= 2; - otherFlammable.FireStacks += flammable.FireStacks; - Ignite(otherUid, uid, otherFlammable); - } + flammable.FireStacks /= 2; + UpdateAppearance(uid, flammable); } } - else if (otherFlammable.OnFire) + else { - otherFlammable.FireStacks /= 2; - flammable.FireStacks += otherFlammable.FireStacks; + flammable.FireStacks += otherFlammable.FireStacks / 2; Ignite(uid, otherUid, flammable); + if (otherFlammable.CanExtinguish) + { + otherFlammable.FireStacks /= 2; + UpdateAppearance(otherUid, otherFlammable); + } } } @@ -254,7 +255,7 @@ public void UpdateAppearance(EntityUid uid, FlammableComponent? flammable = null // This is intended so that matches & candles can re-use code for un-shaded layers on in-hand sprites. // However, this could cause conflicts if something is ACTUALLY both a toggleable light and flammable. // if that ever happens, then fire visuals will need to implement their own in-hand sprite management. - _appearance.SetData(uid, ToggleableLightVisuals.Enabled, true, appearance); + _appearance.SetData(uid, ToggleableLightVisuals.Enabled, flammable.OnFire, appearance); } public void AdjustFireStacks(EntityUid uid, float relativeFireStacks, FlammableComponent? flammable = null) @@ -266,8 +267,8 @@ public void AdjustFireStacks(EntityUid uid, float relativeFireStacks, FlammableC if (flammable.OnFire && flammable.FireStacks <= 0) Extinguish(uid, flammable); - - UpdateAppearance(uid, flammable); + else + UpdateAppearance(uid, flammable); } public void Extinguish(EntityUid uid, FlammableComponent? flammable = null) @@ -282,8 +283,6 @@ public void Extinguish(EntityUid uid, FlammableComponent? flammable = null) flammable.OnFire = false; flammable.FireStacks = 0; - flammable.Collided.Clear(); - UpdateAppearance(uid, flammable); } @@ -409,24 +408,6 @@ public override void Update(float frameTime) 700f, 50f, uid, true); } - - for (var i = flammable.Collided.Count - 1; i >= 0; i--) - { - var otherUid = flammable.Collided[i]; - - if (!otherUid.IsValid() || !EntityManager.EntityExists(otherUid)) - { - flammable.Collided.RemoveAt(i); - continue; - } - - // TODO: Sloth, please save our souls! - // no - if (!_lookup.GetWorldAABB(uid, transform).Intersects(_lookup.GetWorldAABB(otherUid))) - { - flammable.Collided.RemoveAt(i); - } - } } } } diff --git a/Content.Shared/Timing/UseDelaySystem.cs b/Content.Shared/Timing/UseDelaySystem.cs index 1d1d636b89f..17a806f0942 100644 --- a/Content.Shared/Timing/UseDelaySystem.cs +++ b/Content.Shared/Timing/UseDelaySystem.cs @@ -77,13 +77,20 @@ public override void Update(float frameTime) } } - public void BeginDelay(EntityUid uid, UseDelayComponent? component = null) + /// + /// Attempts tp start a use-delay for some entity. Returns true unless there is already an active delay. + /// + /// + /// Note that this will always return true if the entity does not have a use delay component, as in that case there + /// is no reason to block/prevent an interaction. + /// + public bool BeginDelay(EntityUid uid, UseDelayComponent? component = null) { if (!Resolve(uid, ref component, false)) - return; + return true; if (component.ActiveDelay) - return; + return false; DebugTools.Assert(!_activeDelays.Contains(component)); _activeDelays.Add(component); @@ -91,12 +98,12 @@ public void BeginDelay(EntityUid uid, UseDelayComponent? component = null) var currentTime = _gameTiming.CurTime; component.LastUseTime = currentTime; component.DelayEndTime = currentTime + component.Delay; - Dirty(component); + Dirty(uid, component); - // TODO just merge these components? - var cooldown = EnsureComp(component.Owner); + var cooldown = EnsureComp(uid); cooldown.CooldownStart = currentTime; cooldown.CooldownEnd = component.DelayEndTime; + return true; } public bool ActiveDelay(EntityUid uid, UseDelayComponent? component = null) From a129f52830b9aa08a605d3a04949f2e31dbee160 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 06:56:49 -0500 Subject: [PATCH 040/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 23d545891a2..78b4e3c9e0a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,5 @@ Order: 1 Entries: -- author: lapatison - changes: - - {message: 'Gardening cyborg module has been splitted into harvesting (scythe, - hatchet, plant bag* (New!) ) and gardening modules (hoe, spade, clippers, bucket* - (New!)', type: Tweak} - - {message: Book bag has been added to cybord literacy module, type: Tweak} - - {message: Book bag content now can be dumped on, type: Tweak} - id: 4669 - time: '2023-08-24T00:12:05.0000000+00:00' - author: liltenhead changes: - {message: Reduced both the damage and health of giant spiders., type: Tweak} @@ -2908,3 +2899,11 @@ Entries: type: Fix} id: 5168 time: '2023-11-14T03:27:14.0000000+00:00' +- author: ElectroJr + changes: + - {message: Fixed candle in-hand sprites not updating when the candle is extinguished., + type: Fix} + - {message: Fixed flammable object collisions being processed twice. This may affect + how fires spread., type: Fix} + id: 5169 + time: '2023-11-14T11:55:45.0000000+00:00' From 24f0b2a73e3459a63d4658e4e706d0973f913e9a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 14 Nov 2023 23:50:04 +1100 Subject: [PATCH 041/121] Reduce NPC query allocations (#21421) --- .../NPC/Systems/NPCUtilitySystem.cs | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index 4a9df0e663b..375d2b3c193 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -45,14 +45,21 @@ public sealed class NPCUtilitySystem : EntitySystem [Dependency] private readonly SolutionContainerSystem _solutions = default!; [Dependency] private readonly WeldableSystem _weldable = default!; + private EntityQuery _puddleQuery; private EntityQuery _xformQuery; private ObjectPool> _entPool = new DefaultObjectPool>(new SetPolicy(), 256); + // Temporary caches. + private List _entityList = new(); + private HashSet> _entitySet = new(); + private List _compTypes = new(); + public override void Initialize() { base.Initialize(); + _puddleQuery = GetEntityQuery(); _xformQuery = GetEntityQuery(); } @@ -360,12 +367,31 @@ private void Add(NPCBlackboard blackboard, HashSet entities, UtilityQ { case ComponentQuery compQuery: { - var mapPos = Transform(owner).MapPosition; - var comps = compQuery.Components.Values.ToList(); - var compZero = comps[0]; - comps.RemoveAt(0); + if (compQuery.Components.Count == 0) + return; + + var mapPos = _xformQuery.GetComponent(owner).MapPosition; + _compTypes.Clear(); + var i = -1; + EntityPrototype.ComponentRegistryEntry compZero = default!; + + foreach (var compType in compQuery.Components.Values) + { + i++; + + if (i == 0) + { + compZero = compType; + continue; + } + + _compTypes.Add(compType); + } + + _entitySet.Clear(); + _lookup.GetEntitiesInRange(compZero.Component.GetType(), mapPos, vision, _entitySet); - foreach (var comp in _lookup.GetEntitiesInRange(compZero.Component.GetType(), mapPos, vision)) + foreach (var comp in _entitySet) { var ent = comp.Owner; @@ -374,7 +400,7 @@ private void Add(NPCBlackboard blackboard, HashSet entities, UtilityQ var othersFound = true; - foreach (var compOther in comps) + foreach (var compOther in _compTypes) { if (!HasComp(ent, compOther.Component.GetType())) { @@ -438,7 +464,7 @@ private void Filter(NPCBlackboard blackboard, HashSet entities, Utili { case ComponentFilter compFilter: { - var toRemove = new ValueList(); + _entityList.Clear(); foreach (var ent in entities) { @@ -447,12 +473,12 @@ private void Filter(NPCBlackboard blackboard, HashSet entities, Utili if (HasComp(ent, comp.Value.Component.GetType())) continue; - toRemove.Add(ent); + _entityList.Add(ent); break; } } - foreach (var ent in toRemove) + foreach (var ent in _entityList) { entities.Remove(ent); } @@ -461,20 +487,19 @@ private void Filter(NPCBlackboard blackboard, HashSet entities, Utili } case PuddleFilter: { - var puddleQuery = GetEntityQuery(); - var toRemove = new ValueList(); + _entityList.Clear(); foreach (var ent in entities) { - if (!puddleQuery.TryGetComponent(ent, out var puddleComp) || + if (!_puddleQuery.TryGetComponent(ent, out var puddleComp) || !_solutions.TryGetSolution(ent, puddleComp.SolutionName, out var sol) || _puddle.CanFullyEvaporate(sol)) { - toRemove.Add(ent); + _entityList.Add(ent); } } - foreach (var ent in toRemove) + foreach (var ent in _entityList) { entities.Remove(ent); } From 9036cd26d40cf2b05e33ac32844724c86e3539bc Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:52:40 +0000 Subject: [PATCH 042/121] Add MindPlaySound to role system (#21460) Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../GameTicking/Rules/TraitorRuleSystem.cs | 13 ++++--------- Content.Server/Ninja/Systems/SpaceNinjaSystem.cs | 5 ++--- Content.Shared/Roles/SharedRoleSystem.cs | 12 ++++++++++++ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index ef949d09fc9..52a58810837 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -268,21 +268,16 @@ public bool MakeTraitor(ICommonSession traitor, bool giveUplink = true, bool giv _roleSystem.MindAddRole(mindId, new TraitorRoleComponent { PrototypeId = traitorRule.TraitorPrototypeId - }); - // Assign briefing + }, mind); + // Assign briefing and greeting sound _roleSystem.MindAddRole(mindId, new RoleBriefingComponent { Briefing = briefing - }); + }, mind); + _roleSystem.MindPlaySound(mindId, traitorRule.GreetSoundNotification, mind); SendTraitorBriefing(mindId, traitorRule.Codewords, code); traitorRule.TraitorMinds.Add(mindId); - if (_mindSystem.TryGetSession(mindId, out var session)) - { - // Notificate player about new role assignment - _audioSystem.PlayGlobal(traitorRule.GreetSoundNotification, session); - } - // Change the faction _npcFaction.RemoveFaction(entity, "NanoTrasen", false); _npcFaction.AddFaction(entity, "Syndicate"); diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index 6de2d7dee00..a5b78570db4 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -167,6 +167,7 @@ private void OnNinjaCreated(EntityUid uid, SpaceNinjaComponent comp, ref Generic PrototypeId = "SpaceNinja" }; _role.MindAddRole(mindId, role, mind); + _role.MindPlaySound(mindId, config.GreetingSound, mind); // choose spider charge detonation point var warps = new List(); @@ -179,9 +180,7 @@ private void OnNinjaCreated(EntityUid uid, SpaceNinjaComponent comp, ref Generic if (warps.Count > 0) role.SpiderChargeTarget = _random.Pick(warps); - var session = mind.Session; - _audio.PlayGlobal(config.GreetingSound, Filter.Empty().AddPlayer(session), false, AudioParams.Default); - _chatMan.DispatchServerMessage(session, Loc.GetString("ninja-role-greeting")); + _chatMan.DispatchServerMessage(mind.Session, Loc.GetString("ninja-role-greeting")); } // TODO: PowerCellDraw, modify when cloak enabled diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index 9ba625305cf..ae49289eb8e 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Database; using Content.Shared.Mind; using Content.Shared.Roles.Jobs; +using Robust.Shared.Audio; using Robust.Shared.Prototypes; namespace Content.Shared.Roles; @@ -10,6 +11,7 @@ public abstract class SharedRoleSystem : EntitySystem { [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _minds = default!; // TODO please lord make role entities @@ -153,4 +155,14 @@ public bool IsAntagonistRole() { return _antagTypes.Contains(typeof(T)); } + + /// + /// Play a sound for the mind, if it has a session attached. + /// Use this for role greeting sounds. + /// + public void MindPlaySound(EntityUid mindId, SoundSpecifier? sound, MindComponent? mind = null) + { + if (Resolve(mindId, ref mind) && mind.Session != null) + _audio.PlayGlobal(sound, mind.Session); + } } From 8ceed8dee2af11618dfad42862d0912794929245 Mon Sep 17 00:00:00 2001 From: Chubbygummibear <46236974+Chubbygummibear@users.noreply.github.com> Date: Tue, 14 Nov 2023 04:54:35 -0800 Subject: [PATCH 043/121] Fix thrown items not registering the tile they stop by colliding with a hard surface (#21107) --- Content.Shared/Throwing/ThrownItemSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index 4cc4516f3d9..6e0545307e4 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -101,6 +101,7 @@ public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) if (TryComp(uid, out var physics)) { _physics.SetBodyStatus(physics, BodyStatus.OnGround); + _broadphase.RegenerateContacts(uid, physics); } if (EntityManager.TryGetComponent(uid, out FixturesComponent? manager)) From 7837e994f17387a39c3de06f5adea4deb687fdb8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 07:55:39 -0500 Subject: [PATCH 044/121] 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 78b4e3c9e0a..c2dbeb46a21 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,5 @@ Order: 1 Entries: -- author: liltenhead - changes: - - {message: Reduced both the damage and health of giant spiders., type: Tweak} - id: 4670 - time: '2023-08-24T01:20:53.0000000+00:00' - author: Ilya246 changes: - {message: Heaters and freezers now work faster. TEGs now have their power output @@ -2907,3 +2902,9 @@ Entries: how fires spread., type: Fix} id: 5169 time: '2023-11-14T11:55:45.0000000+00:00' +- author: Chubbygummibear + changes: + - {message: Fixed thrown entities physics being set to sleep if the throw was stopped + by colliding with something, type: Fix} + id: 5170 + time: '2023-11-14T12:54:35.0000000+00:00' From 0563d870d29ce60e91410bfd5fd5da62d51a24f9 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:27:27 -0500 Subject: [PATCH 045/121] Allow mid-round borgs to emote (#21653) * Allow mid-round borgs to emote * a * rerun tests --- Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 42fea8fda44..81b7b4db331 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -192,6 +192,7 @@ tags: - ShoesRequiredStepTriggerImmune - DoorBumpOpener + - type: Emoting - type: entity id: BaseBorgChassisNT From 7a5aa386ea9ebc4c0662098061b16ec22c07f0c0 Mon Sep 17 00:00:00 2001 From: Sirionaut <148076704+Sirionaut@users.noreply.github.com> Date: Wed, 15 Nov 2023 00:27:55 +0100 Subject: [PATCH 046/121] craftable cotton cloth (#21648) * Update improvised.yml added CottonWovenCloth * added cotton.yml constructionGraph * it's spelled cotton, not cotten --- .../Recipes/Crafting/Graphs/improvised/cotton.yml | 13 +++++++++++++ .../Prototypes/Recipes/Crafting/improvised.yml | 13 +++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/improvised/cotton.yml diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/cotton.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/cotton.yml new file mode 100644 index 00000000000..dcf0ae4be75 --- /dev/null +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/cotton.yml @@ -0,0 +1,13 @@ +- type: constructionGraph + id: CottonObjects + start: start + graph: + - node: start + edges: + - to: cottoncloth + steps: + - material: Cotton + amount: 4 + doAfter: 3 + - node: cottoncloth + entity: MaterialCloth1 diff --git a/Resources/Prototypes/Recipes/Crafting/improvised.yml b/Resources/Prototypes/Recipes/Crafting/improvised.yml index df3a3bbdab9..9fb10b741d1 100644 --- a/Resources/Prototypes/Recipes/Crafting/improvised.yml +++ b/Resources/Prototypes/Recipes/Crafting/improvised.yml @@ -175,3 +175,16 @@ icon: sprite: Objects/Weapons/Bombs/ied.rsi state: icon + +- type: construction + name: cotton woven cloth + id: CottonWovenCloth + graph: CottonObjects + startNode: start + targetNode: cottoncloth + category: construction-category-misc + description: "A homemade piece of cotton cloth, it feels coarse." + icon: + sprite: Objects/Materials/materials.rsi + state: cloth_3 + objectType: Item From 7de4e5ebc92de3258e57ab0fa53bdc285e0c4b0f Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 18:29:01 -0500 Subject: [PATCH 047/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c2dbeb46a21..ae94268ca0b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,17 +1,5 @@ Order: 1 Entries: -- author: Ilya246 - changes: - - {message: Heaters and freezers now work faster. TEGs now have their power output - adjusted., type: Tweak} - id: 4671 - time: '2023-08-24T02:18:48.0000000+00:00' -- author: crazybrain - changes: - - {message: Secret doors can be manually rotated again (at least until a dynamic - solution is found)., type: Fix} - id: 4672 - time: '2023-08-24T16:23:11.0000000+00:00' - author: deltanedas changes: - {message: All plates can now be made in the autolathe., type: Tweak} @@ -2908,3 +2896,13 @@ Entries: by colliding with something, type: Fix} id: 5170 time: '2023-11-14T12:54:35.0000000+00:00' +- author: themias + changes: + - {message: Science built cyborgs can now emote, type: Fix} + id: 5171 + time: '2023-11-14T23:27:27.0000000+00:00' +- author: Sirionaut + changes: + - {message: cloth can be crafted from cotton (made from cotton bols), type: Add} + id: 5172 + time: '2023-11-14T23:27:56.0000000+00:00' From aa5310248a8b94c0e79ee750caf1f5836e9043f3 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Tue, 14 Nov 2023 23:30:43 +0000 Subject: [PATCH 048/121] signal router (#20802) * add signal router sprite * DisposalSignalRouter logic * add disposal signal router * add disposal signal router * how did it work without this * death --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../DisposalSignalRouterComponent.cs | 36 +++++++++ .../Systems/DisposalSignalRouterSystem.cs | 52 ++++++++++++ .../Structures/Piping/Disposal/pipes.yml | 60 ++++++++++++++ .../Graphs/utilities/disposal_pipes.yml | 48 ++++++++++- .../Recipes/Construction/utilities.yml | 31 +++++++ .../Structures/Piping/disposal.rsi/meta.json | 76 +++++++++++++++++- .../signal-router-flipped-free.png | Bin 0 -> 5020 bytes .../disposal.rsi/signal-router-flipped.png | Bin 0 -> 5608 bytes .../disposal.rsi/signal-router-free.png | Bin 0 -> 5017 bytes .../Piping/disposal.rsi/signal-router.png | Bin 0 -> 5645 bytes 10 files changed, 300 insertions(+), 3 deletions(-) create mode 100644 Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs create mode 100644 Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs create mode 100644 Resources/Textures/Structures/Piping/disposal.rsi/signal-router-flipped-free.png create mode 100644 Resources/Textures/Structures/Piping/disposal.rsi/signal-router-flipped.png create mode 100644 Resources/Textures/Structures/Piping/disposal.rsi/signal-router-free.png create mode 100644 Resources/Textures/Structures/Piping/disposal.rsi/signal-router.png diff --git a/Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs b/Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs new file mode 100644 index 00000000000..b4ef81d8980 --- /dev/null +++ b/Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs @@ -0,0 +1,36 @@ +using Content.Server.Disposal.Tube.Systems; +using Content.Shared.DeviceLinking; +using Robust.Shared.Prototypes; + +namespace Content.Server.Disposal.Tube.Components; + +/// +/// Requires to function. +/// +[RegisterComponent, Access(typeof(DisposalSignalRouterSystem))] +public sealed partial class DisposalSignalRouterComponent : Component +{ + /// + /// Whether to route items to the side or not. + /// + [DataField] + public bool Routing; + + /// + /// Port that sets the router to send items to the side. + /// + [DataField] + public ProtoId OnPort = "On"; + + /// + /// Port that sets the router to send items ahead. + /// + [DataField] + public ProtoId OffPort = "Off"; + + /// + /// Port that toggles the router between sending items to the side and ahead. + /// + [DataField] + public ProtoId TogglePort = "Toggle"; +} diff --git a/Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs b/Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs new file mode 100644 index 00000000000..3a9fdbbf8d4 --- /dev/null +++ b/Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs @@ -0,0 +1,52 @@ +using Content.Server.DeviceLinking.Events; +using Content.Server.DeviceLinking.Systems; +using Content.Server.Disposal.Tube; +using Content.Server.Disposal.Tube.Components; + +namespace Content.Server.Disposal.Tube.Systems; + +/// +/// Handles signals and the routing get next direction event. +/// +public sealed class DisposalSignalRouterSystem : EntitySystem +{ + [Dependency] private readonly DeviceLinkSystem _deviceLink = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnSignalReceived); + SubscribeLocalEvent(OnGetNextDirection, after: new[] { typeof(DisposalTubeSystem) }); + } + + private void OnInit(EntityUid uid, DisposalSignalRouterComponent comp, ComponentInit args) + { + _deviceLink.EnsureSinkPorts(uid, comp.OnPort, comp.OffPort, comp.TogglePort); + } + + private void OnSignalReceived(EntityUid uid, DisposalSignalRouterComponent comp, ref SignalReceivedEvent args) + { + // TogglePort flips it + // OnPort sets it to true + // OffPort sets it to false + comp.Routing = args.Port == comp.TogglePort + ? !comp.Routing + : args.Port == comp.OnPort; + } + + private void OnGetNextDirection(EntityUid uid, DisposalSignalRouterComponent comp, ref GetDisposalsNextDirectionEvent args) + { + if (!comp.Routing) + { + args.Next = Transform(uid).LocalRotation.GetDir(); + return; + } + + // use the junction side direction when a tag matches + var ev = new GetDisposalsConnectableDirectionsEvent(); + RaiseLocalEvent(uid, ref ev); + args.Next = ev.Connectable[1]; + } +} diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml index 9e3780a6dab..d4b7c1d3c96 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml @@ -426,3 +426,63 @@ - type: Construction graph: DisposalPipe node: bend + +- type: entity + parent: DisposalJunction + id: DisposalSignalRouter + name: disposal signal router + description: A signal-controlled three-way router. + components: + - type: Sprite + drawdepth: ThickPipe + layers: + - map: [ "pipe" ] + state: signal-router-free + - type: DisposalTube + containerId: DisposalSignalRouter + - type: DisposalSignalRouter + - type: DeviceLinkSink + ports: + - On + - Off + - Toggle + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + - type: WirelessNetworkConnection + range: 200 + - type: ContainerContainer + containers: + DisposalSignalRouter: !type:Container + - type: GenericVisualizer + visuals: + enum.DisposalTubeVisuals.VisualState: + pipe: + Free: { state: signal-router-free } + Anchored: { state: signal-router } + - type: Flippable + mirrorEntity: DisposalSignalRouterFlipped + - type: Construction + graph: DisposalPipe + node: signal_router + +- type: entity + parent: DisposalSignalRouter + id: DisposalSignalRouterFlipped + suffix: flipped + components: + - type: Sprite + layers: + - map: [ "pipe" ] + state: signal-router-flipped-free + - type: DisposalJunction + degrees: + - 0 + - 90 + - 180 + - type: GenericVisualizer + visuals: + enum.DisposalTubeVisuals.VisualState: + pipe: + Free: { state: signal-router-flipped-free } + Anchored: { state: signal-router-flipped } diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml index b626105532f..1b3aa3105bf 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml @@ -51,6 +51,23 @@ - material: Steel amount: 2 doAfter: 1 + # DisposalSignalRouter + - to: signal_router + steps: + - material: Steel + amount: 2 + doAfter: 1 + - material: Cable + amount: 1 + doAfter: 1 + - to: signal_router_flipped + steps: + - material: Steel + amount: 2 + doAfter: 1 + - material: Cable + amount: 1 + doAfter: 1 - node: broken entity: DisposalPipeBroken edges: @@ -187,4 +204,33 @@ - !type:DeleteEntity steps: - tool: Welding - doAfter: 1 \ No newline at end of file + doAfter: 1 + # DisposalRouter + - node: signal_router + entity: DisposalSignalRouter + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 2 + - !type:SpawnPrototype + prototype: CableApcStack1 + - !type:DeleteEntity + steps: + - tool: Welding + doAfter: 1 + - node: signal_router_flipped + entity: DisposalSignalRouterFlipped + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 2 + - !type:SpawnPrototype + prototype: CableApcStack1 + - !type:DeleteEntity + steps: + - tool: Welding + doAfter: 1 diff --git a/Resources/Prototypes/Recipes/Construction/utilities.yml b/Resources/Prototypes/Recipes/Construction/utilities.yml index d1dac1d1b05..5bd28f9b5bc 100644 --- a/Resources/Prototypes/Recipes/Construction/utilities.yml +++ b/Resources/Prototypes/Recipes/Construction/utilities.yml @@ -242,6 +242,37 @@ state: conpipe-j2s mirror: DisposalRouter +- type: construction + name: disposal signal router + description: A signal-controlled three-way router. + id: DisposalSignalRouter + graph: DisposalPipe + startNode: start + targetNode: signal_router + category: construction-category-utilities + placementMode: SnapgridCenter + canBuildInImpassable: false + icon: + sprite: Structures/Piping/disposal.rsi + state: signal-router-free + mirror: DisposalSignalRouterFlipped + +- type: construction + hide: true + name: disposal signal router + description: A signal-controlled three-way router. + id: DisposalSignalRouterFlipped + graph: DisposalPipe + startNode: start + targetNode: signal_router_flipped + category: construction-category-utilities + placementMode: SnapgridCenter + canBuildInImpassable: false + icon: + sprite: Structures/Piping/disposal.rsi + state: signal-router-flipped-free + mirror: DisposalSignalRouter + - type: construction name: disposal junction description: A three-way junction. The arrow indicates where items exit. diff --git a/Resources/Textures/Structures/Piping/disposal.rsi/meta.json b/Resources/Textures/Structures/Piping/disposal.rsi/meta.json index fd0ed2ac25d..87655b6b86c 100644 --- a/Resources/Textures/Structures/Piping/disposal.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/disposal.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/discordia-space/CEV-Eris/blob/bbe32606902c90f5290b57d905a3f31b84dc6d7d/icons/obj/pipes/disposal.dmi and modified by DrSmugleaf", + "copyright": "https://github.com/discordia-space/CEV-Eris/blob/bbe32606902c90f5290b57d905a3f31b84dc6d7d/icons/obj/pipes/disposal.dmi and modified by DrSmugleaf. Signal router sprites based on normal router modified by deltanedas (github).", "states": [ { "name": "condisposal", @@ -827,6 +827,78 @@ 1.0 ] ] + }, + { + "name": "signal-router", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "signal-router-free", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "signal-router-flipped", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "signal-router-flipped-free", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Structures/Piping/disposal.rsi/signal-router-flipped-free.png b/Resources/Textures/Structures/Piping/disposal.rsi/signal-router-flipped-free.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f27f87317a2c4c093b678a62d14b7ea5fae614 GIT binary patch literal 5020 zcmV;N6JzX&P)n+!96JK`u@*}?-x#?{u!<^W&gV5H2x*}ZdnT*LHib5T$eR{ zA1=3{>&c0`@jt0vb|9IA_j71lf{r_AUMXf(I_K;W<~QXR-NL~k^vV79)n7{BXe=a9 zt)u_|010qNS#tmY3labT3lag+-G2N401?zlL_t(|+U;A}Z&c?MKlje=@iO*!1H51e z7~5s>5=am@>@)#{l(eea{sT>U$U~((M9Nd7JVfe49%!om163YU2?bIGN1 z2D8S-*v8`-kL}r)dwYK8&K-|8F{zD85+&++4-F5~(W6J{t+(D%7DFJ`KXT*QCH0S68opiveli>i=C(fI+5(uo*FrY30I zKT6|)G2x=h_Z2Ngc8kIU+LI;g5j7cP8D)m7DGwOHh{a5T=} z)t1y!TX=)6f+BLci>RV%8F{_s{N7E4LyxJ#<0gmOBTTS4T$D~F`7lEKzna(FYTi`n z8Wp-6w6V3FzWU}Io&3*fI)3~(?b^MEoJ>qS8e-j#QdtQT%Jw0|`nY*xoj%*1G&eWv zuR^+uJ+MLF-A{w{JgP>b_3(%PL4?@gtUi3bw?t zSd8lG>U5{mAw~(tw7wAxwbExZN&R6AO!Ff(@uDy1Rj0mVaza+*a;@pTB$eF0EQwPikQS zpQuYbjTl#i9=r%FzSVB0GiT4z;X{W+3LlS*^3$U-2QNt**SGMy(4077Q7T}>KGPF| zD08@61+dg~^3*B$zh>o2R9I9b_5nmY9d@dzS-~Rg6gPVP`t=3YP=q;fb+LF-P8za@ zXH>BRym{7Zn?=uV9&_O^cKoGJuJ`Ugq$}Om3|e)42^k;+sxu<7X=bQ=Qf|6^`!;=h z@uEyP>t@%c6@l@t|K`aEFaq@9n$dlG14oiP@T`I5dV4gcn(896WeXq{PN5P+n2a zOyhuuUmCmM(`U}p&E8uw|IDOFopC5)bbmw~l4l$MR$H^8Wir^jYAk-~Pud7Vc;>H- z)Y9BcTQLt$ZFA{L=bm%ro9_sZtMWH1{{pM4nF zH(F|j#4br7WMO^Nv~*_UTK1Zo0vnreqTM^TiQ7yfDdN`{hp4hCRts!$p#k+kya3&I z7Z}V#uF<@14Xx!E0rP{&U^bZE)qZ8pVHk!mowpj~%>bN?o?(Ed>DjBU8=H@EBC@V= z4ei+eD*gM^SFF$9P%t9 zO>kfY-JhBYNrZ=V8HR4&)8WtHA|WLZeMFHdj_ZRH6ZG}j3mkr*rS?r5iNj@Kwo!nY ze%w41cm|IDuC}U zRTBAo0vbPkCpLsaT1$wZV^VZ`9WJJdhy zqXVpNqLrMBOr0_2;7pS`Iy&ga^`5*nJ3j_!hC51W#Z**UMQ{G*cfy3ogkOAa#qtI| zwTPT_IvwHEI7~j@s1W|};X^STNO3=BDVgGv%oIy!tbqb1YItC3fB!(%f>oE+>AtZL ztzNZKn1EPfOWOwV6#Mt>V~>}V`~h*m{{8#u;<>LSk5KYdg1k&+b90m4(zu!vnnJ2w zxr%CQY9-@~hlAt`hH2UI6%=Lt_WQ?ZczBrKPf>5*J^1b=sR(UY|0{iUL%jrJs~Z|P zNUD%%@Z9-xw3pQZl96WB>E)!%=kv+tZ{F&o8#jBGrXr-VUPB*~sYx0dd_>83l+ww# zFk#d`!TLGLpT)$7PXq&eFD7NFr5si(Cs%y>*eDEZiZ=~)3Wr1DL*X)!IJr=JU|XXv zl?p&~KmGJm@{dnQU=j*P<&+T^8SM<0EpyeNw=#tmYFC}Y8(p%jKqBbY(JaqQSJ zIi1s|PfJ0xr>950_uz+qVU)H6#Zkac!4*%j? zV=u;w@nZb4$8&EWp0yEHpLYg4Ykb0UF9FXw5VJn-3_v7TUtgyeI9<|RiiGVH9JffB z9bq?$t*AF*NHK-qqxKL9N9fR@L(;YSNlO66+O=zRr`;wkHbi-Nq1S+NJ1Wj7x}xrg z(i^HzNXy5^$DbMo|0EdoA?Y@a`T~*wAwfgs8D%g?1TsbbBe}tk zDv80`qIVCS%k9rE)xezj;sbI&2gU$ZA(zWes-lzAZl&_lVydrQM(u5zX!DjWw1r=& z6V}$%QdLzIdA(&~1c5D>omgRw-1V~}Qd3i-!`h-G1$>Q5%22BG>dS6AyMJ^=V4HB*2^iw#%x2tOvCT{9jaDEJhS1Io_i(Lj~Yxy%|u$isjYhEiIAOHqaL6 z@MMz^5SH<|(t^@bnSOy$HaD9kXlF@_8$CW%;p7D6Gd(YSfTz++rKKJgX-$wJ09>H> zg0?$4&))J%x_)QCQS@QwA=l(14r(b>VPI@7=)v=pq&9!_ll(xfzUX+qR7!^xdRTG|pn{klsER zfi+evUp{Z+1fDZwiS5-UJ)HP5Yzs{b&ApJ+Q%21sKJ^OZbN>2i1 z`Bd6C1Q&Y_QpTlFLQ0&htUl%e%rSx>0F4P063|^QE%Vaynp(l#OpQOGOINN^|G=ZX zbsm-)t*&c5T~ewFj0agXRas+z)nL8>=Cro93f!)OPq~^^1-K*7RMW6lz5@&b+VEzd z&}0I{9E}-WA2iDIiG+9qm&?fqNHodb!O4ac^@Q95P;+blXiOl;K*hD9qFjof9*>8< z>$)oF3lojub{Def6;W|<36+$T$QA$NbM)=;JrpLs{PIg`ZfX)(o!w^38z10ivG%e` zqWD=_RwiZeV%Fb_moCZXQ4qcSNt--}EB;5@9KZB^qBPUG^ySIBVZAN zi4WMld$+9SVn$k7rAnE32bR?dGl4<@gL5}v7Dw>83BLh^2E7UoOEGK~Fol9tVFsX* zR9jOse;k13rA#@ma$3Ur=OhCgXl}ym^&|?8q zVqQof*0^@{>ii7AO>;7oyInw*z+2!nS1lw(U~GA9(awl9SmYm^(~-fT>%c1C?Nm_V!uPNBiYD>Suzb zU=)!+6_j|17iIAumiaLEY!$TT=F>0`$f{7|N23GX9=JW5vsjv+&@Gb*ra0#2;(`(2 zh-~kkJ#^y4acN;WT!j*z#(6&U3bDq6`}gMwrwkRueT2AZbl5pCGodfZqpcaWQ|722 zYz^i{yB-pd3C{#KXyS;|(#DU7ovE2m0%Y0yGr?O-Easw7($4od-;1Zs3V5a1JxN;fAwHA%W^o#Te)!v_G7?i=&5+Z~X89~hF0 zPF-jiF#$;j8>rD>FerNfh&q)?k7v7K>+JS4zNGVlekPs+F+pj;f-CWa5zHuq9C>Y* zKnV+)ei-Nt02t6gMjIRAi_|nQF+y&aLwf#+bbL-AG8-R&Kn$?_(I-y?oQ-BDI=)7L zWLW(f{RTvxfW%~?QP>5bMJFexC=d*bLB)ZfU8eE}gb(o{dHU-a?zsER{iJheiwrOGi7?r-T$KEQt$7f@T>B z$q0U+;PVINltBo<%7V!=;w4Ft5ZgC5HF6F<$xN%^Nk=K*50Ib5O%pVU!eTro_#U&v z<7B&$4?X}t&={32uW295hKSjYRHhTKStX6!`(Qp2Bs6!U%vesi=nfwMlCe42AW}rs z(BR^7%ScEm5y-&s;6a47KyM0koh>xD3^4%}pv%{$d;Lg9!H5q( z{BTaO66>S>hfU#^9#3m({x9kHi4!M;F&}*JL3aJT7HMc`(91bf6!0?J1BA*DMZ2V$ zMo}Uuo#CW`>tTBV8!|93@Z49N@~Q}B3y`c!05Jo{3n(kloB%We(+5}^P9HDed+-~9 zpTfusAAlb)!1V#f9%n-~6^Y8dF%B_Nkc33Q%1e))ugPTE2xxu|jge>FpZ|Z4r#42O mb$|Z3mw*@j`4{8oJ^l-J+vNWb%Yp0w0000P)n+!96JK`u@*}?-x#?{u!<^W&gV5H2x*}ZdnT*LHib5T$eR{ zA1=3{>&c0`@jt0vb|9IA_j71lf{r_AUMXf(I_K;W<~QXR-NL~k^vV79)n7{BXe=a9 zt)u_|010qNS#tmY3labT3lag+-G2N402CleL_t(|+TB}OcU0Gv-nZ)3pi-$yr3tAJ zG6D?<2V+f41{)I_VjR0yKW6v=-N|GBjy$H*tKYl(u~&Oa18qVK0gR9c*k;fG0yLqa zB-K3M-rv6W6jy~oWuZhQM@#FLs&3tL_CEXU>HDP7I-{Z(RB zF@nLM(Y|x%hQ9mg@necaA}^f(g&#IFG#I_Tz2=RYMlP32e%)?2>AGIJuTUsZKA)#- zHcPo&uJnuX%{SlB^78VAln@GqjD7p|$!j&YeSW9YS-Q7;e#0>2{TnxK(Bk6abLZDz zs2xjaJPZ?7RaH@KZ7tQ*)KGPGHTir#`HZzp@mP$qJn_oP3Pqz)dB0dJ$}=`P@Led^ z;c&<==EVGNUX!2Kz}6}EB$G)>BoY+kHDLZ!DkTcRXY0+st^$UJhF}TuHx>b{<9(%l zr5p@QtOT!iJ1CaUud$RLI`CcIJ*x5IT9o-QH#S1;x)KnI!rZuGehhr~r4%qfKdqK`%LMXLO@O&azRUWI9LN zwuLDW2vB1~qezWo*U{BwS^!%^DxG4V^R4W9K9?~yv!0c$dk$Ii9P(y5o+OE;BdRU zyX2u2fY$y4;dXU@>r*tooR>izdktAKOjMMDV)Un1DzoID4^p5Wm5 zPz)3ag@*Y%RaG8JCDWA6B*~*!lN;Y-=Tx3 zPI7FH1sFCpUb=LN?%%)9KEOw=U*DkNVSe*Mw`lr#QRV)sDjEDFEKwo^?U{YE<#@xO3-@+;`~ULEeRa zu>{>|3U0=1gN_{Nqv_cv^k{lkJUJ2e@%!{-enGyA;{c)U3c!0%@=ne<`rh0xKBqPq6w?k_iP(_? zYlVmMAv_EbS6L@4i|2J#n1DGdkHtpGZ0#0cCL)?F=H9(~H2mkAbmE=2sU}z}N(z8M!E4IquqgE&&OLT0W0_?s(J$PW`0F4X`m#pIWzucocYzcq(<3)Ovfj@@P@S|8%bl4t7((FgCJpbLBq?%o>{Wt(C1>1L>_ zdHx;pncdH9SOKaaG00f6>+0G+JV1_r8YbsIkBBKk38Q0Ubo=g@+~CwrQ%Azm)YKsP zJBk=*S(b>x3L~-{rP(L*Ql{3{HA!Ak(`%zSzp{_`p98Q;{=ypqe z2@5bt;{_B^-da|mj6q$CY<`8`^%0El!f(3ibxw^B9vBqIk>&JMlfopzu|4+O3QbvA zFj&LkuujzN_EyPx{`%Sw3x8XLhmxUeD7}0$)C&hHSW(C(D4IQ{|Y#r&3AU)7?qO zj~%AppF7WW`7-HTHAa?}<=)Zp37X}Y4Pg-iaTM&$3=}pP+nTtxXsQ#-TjkmwJL_lv z@a{XusAta}QGybz?|MI7@4L2UQ=T3TZF8ak9*ophlQU~RbkH(CT;XVvoV~sA#vAn0 z4}VJWcuevDe@(S?XjY?9*`DU6damN?W$|cS;4?Mw8qE~+6A;UXuHP_g1y&+vjIFNF z`9FR|{Tv>C@##V3#H@W6iRd~LfdI>o{#k?Km<$SI-e z(&ek-N4%WCsB+k@0Q`+MTCgE3?q{x10OQm6R#t+>>pp(;P$~I%GId|lR;0Zwp?H2o0Jn$ZI)9!>q-gHR z6Ao{IQlGB9y}i`7#%}H3zh8DAJ;d15lq?(;fhy8aM~~n8$B#eaEK;YYmM}*QC!IQZ zl8PKDbhk(HfK#VV(cIjeS%8sIQ6f}9Lxkl*IN}hM$JI)15N6PU!FyhgyU4)Y9xr+F z1KNq9!IL zsM_l?JJrQaP=K_VSTN)RZl^(0lM_fzqle`EVRhVF<1<8x%SC)onLP*SkCP{=XYkGQmU2t^0`PVhg zzjt_iT_=bKz{LMvhxRHjZp--rTfRG6%@5e>@z>x7I9_E1sQ4XhXcocRwzmj0-`=*J zlPx!O>}unzvzEGcw^1!8KwZ0EqbiS!6QqDZY;|>^b#oB?m3LCs4(fc~x3_E)Q{T}V zmh>B)W;9#TZ`9or(shcgtV-`;YUat`z7xa%yl$4oh6#EYD#g}H0vNWm9hIPThPh~( znVo&682erecpg6gml!I&#;@|u@b=$V4nz39zCNi#)Y%8r2DAx)3(9h|-O+hQ^A-I^ zwBXDxlvCh!sKu^?a(;q_M5n*Mzl6^Nk0T3pd8Xa0Jw=9!Qkt4OQJ!rnWtz^&6c&}4 zG(F;RNv{#AhKGks4G~=7w6a{q2^h-`4+INv3qAchWw{h?Sd&%TSo{RiRhFlUo;UaJ6AFr9c~TG!fVHFg!(>ijW8^JN&?x|fDv;E9 zEm}khbY;+(Ky98$XQ;px+JlFWOA51RnDFrM_VqhjxSVy8%Nvlc4~Q06i<9RE;tbFg zxFeu9picl`(1Ai59-U}3W8>12i%VCkyQ@Qb6Gh7^9*mEz;V0<$NcCADsI4u-CcC+yNjIaPH|xt5FloRchlaK<*gCLIC=iNW7E>3 z@L5%*ou8nWR3X<3F{AzB%TV(#wIqeo>DSO>Z^3lkGu ztNZ01%w@0DF+Y+VeCBq$sH>~X6dupxo%`=kJ{7^iJ;2_5b?LI;kATX|?zADTF~H|& z%Y#Vq?pp`sXn6Q&0B(1(GNRFlCF4_mf?kf#qXpHyb2q)-vxnl*WzoI?eD3<6>EWZt z6+1gH$xfd>Ew39J8-+OaaAH*Ez+84?t$(8S@5L#qzms(c|+;wPy2^>Tb(tO1~;!ROq_2|jn>(pA9%6dMCr zJRBgLp~(X>5hN2TGvo>$5rqBt;Qrh&mzoD@~9Hz!c2>nWQwKQuEJ3m1$$LHbf z;OKJMy!;IXD9@_c7z&v+%KEMU+#p&JRFtulxr3eTwbj z;n%!!>J(8fTovYMw=DASVAU=bUie{&ecM2Rt_=>Y<&k71; zCq{sn(f{uQvJS(7ukg820xSWTMK+V8-=Di6&0EdLm-q>)nWC5D^LWPxky>&Gn z$|YCn?D?2Hdey~$C3%NGeVbH-}nPe%fb7_8#K05s#M*=7P@|VAmh&3^K z`J%wAEDH)518Nr;OQ4Gb;Q3()^LoZu|K~G`wo}M1z4m$bVVwhWU)C<`zxK@WQ)DSPMZY*vgLID>a!u9< zJ;P7X%kgey_6%>n$x*-}bS=4iJb;Rx*6L+`)$9)14#XY`X(rv$|j2t1uG z?L6ix=LaAx$=o>4{#p^-%==BxlKXA1b?mg~I$*%{umF{WDS14aiEtwuE$1ib<@o&4 z{0tfV8l>a`{{j#NI}@P=@HZ?Wn@Ne+RiWqrdt+!F*gd#{=nCWhzBl#>l!bf&O!B-n z2j(j02cVf@HevGuaG1O_N zbh9}{Y1htHT3Vc^U9HX37H$$kLn0BgSmbe84E}*4!Mlh#u$y*IEdOm{ok_rX!1WL^ z)2w_j)m0wiu%S_^{iO*}%fum_oU#g=#rhAD0{;lIO(|Imk|E`Dlt0qZySL->-+p)3 zay~@h>W9NE=Bkv#;~!*EATY|&;J2@Sech}M;dE?eC*}Ywj`SMG09B%!<2(=}>?Y>M zwUOgJzJqc&!^)A~pF=A(K2+HKzOtLh%skC|iq9?K4XcJmzrfBXDHV+UP$_{52Xf>rMtGfV(gCv@pl@ zl3LfaqsrP^!dzO$DUcaP-I_p|PX11eqCpUQk-W>IAV7+&<9T!0@_! zZG=5|SmNyrsPBKv3Q$GKjU@Q3nuLL^0)%<|J^!R^ryVfkl6ps7=0000h=GY#xtR&L3qS;TwhqGA-U>1iZ_MZ%)GuN zd?4KC%7DU`N;g7&Qk)C6coN%>MQb{P-qW5sxWvhZ3$ha^%I^Cu&i;W~63C&&Xp@Qn~-m z)5{JGhTWUuQ2!VNuiX&chOez4_&f}PuOp~^fb&Adzalw}zKgz9(Yp4bWgSj0Dw?qa zXB*Id@93`nBh|`|WV7&c0?l*KdJVCKFst%8$9FKjCco$kcK4u1?zb#{10k(w8Pg(E zvH$=832;bRa{vGf5&!@T5&_cPe*6Fc5z zX0sFlVM(B1BBVyWX!{3}a*>NlxrmgjNV$mAi(JrF{R6#-QV9i80U=O81OmoD!eRq9 zcmXr^jK`kcvz)%qd(Ih-#}i?dK_P)p3}=pT_^>9XGRJ&r+43dS9z8VV*L+3_<-u`>T+un*3WxRv#gEl z!$*(k(4j+5U0;3L20r@eBU-+ExlCAHQ$wQxm+%?+wJ5r*7bV5 z@*TL1brZa9j9+-4o=MV7IwS9I-MaN`5`YO3@faW4NlqJ!UN%jts*B)caDpZSeu{;s zC^M7b$+BcqG_vu1KdV4@clR?(0OlAQ8>4h8Nhw|<$$Oa&1!;WjA&m?T(&+F53QqVb zG998sEJ9i)&FgCvo}PZ{;pZg*7^~iRU29vunA|Qm)z;KeHS43t>!XQrKh@UOhyh5Y zQZzm>PX5P_Dajo8;l^#|{!OJAhH6Dyo3?yu3)yUTs;sJ(H8V_*EFab%n4;?HYDy&& zB6Wdaknbhv?)_1^-Pixr_3iWBL^_?NXf{a;SPbnpRtHt3J9q9-YilcIvsrSo*gqH= zqIe?7RMki+qNP@CDihzyL@%L*jZM_VFC0D@4Uwm`iW(L!qBx6tATU9^O@1F1V$ExA ztF>)!Z`Yu6)(1AMZq_0^xrcSGs=So-E6!pVAvf#c&RuWOkt0Xw_%|o%+y9=W)oVMc z#N%R#$QIRAscdKL4mWeZhPhosPS$-dukT`sY-(yEx7#f?$>DHPMMb6T6;ilk$Bx`t zKK$@Q4fd>!r3q)9BLQ$VFkUTeWm{UBH5ix#b2F)xv)H?d*{oBY#q8ph>(t%QOvjHO zr`!E^a~sWMGSt=8ML%BeEvgJCs*Rj(FH2pP!jq5b+i#8$tPqUsAO83!8hPIqBj#{2$1h&KN_X!K=I%lI zcE7cY4)X!K)~zEYIYSD22K)rZx`xjLX3iwzqPkF9#56FhbG*Ry>(_Nx<8@PG<08>J zOs2BFmz0)LW9u?~(Gw@+@E(u%iI}R&tPLy0Gy-xUg)U#YCWm*kG;IG%pIotL5aGZ( z?~uc$@gY@~0!0pnv%o?_G7`y@xbamSKUjk})w=1;n>UMyIGs+>E0rmRtHK0$G#-?P zzq@dOZr{Gme%L33$>)-Oc(tfTP!ly!*|g}kWz)f4>M^chf=PtB1&vf*#?s3~z;?V| zk8r)bw1k`vyQl!3EgT2%FV3GoFAv#_gWK&6swgj~9osh3&NsJF&(&+x*ViYD=5yJU zfUIm%qvDEyE(J!wO_%=BnY)4sUG!t@5aqr zbn^5$%CakVu+BUARl|Xk!%%_!`}hBJAcUKsv^-p*s{-85#trLPjLPWrU)yAn@Bh9| z76b=OM&}rgH>!QULFW9e0Egg|JFHz_ZQccUA z5w|ooHWrou+(ZI_hbP7-Xl4fScarrGvv%bg+(*ar^3 za>WYTwq-K~I6)d68I>F*G!kaWUud>nS;sKPL+ck-8-ooDFoF#IYOPy<0b69?cPMtZ=2cP0I zq$D^KRbc6ct0#+ro+Ya|7#^Bo6_^46_(!o=T%J#5vP_IP`Nu{i^1`!N^a4kK5ItPU z;;)Mx2WTRZPgKtwU;>!2f;s=2O`8a^(NJ3@d%(f7dz;}KSccq}1j!JZ4+0JDq)D#fBPQuqhZnaavaeFKWF?`fvw zcD5B0kB5Z_0sk1GV#8*N)_1O<>FMwsE)`?It!>$|MFKR*IbiJg`*t?WyLa!QqZ|aa zG}Ow$Rc4;T9x57*(`0Chf8!DZh*y7qzY!wm5dZ~5)X<=3?{HlG*=L^#3pwA{#>f4f z0=JNdlO#xni?0<`)tn^F(C>eDfV}0^1g3;SAqs|Ag;*M_R{Pm2w|YE3(04C=eS0Pj%9vPp%QhoQe=!Upy9O>T*WK zRs%IT2dAciK!D=a<$U-@WOKM^oMVS+_8NFTo5>c{2tuUY9MvJgfuTm24)#H9(=7Hd z*csMwpU1^|pP2XD_W2s2sc@7ROwu%a2PZF%Oc5MFoPZr7RE66_B?c}h&XyNd7*m!0 z-+?*4_~HwC><>t)8=MT$fMY<^fFvSRXlQtp^*cdPj{acn*JSi0GTQJdTNQ6 zA|a&e5eafIP`pL`67@cWzzD&m@PSl55$6DENcqJ}fEf-;U4oM=ba~L|K&>C;Zd80x z^hDhcl^?uN07=ZGIQPF(Jbb{; ziRs9^<}Qd2Kn7OqLtswKjWw+OdF%S<-9zWC-=oJ5BUoKsMfLUd)YRN0^}mf9H_`@v zb*@`OElmwnQ(4C8vYk{#la6*}MY&)b^6g1JJ|HI|jg5_(i4Oq22YI)Wb1_dE5{mIg zGdi~UT4cSC!UQVHs0|=JUa(++BsR$E*lN%EA>Y%?k{s|om>MV#q}S;6OS{|H1Nwew zeW6Tt@%u~C11MpGh)OVup-6&IKR{Io-rJ3L`b6T$f zDpD3lWq2l;pmerOx-+TtwCE`~k2Mx8Tv)LAp;ws`I?}`8mJ%EqocJy7qacFz_tIrc z`S53@4`{Z+@XW@}PN`s{GHez{fpT$k3Jv)&@d04K93yDr1K>XacdKK4Lr(y>A2dw| z1_tJ>?{H5WyVg)?Wj&RYmC?hIVTwfK%t?=|F~n+6Xn;6t*RB<~TXj_x)z&u%?gs?1 zJDmc6sI705HaNOdX0z5L0@Mw?fhBFP)5u`I)DFhk4XMAs>Hh|)|)N_@&S0RWlz}n!eF*nvI)H6^- zueV8%gY~g_6koxJ3MR(oD^~;n0U!hpk9Ihkv>3SJGq4L6E?(q4mC=Jo<9zrkc9pdP z>+_YC6~qVFt;P!_XX&(LQc`q8mBsACIS%&D?bhVE6BD%oZlGj=Ha@UL!1UP!$l#SV ze#k>9PEUp=!(iSDm;fZH^BEmui$-m_kJOI0wpp& z6A)$CFRDk@?(i%d08u}1-~h!UIz>=+LVXRRr)Tzt0gN!)(;yPMHRunTEi#0mv8jL* zD?tRz2d<)wW!->vpgk{z)}SgC=aPq`0)wlmZ^|9sicS$C{IiRC*Y`-16pP?K@JqOb zp2693XC;?NCgY+GSmWB&tAz<*;sfCJP~tv+{yW;cubU11aiY_0GP$bi_?ydJIzYnO z1-kgRwbCMkp+VOOmE!To0YP(`o#gxtSO?nkU;t#RuDV=$4%$qN{`K#}G&<%N_1gI7 zUV+BsutH#ARS%n2h!v%myRE3HB zIdGH-h_I?*XWm@l(9%~HTyH~LJ0Tsl3NDdk;AcBM<#xbE@Ac78#dLjW69$h8W?epD`HJ*Trl)8R8BP!@%NrWdr(-miecfnfo8Hi{0 z?Ab%tdV3_Q#roM)W{w-S7s3Ys7C%1Wr)WGWsL!l4CVv#5rzIvkfaItZ1?#H4dH6$f zo|x3#8FQ_ca|GlC;sN*t{LPZqM&4|kgQYg<+eJ7Z@4Y@L`j|EPiD;`Mq{dyb;$jQeIoN->_+B&Cj19S21D_yEP4 zj+*!YYd;MsB@p92pGOiB1SUX_0ze7B3hqE;Mbuebv5=rjm|!qIr%s(xtm!DM@~5AE zI;U8P^-;sqgP3l5)~0Hqbo}Viqe3hLAE3;;BGla6tRXfBcv_XD#vzfSS&RUjP5=w6 z=V()7+6fl3!NI{7zTz~miVz?sne+@*E~wT2I6lK_| zNnZeeK!Lv@0E`|uVnLAd6&yDUlNhicfT#du6^X=XzXfXZizUGG?$7_+h=GY#xtR&L3qS;TwhqGA-U>1iZ_MZ%)GuN zd?4KC%7DU`N;g7&Qk)C6coN%>MQb{P-qW5sxWvhZ3$ha^%I^Cu&i;W~63C&&Xp@Qn~-m z)5{JGhTWUuQ2!VNuiX&chOez4_&f}PuOp~^fb&Adzalw}zKgz9(Yp4bWgSj0Dw?qa zXB*Id@93`nBh|`|WV7&c0?l*KdJVCKFst%8$9FKjCco$kcK4u1?zb#{10k(w8Pg(E zvH$=832;bRa{vGf5&!@T5&_cPe*6Fc6h=uzK~#9!-CJ3ARM(Z>x9Zkh8cIk)5+Ebc zfN+>JFd5s}u_54?tfZeh`2!gq^E>*nht==h{nowOPMikXgaiT@A;}mUgg_t$%~F+A zRVvkZZ}zwEJy%sFBVkEd;2c)@%2l`SIcJ|ee_v^|#;B^QGFx`;r1gxa&z?~<8r5h6 zqo$_DY~HbBUEh5?I!X%*3#-n*>W7g?#N4-UpZx9dc$}Bl>m^;+$?bMK_vZ6?%4V~a z%jM){nx?!zI5w_l9|6_h=9o|>kr-Xw6!K;mjye>+l^Cg<{odqyGJ*|a;L37KF zMr!i;S@l>2d19SU1&i?cd^}-+S0Srqwabg@#S=*~_`OUzO^+TwUbh4=e_Ly-dGNqK za+wBIR)&e!BU+)kG=i1k6{?Jg;OC~tDaD$&w3MbCFW~EMhU6LR7Jx{dHyrZ2DY}rL z_V#x2>MrsHE6D5j)4jWQsk612G`CK{a5ZJ~1?szblkfLZCXAI-%^9Mf5AtSJCDZ^GlRq=sM(RYkT?WjIWY z+qcVSK{kb&3Lgb3wvg`iQJPOYIyXo0xfyYWP9}Lr*oqPBV*0gM1 z%;5UQJ6)4BYH?7w^z@>%NoK?fz{G1APOY(B$2=)Dt%DV2z_ zu-#OE0J2N8r)?K4rZW_qU!aDD26J+9(pdavLwN$Z1Q?8U%esEPbQP}k3atf%}za|0=zCC0<<*8>&|9U1Wz0a1=vIyIXuQ> zABZSQTajStD#^iO5$fWcz3Hr8eztFDf(s#sC4K(lMcMdU$KPUaTuJB8pQn5G?$Pkc z`_$b{l>6sHbeEkX{J;*|N4$&^dMQ7^^FzhG9ErZT^(8$VdF*_4;r~CUQy=`0{`b>Q z>A?f*Fy4RrC>6vB;q(e(wkM7srP0yHG{gP@rjEmMd;kQ16NeCX?%2i-WGfBaxhwHr z;;h?J>|hKBg_;BvGma(J*$M32o7fVdGHJ`3R1z-@Z+^cng6K|1=ILAt?0 z|LUu+r^3Jox9f3a!m&vsoXz^N51Rp8P0Z{5xnhk(O?5PtXj-%&VR zA%~SrEXuyB*j%yD$>}+onVpk$BbCNyjsRd2$n7zp0Ta_v@!(Y~DeNQ3+0`HabcOEm z$)Eh~edn|Xditqn;IOmMWzW5N0vZPB_xY3~ z9I^6Lvn3+;wzux4#)f*)0GPWUl(ZcZVKu67oPc57l%3 zYJgn7?5FPj9!Cp`wE?OJC$kxOfVD~Z6p#3UVqxQ2YgjMYrTQP~X|0f#=WMm-)!%HrJB6%O*3{qjEki}hihi9}rdhL_W3Q%dU^nw_bj znYmbrb~<{Cl2#fJkxFXZS}$Lkk4|%ZHl7HXRs~p;R22)ozxx&$>yg4yB&6(YZl{K-nbdN4c#K7&_bn5+g#38}f;CSS8coLUv+!hK80Nz?oW|I=3 z^1gx+_N}g))OD*{4h!qR<~#T7p?6Lkr@7f_(U67tdC|nidN%QFnjSwLlimUL>}UWw zDQITkA$7G|sG;7ft`;~Q#%JM*kR%z&WP*Oo8Q}i?`&nZa#XZh&{ipD1RU zNr488K6yq19PSK0>G_2PQN0+~2pHFH4ob3t%nL%mq)0}fdbnCyn@bF|U`u$jhE|kW z7TYim0f(`NPyX1^qXd!Tu=4zVfp1GB7e#>Wt-EMzeVu$4dsQtnT?qh^!NY<9A8l`H zVmo1h*p*+B{R7fVWLS7O;w&;R48&ik9tLuV1N+{j@v(6$aWOaN^bI~3WwS~HR5ucb z(An8ZAAazG6mWh0mL}$T_xLXMg~eREIl%7~#Gl|kl?m!fqRJ+oJ)hvTaZ2JS>oR|s zqts%OCp783w+>6PR9jao1qd`@ZhDfFkFbQk-tL3^@PzFL%*|7Odz?6Ng41BXRdc}E z@q2sOF`qhhntsnokg5evfA}H$v;>DjD<8o#8u?H$7G@`*(7L z4i1{i)84;7T%5hgH#*u|$<3*wk0SyqGPJ;4ywPliYjV~S-Dg)_{X>xK>Ha|W-uJOxhh|J8) zh%kT|xa{t&#&2rn4McQOBGpx7@MeY{JYpdP$nEh_AXG)ciW>Uk)teNosv(a*M8R++ zg)1X8@b!H@5$~osKdZ~jUYj>GF+Nu07pxSS*K9dnvMNSsDcW-Rd_fwh*nD}T6^E{{ z0)6cTSjkOoO(m;7n*$3#=ND!_cI>#7qVfw~-^EErds{nYc(FDa$(B#B8)l~T{lig@j)QZ7w3i@?+a8dT8 zY+sy~N_J-EX=M1W-8C{Lnt0tNrO`uxkTyXAhJ-VX(wQtpD#P?-WSC1?-R_kU)zwtd z*b}RK&jS%+Q>?74phXslQ7F7rczxl3y+k4rX_YNz*AI-W)tg^!emrv{zzD1Qs`Ia^ z0oWiW$HWm1KWK%07ig@drA3gPjo3dLnCpSY5bEIV;qcaN0;&*Es)$V@g+wzU%90%$ z8(R|`-AG>m-&Gl#(k#q@O|AxxDooJ*5^cFPRrBv19$(W5;sIZBCHVI`wAXoYubdz7 z%1`H2^8;Q70sO7`0j}3s0Epix&eB}(*KsBq@Oh|x_Zw7Q8RBa*XQ$QFx~rL!G%vL@ zZ<7qMd0V5Hgo5}s%nx`iGy#a!&K5y;c5+1W2P>q_jZQC`ogVLFX?aafP6?{@;a+raVG)P(689k>^!~4*(Eg0GJG&U}=Wh)gdRZ(il;8j0*9~+jmOv z`DFyi;wQAUw#jLuws+|sAvyr-4~D`N=8XXK1n!5H9nhaIZuSWV5azImPB5CG=m&x? zfH~7`Ez%pvrQ=*77HDo}#_292!`0PEI#?Mm9_+86FF@X4SZq!$SaNIoI7J9#p+EwJ zAm+MVQ(3L6Xa591SVP=gavC9$r8youk?4oKRf~oZR^I5Cwt(x^(5b zL(n+W-YO8-(`V1g&t~x6yKmF&Z-z?xf+S2fzcfgq3u&uN=BhSgvs+5|0Z1~ih{}pE z#o~+9u&r76K8h%L_3G8-ZcK5bLE^5xVdx6q+tYPG=ql(BqD6)-5gH}v6_n%i<@|&| zz)xGZHc@l4A$*?<3(d>#qa%%t1O5gA{Q2c8f&(fj42N@sO&J^pbcR9b`02Tic|AdX zc3Acmjm}zoWFLaUu0#OHu<#K4-Fx^jZQs7Eo}Yd889jRR=%pPU8Wu--4zhVzPT;5K zI;30le00RY=M^wf&QA!kAh1ATe0f--IJT1wh92uZM0H!Y3k(i)N`bXX2(Wu#17NX0 z6TG|*^a){3ONp3p95F}n{JP=?AicCwPhAoUw4b5opM3I(w4uSuaM_O0y1E>25~>YH z2y_Sl2@n{V(#aD?1z`?`0%8sxn_!8#<^{5{MlnBOOMMg7)z%3&aA|Qt+Fo#MIDHTx zK!m{N0fz&m1yYSG{vX^0JpUA{zue#0B+XKcdG-%Fr^uMYYu6Kw0AQ0)K}j!pN9ebq zB$LUwW5EBIWU)M=IG_D4v-PhX$@A@2@&$l*^k(MFA!bskcV4+ zL84nd7D1x8>+{9G9HMkOCAc9_BLF9Gg8%*LAEbk);PvIZ3B zzy9+-Xl!y?%<#ys2Zb7A-D|A{hk^B!3|=qV`9QS6W(B2pW-ht{Y1UOejgk_o2##;( z-n|k5l==XA!kQsj1&bf*V~O*L8#Z4@A+&1qfX)y?{cLal@Ux$h?&WaAp{*RBFXtzy zwMq2hd-IvRKyO^uIOHfrh$uG0?lOTUE|U;A!;v}*LvT+zH>xv(cwGm?U)&Vd~Jby0n9n@Hal(&w@ z>FALoG6B4;3PFe23&ZK{>1dP913ni7`HgLYBLYfub6x>JB^sMqfzOxo69lPFFNyC+ zCX%u{fUejRqKiVJ*BX0Si$UFmM#~(?26I*ofVoP-pyCI}0$4&oSK{o%kZYSZME;j+ ze~~1k_s~Jf*A-s~S5Rk8zI}{lrYxeOYEB^k_VL7SuR&=oBV7J+e7>BY0CM)7J6{Vk z9OP)>2eTFdc9#tp7WW96C8Vh$dsa1zIO(1qsRQ6(0jZ6Qj8LR9By)T#KR{vT*=&x6 zhli#Y-hr)g|5t5akTNhVI@LXf5csGQeVd zzMP*Bk0-^vTDks@%_oc};@XqhTg z-8MzdwA0*+7e5zO2bl_X<*>PgC8g2$_yhrAHjB#CVtgLgVt&G{TLacfYV^X=8qN*t zwFr~ix0dP4HH%%i8CI__!KMwwO5ql(HYD(a3H)ZjqRm^FAo##gcMq+i68x3L&VFw;5e-VVM+f z{&gH{HboU6Ix#-ZrD&Hh$w8(DpBUL1SfwCV4nG_bdL0;MAX#0#c7yOM4S3@3wE&cT zfnhZ^F-6J66g_)BE~M%l*Xy9x#^$DkV43FpA-)i&QLZ0M!=UfOc&+&XuUrFOH9z2$ n3*c4r16~Vs_*L@*{?_BKKoZsj>~3S`00000NkvXXu0mjfdY#gT literal 0 HcmV?d00001 From ace80016c1ebcec667022f887077ab7d51506163 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 18:31:47 -0500 Subject: [PATCH 049/121] 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 ae94268ca0b..615e82b3b3a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,5 @@ Order: 1 Entries: -- author: deltanedas - changes: - - {message: All plates can now be made in the autolathe., type: Tweak} - id: 4673 - time: '2023-08-24T18:01:14.0000000+00:00' - author: DrSmugleaf changes: - {message: Added pinging a Discord role when the round ends., type: Add} @@ -2906,3 +2901,9 @@ Entries: - {message: cloth can be crafted from cotton (made from cotton bols), type: Add} id: 5172 time: '2023-11-14T23:27:56.0000000+00:00' +- author: deltanedas + changes: + - {message: Added the disposal signal router which is controlled by signals instead + of tags., type: Add} + id: 5173 + time: '2023-11-14T23:30:43.0000000+00:00' From b178096bb8c46eae608dd61efd511e816349d498 Mon Sep 17 00:00:00 2001 From: Slava0135 <40753025+Slava0135@users.noreply.github.com> Date: Wed, 15 Nov 2023 03:52:43 +0300 Subject: [PATCH 050/121] Add disposals damage (#21489) * system naming conventions * remove obsolete warnings * use EntityQueries * tube comp clean up * damage on turns * remove OnRelayMovement because it didn't work * reduce volume * reduce damage to 1.0 --- .../Tube/Components/DisposalTubeComponent.cs | 50 +++++++------ .../Disposal/Tube/DisposalTubeSystem.cs | 12 ---- .../Unit/EntitySystems/DisposableSystem.cs | 71 ++++++++++++------- 3 files changed, 74 insertions(+), 59 deletions(-) diff --git a/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs b/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs index 8b3cd4720de..f33079c1cf2 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs +++ b/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs @@ -1,30 +1,38 @@ -using System.Linq; -using Content.Server.Disposal.Unit.Components; using Content.Server.Disposal.Unit.EntitySystems; -using Content.Shared.Construction.Components; -using Content.Shared.Popups; +using Content.Shared.Damage; using Robust.Shared.Audio; using Robust.Shared.Containers; -namespace Content.Server.Disposal.Tube.Components +namespace Content.Server.Disposal.Tube.Components; + +[RegisterComponent] +[Access(typeof(DisposalTubeSystem), typeof(DisposableSystem))] +public sealed partial class DisposalTubeComponent : Component { - [RegisterComponent] - [Access(typeof(DisposalTubeSystem), typeof(DisposableSystem))] - public sealed partial class DisposalTubeComponent : Component - { - [DataField("containerId")] public string ContainerId { get; set; } = "DisposalTube"; + [DataField] + public string ContainerId = "DisposalTube"; - public static readonly TimeSpan ClangDelay = TimeSpan.FromSeconds(0.5); - public TimeSpan LastClang; + [ViewVariables] + public bool Connected; - public bool Connected; - [DataField("clangSound")] public SoundSpecifier ClangSound = new SoundPathSpecifier("/Audio/Effects/clang.ogg"); + [DataField] + public SoundSpecifier ClangSound = new SoundPathSpecifier("/Audio/Effects/clang.ogg"); - /// - /// Container of entities that are currently inside this tube - /// - [ViewVariables] - [Access(typeof(DisposalTubeSystem), typeof(DisposableSystem))] - public Container Contents { get; set; } = default!; - } + /// + /// Container of entities that are currently inside this tube + /// + [ViewVariables] + public Container Contents = default!; + + /// + /// Damage dealt to containing entities on every turn + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public DamageSpecifier DamageOnTurn = new() + { + DamageDict = new() + { + { "Blunt", 1.0 }, + } + }; } diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs index 477a167fa27..33b260aa949 100644 --- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs @@ -44,7 +44,6 @@ public override void Initialize() SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(OnAnchorChange); - SubscribeLocalEvent(OnRelayMovement); SubscribeLocalEvent(OnBreak); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnDeconstruct); @@ -278,17 +277,6 @@ private void OnStartup(EntityUid uid, DisposalTubeComponent component, Component UpdateAnchored(uid, component, Transform(uid).Anchored); } - private void OnRelayMovement(EntityUid uid, DisposalTubeComponent component, ref ContainerRelayMovementEntityEvent args) - { - if (_gameTiming.CurTime < component.LastClang + DisposalTubeComponent.ClangDelay) - { - return; - } - - component.LastClang = _gameTiming.CurTime; - _audioSystem.PlayPvs(component.ClangSound, uid); - } - private void OnBreak(EntityUid uid, DisposalTubeComponent component, BreakageEventArgs args) { DisconnectTube(uid, component); diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs index 3edc2a5fa78..7c4827f8c8b 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs @@ -4,11 +4,12 @@ using Content.Server.Disposal.Tube.Components; using Content.Server.Disposal.Unit.Components; using Content.Shared.Body.Components; -using Content.Shared.Disposal.Components; +using Content.Shared.Damage; using Content.Shared.Item; -using JetBrains.Annotations; +using Robust.Server.GameObjects; +using Robust.Shared.Audio; using Robust.Shared.Containers; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; @@ -16,13 +17,15 @@ namespace Content.Server.Disposal.Unit.EntitySystems { public sealed class DisposableSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly DisposalUnitSystem _disposalUnitSystem = default!; - [Dependency] private readonly DisposalTubeSystem _disposalTubeSystem = default!; - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedTransformSystem _xformSystem = default!; + [Dependency] private readonly DisposalUnitSystem _disposalUnit = default!; + [Dependency] private readonly DisposalTubeSystem _disposalTube = default!; + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly MapSystem _map = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; public override void Initialize() { @@ -33,7 +36,7 @@ public override void Initialize() private void OnComponentStartup(EntityUid uid, DisposalHolderComponent holder, ComponentStartup args) { - holder.Container = _containerSystem.EnsureContainer(uid, nameof(DisposalHolderComponent)); + holder.Container = _container.EnsureContainer(uid, nameof(DisposalHolderComponent)); } public bool TryInsert(EntityUid uid, EntityUid toInsert, DisposalHolderComponent? holder = null) @@ -47,7 +50,7 @@ public bool TryInsert(EntityUid uid, EntityUid toInsert, DisposalHolderComponent return false; if (TryComp(toInsert, out var physBody)) - _physicsSystem.SetCanCollide(toInsert, false, body: physBody); + _physics.SetCanCollide(toInsert, false, body: physBody); return true; } @@ -57,7 +60,7 @@ private bool CanInsert(EntityUid uid, EntityUid toInsert, DisposalHolderComponen if (!Resolve(uid, ref holder)) return false; - if (!_containerSystem.CanInsert(toInsert, holder.Container)) + if (!_container.CanInsert(toInsert, holder.Container)) { return false; } @@ -86,11 +89,13 @@ public void ExitDisposals(EntityUid uid, DisposalHolderComponent? holder = null, EntityUid? disposalId = null; DisposalUnitComponent? duc = null; - if (_mapManager.TryGetGrid(holderTransform.GridUid, out var grid)) + var gridUid = holderTransform.GridUid; + if (TryComp(gridUid, out var grid)) { - foreach (var contentUid in grid.GetLocal(holderTransform.Coordinates)) + var ducQuery = GetEntityQuery(); + foreach (var contentUid in _map.GetLocal(gridUid.Value, grid, holderTransform.Coordinates)) { - if (EntityManager.TryGetComponent(contentUid, out duc)) + if (ducQuery.TryGetComponent(contentUid, out duc)) { disposalId = contentUid; break; @@ -98,36 +103,39 @@ public void ExitDisposals(EntityUid uid, DisposalHolderComponent? holder = null, } } + var physQuery = GetEntityQuery(); + var metaQuery = GetEntityQuery(); + var transformQuery = GetEntityQuery(); foreach (var entity in holder.Container.ContainedEntities.ToArray()) { RemComp(entity); - var meta = MetaData(entity); + var meta = metaQuery.GetComponent(entity); holder.Container.Remove(entity, EntityManager, meta: meta, reparent: false, force: true); - var xform = Transform(entity); + var xform = transformQuery.GetComponent(entity); if (xform.ParentUid != uid) continue; if (duc != null) duc.Container.Insert(entity, EntityManager, xform, meta: meta); else - _xformSystem.AttachToGridOrMap(entity, xform); + _transform.AttachToGridOrMap(entity, xform); - if (EntityManager.TryGetComponent(entity, out PhysicsComponent? physics)) + if (physQuery.TryGetComponent(entity, out var physics)) { - _physicsSystem.WakeBody(entity, body: physics); + _physics.WakeBody(entity, body: physics); } } if (disposalId != null && duc != null) { - _disposalUnitSystem.TryEjectContents(disposalId.Value, duc); + _disposalUnit.TryEjectContents(disposalId.Value, duc); } - if (_atmosphereSystem.GetContainingMixture(uid, false, true) is { } environment) + if (_atmosphere.GetContainingMixture(uid, false, true) is { } environment) { - _atmosphereSystem.Merge(environment, holder.Air); + _atmosphere.Merge(environment, holder.Air); holder.Air.Clear(); } @@ -182,6 +190,17 @@ public bool EnterTube(EntityUid holderUid, EntityUid toUid, DisposalHolderCompon ExitDisposals(holderUid, holder, holderTransform); return false; } + + // damage entities on turns and play sound + if (holder.CurrentDirection != holder.PreviousDirection) + { + foreach (var ent in holder.Container.ContainedEntities) + { + _damageable.TryChangeDamage(ent, to.DamageOnTurn); + } + _audio.PlayPvs(to.ClangSound, toUid, AudioParams.Default.WithVolume(-5f)); + } + return true; } @@ -222,7 +241,7 @@ private void UpdateComp(EntityUid uid, DisposalHolderComponent holder, float fra var newPosition = destination * progress; // This is some supreme shit code. - _xformSystem.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); + _transform.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); continue; } @@ -231,7 +250,7 @@ private void UpdateComp(EntityUid uid, DisposalHolderComponent holder, float fra Comp(currentTube).Contents.Remove(uid, reparent: false, force: true); // Find next tube - var nextTube = _disposalTubeSystem.NextTubeFor(currentTube, holder.CurrentDirection); + var nextTube = _disposalTube.NextTubeFor(currentTube, holder.CurrentDirection); if (!EntityManager.EntityExists(nextTube)) { ExitDisposals(uid, holder); From 42f1fa69f5014d0ddc41b8cae7d74c598ddc29f7 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 19:53:47 -0500 Subject: [PATCH 051/121] 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 615e82b3b3a..431708a5f8c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,5 @@ Order: 1 Entries: -- author: DrSmugleaf - changes: - - {message: Added pinging a Discord role when the round ends., type: Add} - id: 4674 - time: '2023-08-24T21:50:08.0000000+00:00' - author: EmoGarbage404 changes: - {message: 'Fixed the chemical guidebook sometimes missing one of the conditions, @@ -2907,3 +2902,11 @@ Entries: of tags., type: Add} id: 5173 time: '2023-11-14T23:30:43.0000000+00:00' +- author: Slava0135 + changes: + - {message: Traversing through disposal system now deals some blunt damage on every + turn. Be advised!, type: Tweak} + - {message: Fixed clang sound not playing when traversing through disposal system., + type: Fix} + id: 5174 + time: '2023-11-15T00:52:43.0000000+00:00' From 9c9ea60cfc64efb8fc7316ecad5a2ac3e8674368 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 14 Nov 2023 20:34:42 -0500 Subject: [PATCH 052/121] return foam artifact effects (#21656) --- .../Components/FoamArtifactComponent.cs | 2 +- .../XenoArch/Effects/normal_effects.yml | 68 +++++++++---------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs index e455c319ca1..dc6fd068395 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs @@ -33,7 +33,7 @@ public sealed partial class FoamArtifactComponent : Component /// How much reagent is in the foam? ///
[DataField("reagentAmount"), ViewVariables(VVAccess.ReadWrite)] - public float ReagentAmount = 200; + public float ReagentAmount = 100; /// /// Minimum radius of foam spawned diff --git a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml index 2bc2abdd6bf..4ec9c0778c8 100644 --- a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml +++ b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml @@ -357,20 +357,20 @@ components: - type: RandomTeleportArtifact -#- type: artifactEffect -# id: EffectFoamGood -# targetDepth: 2 -# effectHint: artifact-effect-hint-biochemical -# components: -# - type: FoamArtifact -# reagents: -# - Dermaline -# - Arithrazine -# - Bicaridine -# - Inaprovaline -# - Kelotane -# - Dexalin -# - Omnizine +- type: artifactEffect + id: EffectFoamGood + targetDepth: 2 + effectHint: artifact-effect-hint-biochemical + components: + - type: FoamArtifact + reagents: + - Dermaline + - Arithrazine + - Bicaridine + - Inaprovaline + - Kelotane + - Dexalin + - Omnizine - type: artifactEffect id: EffectChemicalPuddleRare @@ -496,26 +496,26 @@ prob: 0.5 maxAmount: 3 -#- type: artifactEffect -# id: EffectFoamDangerous -# targetDepth: 3 -# effectHint: artifact-effect-hint-biochemical -# components: -# - type: FoamArtifact -# minFoamAmount: 20 -# maxFoamAmount: 30 -# reagents: -# - Tritium -# - Plasma -# - SulfuricAcid -# - SpaceDrugs -# - Nocturine -# - MuteToxin -# - Napalm -# - CarpoToxin -# - ChloralHydrate -# - Mold -# - Amatoxin +- type: artifactEffect + id: EffectFoamDangerous + targetDepth: 3 + effectHint: artifact-effect-hint-biochemical + components: + - type: FoamArtifact + minFoamAmount: 20 + maxFoamAmount: 30 + reagents: + - Tritium + - Plasma + - SulfuricAcid + - SpaceDrugs + - Nocturine + - MuteToxin + - Napalm + - CarpoToxin + - ChloralHydrate + - Mold + - Amatoxin - type: artifactEffect id: EffectIgnite From c529a02f49ad3aba04b87fa716f308004e38c9c8 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 14 Nov 2023 20:35:43 -0500 Subject: [PATCH 053/121] small action bar fixes (#21655) --- .../UserInterface/Systems/Actions/Controls/ActionButton.cs | 1 + .../Systems/Actions/Controls/ActionButtonContainer.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs index 6b2033e78c0..ded6f77f954 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs @@ -326,6 +326,7 @@ protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); + Cooldown.Visible = _action != null && _action.Cooldown != null; if (_action == null) return; diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs index 5e26c192d7c..a2aa972625d 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs @@ -57,7 +57,8 @@ ActionButton MakeButton(int index) public void SetActionData(ActionsSystem system, params EntityUid?[] actionTypes) { var uniqueCount = Math.Min(system.GetClientActions().Count(), actionTypes.Length + 1); - BuildActionButtons(uniqueCount); + if (ChildCount != uniqueCount) + BuildActionButtons(uniqueCount); for (var i = 0; i < uniqueCount; i++) { From 26aaf59550030350581719d9e54b16fae59d8947 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 20:35:46 -0500 Subject: [PATCH 054/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 431708a5f8c..97426602c7b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: EmoGarbage404 - changes: - - {message: 'Fixed the chemical guidebook sometimes missing one of the conditions, - effects, or damage types for a chemical.', type: Fix} - id: 4675 - time: '2023-08-25T02:14:54.0000000+00:00' - author: metalgearsloth changes: - {message: Fix some minor quirks around reflection chances and also fixed reflect @@ -2910,3 +2904,9 @@ Entries: type: Fix} id: 5174 time: '2023-11-15T00:52:43.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Artifacts now have a chance to spit out both medicinal and poisonous + foam., type: Add} + id: 5175 + time: '2023-11-15T01:34:43.0000000+00:00' From 9044a94d2373eb6cc9813cd3b2529ec3d1c68de9 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Nov 2023 20:36:50 -0500 Subject: [PATCH 055/121] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 97426602c7b..9e1d19deda3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,5 @@ Order: 1 Entries: -- author: metalgearsloth - changes: - - {message: Fix some minor quirks around reflection chances and also fixed reflect - vest reflecting every projectile., type: Fix} - id: 4676 - time: '2023-08-25T02:48:27.0000000+00:00' - author: EmoGarbage404 changes: - {message: Solid plasma now comes in special plasma containment crates., type: Tweak} @@ -2910,3 +2904,10 @@ Entries: foam., type: Add} id: 5175 time: '2023-11-15T01:34:43.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Fixed actions sometimes gaining phantom cooldown graphics., type: Fix} + - {message: 'Fixed an issue where clicking an action would interrupt hovering, making + it awkward to click multiple times.', type: Fix} + id: 5176 + time: '2023-11-15T01:35:43.0000000+00:00' From 81a5f97a2e78bfe19eb2f209b772100080d9cf62 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:23:40 +1100 Subject: [PATCH 056/121] Gateway destinations (#21040) * Gateway generation * Gateway stuff * gatewehs * mercenaries * play area * Range fixes and tweaks * weh * Gateway UI polish * Lots of fixes * Knock some items off * Fix dungeon spawning Realistically we should probably be using a salvage job. * wahwah * wehvs * expression * weh * eee * a * a * WEH * frfr * Gatwey * Fix gateway windows * Fix gateway windows * a * a * Better layer masking * a * a * Noise fixes * a * Fix fractal calculations * a * More fixes * Fixes * Add layers back in * Fixes * namespaces and ftl * Other TODO * Fix distance * Cleanup * Fix test --- .../Gateway/UI/GatewayBoundUserInterface.cs | 3 +- Content.Client/Gateway/UI/GatewayWindow.xaml | 25 +- .../Gateway/UI/GatewayWindow.xaml.cs | 184 +++++++---- .../StencilOverlay.RestrictedRange.cs | 57 ++++ .../Overlays/StencilOverlay.Weather.cs | 68 ++++ Content.Client/Overlays/StencilOverlay.cs | 77 +++++ .../Overlays/StencilOverlaySystem.cs | 27 ++ Content.Client/Parallax/BiomeDebugOverlay.cs | 88 ++++++ .../Parallax/Commands/ShowBiomeCommand.cs | 22 ++ Content.Client/Parallax/ParallaxSystem.cs | 53 ++++ .../Salvage/RestrictedRangeSystem.cs | 7 + Content.Client/Weather/WeatherOverlay.cs | 218 ------------- Content.Client/Weather/WeatherSystem.cs | 8 - .../Gateway/Components/GatewayComponent.cs | 38 ++- .../Components/GatewayDestinationComponent.cs | 48 --- .../Components/GatewayGeneratorComponent.cs | 68 ++++ .../GatewayGeneratorDestinationComponent.cs | 37 +++ .../Gateway/Systems/GatewayGeneratorSystem.cs | 234 ++++++++++++++ .../Gateway/Systems/GatewaySystem.cs | 220 +++++++++---- Content.Server/Maps/PlanetCommand.cs | 43 +-- .../Movement/Systems/BoundarySystem.cs | 32 ++ .../Parallax/BiomeSystem.Commands.cs | 8 +- Content.Server/Parallax/BiomeSystem.cs | 183 +++++++---- Content.Server/Procedural/DungeonSystem.cs | 9 +- .../Salvage/RestrictedRangeSystem.cs | 8 + .../Salvage/SpawnSalvageMissionJob.cs | 9 +- Content.Shared/Gateway/GatewayUi.cs | 46 ++- .../Gateway/SharedGatewayGeneratorSystem.cs | 12 + .../Movement/Components/BoundaryComponent.cs | 13 + .../Parallax/Biomes/BiomeComponent.cs | 2 - .../Markers/BiomeMarkerLayerPrototype.cs | 25 +- .../Biomes/Markers/IBiomeMarkerLayer.cs | 4 +- .../Parallax/Biomes/SharedBiomeSystem.cs | 133 +++----- .../Procedural/Loot/BiomeMarkerLoot.cs | 6 +- .../Salvage/RestrictedRangeComponent.cs | 17 + .../Salvage/SharedRestrictedRangeSystem.cs | 6 + .../Components/LinkedEntityComponent.cs | 2 +- .../Components/PortalComponent.cs | 6 + .../Systems/LinkedEntitySystem.cs | 20 +- .../Systems/SharedPortalSystem.cs | 5 +- Resources/Locale/en-US/gateway/gateway.ftl | 7 +- .../Prototypes/Entities/Stations/base.yml | 7 + .../Entities/Stations/nanotrasen.yml | 1 + .../Entities/Structures/Machines/gateway.yml | 12 - .../Prototypes/Procedural/biome_markers.yml | 24 +- .../Procedural/biome_ore_templates.yml | 299 ++++-------------- .../Prototypes/Procedural/biome_templates.yml | 13 +- .../Prototypes/Procedural/salvage_loot.yml | 48 +-- Resources/Prototypes/Shaders/shaders.yml | 7 +- .../Shaders/world_gradient_circle.swsl | 27 ++ Resources/clientCommandPerms.yml | 1 + 51 files changed, 1560 insertions(+), 957 deletions(-) create mode 100644 Content.Client/Overlays/StencilOverlay.RestrictedRange.cs create mode 100644 Content.Client/Overlays/StencilOverlay.Weather.cs create mode 100644 Content.Client/Overlays/StencilOverlay.cs create mode 100644 Content.Client/Overlays/StencilOverlaySystem.cs create mode 100644 Content.Client/Parallax/BiomeDebugOverlay.cs create mode 100644 Content.Client/Parallax/Commands/ShowBiomeCommand.cs create mode 100644 Content.Client/Salvage/RestrictedRangeSystem.cs delete mode 100644 Content.Client/Weather/WeatherOverlay.cs delete mode 100644 Content.Server/Gateway/Components/GatewayDestinationComponent.cs create mode 100644 Content.Server/Gateway/Components/GatewayGeneratorComponent.cs create mode 100644 Content.Server/Gateway/Components/GatewayGeneratorDestinationComponent.cs create mode 100644 Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs create mode 100644 Content.Server/Movement/Systems/BoundarySystem.cs create mode 100644 Content.Server/Salvage/RestrictedRangeSystem.cs create mode 100644 Content.Shared/Gateway/SharedGatewayGeneratorSystem.cs create mode 100644 Content.Shared/Movement/Components/BoundaryComponent.cs create mode 100644 Content.Shared/Salvage/RestrictedRangeComponent.cs create mode 100644 Content.Shared/Salvage/SharedRestrictedRangeSystem.cs create mode 100644 Resources/Textures/Shaders/world_gradient_circle.swsl diff --git a/Content.Client/Gateway/UI/GatewayBoundUserInterface.cs b/Content.Client/Gateway/UI/GatewayBoundUserInterface.cs index 78e0060e9c7..fdb3cdbc010 100644 --- a/Content.Client/Gateway/UI/GatewayBoundUserInterface.cs +++ b/Content.Client/Gateway/UI/GatewayBoundUserInterface.cs @@ -17,7 +17,8 @@ protected override void Open() { base.Open(); - _window = new GatewayWindow(); + _window = new GatewayWindow(EntMan.GetNetEntity(Owner)); + _window.OpenPortal += destination => { SendMessage(new GatewayOpenPortalMessage(destination)); diff --git a/Content.Client/Gateway/UI/GatewayWindow.xaml b/Content.Client/Gateway/UI/GatewayWindow.xaml index 49e6bb679b6..7650850a70c 100644 --- a/Content.Client/Gateway/UI/GatewayWindow.xaml +++ b/Content.Client/Gateway/UI/GatewayWindow.xaml @@ -3,11 +3,26 @@ Title="{Loc 'gateway-window-title'}" MinSize="800 360"> - - - + + + +