From 63b816b83bf3e5f15b06b047a22d8b92c10ad462 Mon Sep 17 00:00:00 2001 From: ThereDrD <88589686+ThereDrD0@users.noreply.github.com> Date: Sat, 24 Aug 2024 08:25:23 +0300 Subject: [PATCH] [WIP] Upstream 2 (#489) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Automatic changelog update (cherry picked from commit 235091b377d6dc8f95b38d239a8e07560d45fa7c) * Remove airtight flaps from the construction menu (#27619) They are meant to be mapping only items. (cherry picked from commit a4b0a34bc74e3e374d780e7ba142d7670ca5ff59) * Automatic changelog update (cherry picked from commit 64a732ad7b1ba93b3aa64c233ecc7e4609683bf1) * Wine and beer bottles can be inserted into booze dispenser (#27626) Fixes tags on wine and beer bottles (cherry picked from commit b728f36f30260a80a7a499429430f0d7c69ff54d) * Automatic changelog update (cherry picked from commit 09b6f5c12888ca3a2fa51ab3544e4139988febcd) * small SpawnItemsOnUse cleanup (#27625) * small SpawnItemsOnUse cleanup * that one was not needed (cherry picked from commit eab276a12da4bd762b33c44c868722c2ef813d68) * make ducky slippers waddle (#27628) Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 8909dc7d401a7351ce0034c9e58af66922f5dbda) * Fix SpawnItemsOnUse not playing sound (#27621) Made SpamItemsOnUse play sound at entity coordinates instead of parenting (cherry picked from commit 9b176933969b00e70d52bbb9b960ed631f09b0ac) * Automatic changelog update (cherry picked from commit 8a7f7097944f6d9bb7c587a22118cad8b068926c) * Fix UI interaction priority (#27631) (cherry picked from commit 3c3c2daf26eb4c215e3de26120e5be593ebb3620) * Automatic changelog update (cherry picked from commit f76a471e5a22480f975ec1448a2fdea3c6476271) * Automatic changelog update (cherry picked from commit 291ecf9643a5308fd5f8b9172e1710862da683f8) * Add EntityWhitelistSystem (#27632) * Add EntityWhitelistSystem * Sandbox fix * update test (cherry picked from commit f348e6aa306a3542b1ed75b021c45228250aca3c) * Add syndicate sleeper agents random event (#27501) * Intercept rule (#10) * add * b * add this back lol * fix test fails (alert levels dont have prototypes) * tweaks (cherry picked from commit c69bf2f2aa23d57179dce1f6af9f7c73903d47e2) * Automatic changelog update (cherry picked from commit 192de3d9cb06c9526c5c63783507590c175acff9) * Space Ninjas auto-toggle internals after spawning (#25083) * fix engine version * actually fix engine version * Automatically activated breathing masks * weh * who needed that component anyway * check if internals are already running * Update Content.Server/Atmos/Components/BreathToolComponent.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Update Content.Server/Body/Systems/InternalsSystem.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * prediction * record struct event * remove delayed activation, instead ensure that masks spawn last * leftover * engine version * re-implement --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: metalgearsloth (cherry picked from commit f64dd5f45f8ebc08d791ac34e9482c6c3d85a51b) * Automatic changelog update (cherry picked from commit 4ede46003abf4c0593de00f802550df2b3642055) * Fixes the grammar for the captain's supervisor (#27638) Fixes the grammar on the captain's supervisor (cherry picked from commit a28296433b03c041e4374e88bdef7347a85f895f) * Red bool update (#27597) * the meat and potatoes yuh yuh yuh * what the hell is a copyright? am I right? (cherry picked from commit a8bf2689a4696e841ce607c7061ac73faceeeefb) * Automatic changelog update (cherry picked from commit 40a4eeaa3953db8213034fd3dd12fedce922deff) * Allow EMP implants to be used while stunned or cuffed. (#27644) Update types.yml (cherry picked from commit 0056befd4bac47f9e86c975342fcc80583affbb9) * Automatic changelog update (cherry picked from commit bedec83cd9a778d86795a0c8a5e4d439a3e4d407) * Geras bug fixes (#27308) * Geras bug fixes * oops * its as shrimple as that toggled transferName in the polymorph yml instead of using the system to manually change it * its as shrimple as that (2.0) fixed reviews for zombies having a dummy action, instead - properly implemented removal of action * its as shrimple as that (3.0) fixed tests by removing nameidentifier from slime (its already inherited, anyway) (cherry picked from commit 76ecdee94604f3cc73aba8b09d7bb36125a069e4) * Automatic changelog update (cherry picked from commit c045e2488e6ce85f16c7f4cf5dfced18cb18ce62) * Ninja's pinpointer tracks the research server (#27552) Change the tracked component on the ninja's pinpointer from BecomesStation to Research Server (cherry picked from commit 6fc684812d4deed313970de40e81822157afe461) * Automatic changelog update (cherry picked from commit 960f268d1cf5d2b318ccd4b2adf18f1837d1c9bc) * Fix some gamerules' round summary not working (#27654) Update GameRuleSystem.cs (cherry picked from commit 6ecbf0a04ce3ebaa6c74e144a8fb64ddf3223b43) * Automatic changelog update (cherry picked from commit 1d5392f86bd9a086283619ad7ce5d3259b1313df) * Change return to continue in gamerulesystem (#27656) Update GameRuleSystem.cs (cherry picked from commit 96a3967c3f4bcf5826b62013bc3e665656b1db81) * Rename Lizard urist (#27652) (cherry picked from commit 1b3481f094edffee3d7841e0c3ccbf8ba4cc30cb) * Automatic changelog update (cherry picked from commit 07d43af4a6e407d4e752466d965177dfe3e5c876) * Pathological Liar (#27618) * content * upgrade * n't * ye ya * Update speech-liar.ftl * Mith replacement ideas * fix * more! * Revert "more!" This reverts commit 6d10bdf694985c525a2b451ed39380f975059b44. * Update Content.Server/Speech/Components/ReplacementAccentComponent.cs --------- Co-authored-by: Kara (cherry picked from commit 5ab1cc0c846775e438517bbff9d7713eeb5ef85d) * Automatic changelog update (cherry picked from commit 540c45cbe9b6dbfce9eeb523f0c374d39ac7221c) * npc can no longer attack you through a locker (#27677) (cherry picked from commit 83b486b63fd23e149bb0112aac4800e63b1f33dc) * translations * Automatic changelog update (cherry picked from commit 8ee9ca22276df595ab4dc7767d66d9145dac2743) * Security belts can now hold more items commonly carried by secoffs/HoS (#27674) holobarrier (cherry picked from commit 873799095cc28cb5db753b005b3fa00ee117c370) * Automatic changelog update (cherry picked from commit 0a15d0855083eb5a35c5c8d0170720a294d07bf7) * Floodlights now have medium powercells instead of small (#27672) mediumcellfloodlight (cherry picked from commit 1c125cb14e661492e4c2a31f2e9d07c60bdde0c8) * Automatic changelog update (cherry picked from commit 4bb078601845228391db7a09f1b8c4a5c8f410d1) * More descriptions for the beakers in the status panel (#27669) Bottles Descriptions for status panel (cherry picked from commit c3fe975e8b8cf1dd220a49ceecd7450535eabf45) * Revert "npc can no longer attack you through a locker" (#27680) Revert "npc can no longer attack you through a locker (#27677)" This reverts commit 83b486b63fd23e149bb0112aac4800e63b1f33dc. (cherry picked from commit 37d0cb9c9085befad4f7fe1ee21a15d1d3c2f66c) * Scattershot antag fixes (#27429) * scattershot antag fixes * this too? * dawg fuck this code * ok so we kinda need this? (cherry picked from commit 5183f3ed8ba40527808610596d7e3eef3c925eef) * Rename ChemCleanBoodstream.cs (#27691) (cherry picked from commit 45fc6bed2f6e812603e0c181b0b163f15576749e) * Add default whistle + whistles reorganize (#27676) * Add default whistle + whistle reorganize * aaa * fux? * fiiiiix??? * Revert "fiiiiix???" This reverts commit 15353465d58db615185afa8c549e1819099c1a5b. * Apply suggestions from code review Co-authored-by: Tayrtahn --------- Co-authored-by: Tayrtahn (cherry picked from commit ead78b72d2e507fadf4f5424377aff8a5f94d271) * Automatic changelog update (cherry picked from commit 92c2ff0b05482ea490fbdc8ac3d27776a30dd936) * Use dotnet run for the run batch files instead of directly calling the exe (#27698) * Use dotnet run for the run batch files instead of directly calling the exe * FUCK (cherry picked from commit eb2fac40db1dfaf789511eef0cb7e394100fef50) * Emergency Tank + Plasma Can visible on suit storage slot (#27598) * Suitstorage Sprites + Plasma tank slots * Fix some extra brackets (cherry picked from commit 70d3cf7ba411ef38818f63eec944c4f0c7c33c98) * Cache regex instances in most cases (#27699) Using static Regex functions that take in a pattern is bad because the pattern constantly needs to be re-parsed. With https://github.com/space-wizards/RobustToolbox/pull/5107, the engine has an analyzer to warn for this practice now. This commit brings most of content up to snuff already, though some of the tricker code I left for somebody else. (cherry picked from commit 4a2a63a86b0ad36a2850e5750bfd5e653cb2ebd6) * update engine 6 * Remove useless line in runclient (#27701) I forgor (cherry picked from commit c61e683354d45bd4ec382de9117ba75cab67db9f) * welding masks on utility belts (#27694) (cherry picked from commit 7d35d54a814df74ef385ad8293eadff3e921c1c9) * Automatic changelog update (cherry picked from commit b947490d089af4c70ff0979250a4a03064e87069) * Add solution temperature to chemical analysis goggles (#27693) yes (cherry picked from commit 93c5e868579c0bd1baec8c6d023d98f530b63c44) * Automatic changelog update (cherry picked from commit 254a9177fc99a359f134516b19d2943baf50ae5f) * Expeditions audio tweaks (#27524) - Now uses a SoundCollection. - Now properly handles going between maps (audio rework mucho wow). - GetAudioLength used so it can properly countdown ANY song (wow audio rework wow wow). (cherry picked from commit d1a5d3562355a514c42b1027742549180f6edc37) * Automatic changelog update (cherry picked from commit 82fe5ab55de121e153b164b83b363fd4d95e437d) * Fix AlertControl throwing an error if the sprite view entity is deleted multiple times (#27690) * Fix AlertControl throwing an error if disposed multiple times * Replace default check with deleted check (cherry picked from commit c20df3e39ffd3b28db499bcc4a0e1fb48b563826) * Fix tests (#27711) * Fix tests * Fix test fail * Apply same fix to other tests (cherry picked from commit eee8e03c15ea22472d6b442281fccc4cb036e64d) * New Salvage song: Deadline (#27707) Deadline (cherry picked from commit 104c2afe692c0c05172b9ba2a15213d2a54ae99c) * fix(ui): Fix shuttle control radius marking text vertical spacing (#27695) (cherry picked from commit 7ffa74abd009650de3868d47c95b45ef4a18ea9c) * Automatic changelog update (cherry picked from commit 1ecc36b04945169e42ad42de56d7af69092aa447) * Dock device link port (#27646) * Add dock device link port * SpawnAndDeleteAllEntitiesInTheSameSpot moment * The fuck is TryStopNukeOpsFromConstantlyFailing?? Do we have a new test that can randomly fail? (cherry picked from commit c7a5587e0710f6d4b8a959bb54fbcd9e9631a96f) * Automatic changelog update (cherry picked from commit 3b3cc0e66cd03d71c27ba65810f876001923fcfa) * update engine 7 * Update license of deadline.ogg (#27715) (cherry picked from commit b8d03b814b1ede3a53874efe2d8d46f3ef8dbd6c) * Round event frequency simulation command (#27718) (cherry picked from commit c1aae2398b5e4510b9b07ea7af877fc5760dd5c3) * New lobby art: Just a week away (#27717) just a week away (cherry picked from commit 026af631f8a844b000dec4702eb6080e9a7bed9b) * Automatic changelog update (cherry picked from commit 3dcb65feb292e3088729b69f36fc3d5ac51eae58) * Fix missing command desc (#27722) (cherry picked from commit aa426c9c3aec67ee82f7b6d10cd5770ad008483d) * Remove duplicate liar word id (#27723) (cherry picked from commit fbe8374c0f79b32dc49f0a009041798510f2c888) * Event frequency balance pass (#27721) balance (cherry picked from commit 8f4362df036ea1dd5dba7a31c3669640964a45c2) * Automatic changelog update (cherry picked from commit 8fa7ea7cf9c03ea3273882708d31092a0c6e2eb9) * Fix some gamerules' round summary not working (#27654) Update GameRuleSystem.cs * fixes * fix antag selection being evil (#28197) * fix antag selection being evil * fix test * untroll the other tests * remove role timer troll * Allow tests to modify antag preferences * Fix antag selection * Misc test fixes * Add AntagPreferenceTest * Fix lazy mistakes * Test cleanup * Try stop players in lobbies from being assigned mid-round antags * ranting * I am going insane --------- Co-authored-by: deltanedas <@deltanedas:kde.org> Co-authored-by: ElectroJr * fucking tests * fix round restart loops * Fix `TryFindRandomTile` grid weighting (#27724) (cherry picked from commit aaabd5e9141e2e51b81c0dacd32e7e849826204d) * Automatic changelog update (cherry picked from commit ddb07d5f6362de11832f6b2085c4f6e8abfa625c) * Remove duplicate liar word id. Again (#27727) Missed one translation (cherry picked from commit b58d8a02b6e0d0a8b546fc0d1e437cb0b4f147bf) * Half the amount of bleed rate cauterized by burn damage (#27726) half (cherry picked from commit 7d23d014458180fe26b3ec847417a99120cf6ef5) * Reduce the amount of burn damage from touching lights (#27728) * chilled * external (cherry picked from commit 7794ab86094d1c406fbb888ae3ed2a489348af9c) * Automatic changelog update (cherry picked from commit 008f6ef94a65a48d8bc2e89c80774d1ac6c624b3) * Moved Serverside solution container code to shared (yes that includes ensureSolution!) (#27478) * Added warning to tryGetSolution, moved SolutionContainer code to shared - Added an optional warning (false by default) to print an error if a solution is missing when using tryGetSolution methods - Moved ensuring solution containers to shared, left the old method stubs for compatability and marked them as obsolete. * Update SharedSolutionContainerSystem.cs * Update SharedSolutionContainerSystem.cs * Update SolutionContainerSystem.cs * Update SharedSolutionContainerSystem.cs * Fixing ensuring chem solutions always returning false on client - ensuring chem solutions will only return false on the client if it is waiting for a server solutionEntity to be synced * Added concentration helpers * fix whitespace (cherry picked from commit 6685146a1e3e188eac1fb2502920225c56cc08e1) * Automatic changelog update (cherry picked from commit 19aeff26ec2cb87ceee918c1c5f4f6639fd35ad5) * Night on Europa (#27731) night (cherry picked from commit cc9e40820fa48a7378c6b96371ef819010e7c085) * Reduce ratking chance severely (#27760) (cherry picked from commit 7d7c71e6a66bd0e626bc1b31529db0f708b8066a) * Automatic changelog update (cherry picked from commit 61c1aeddf369e46c269c2b03cace3f0b25ebf470) * Fix preference loading bugs (#27742) First bug: if an error occured during pref loading code, it would fail. If the person then readied up, it would likely cause the round to fail to start. Why could they ready up? The code only checks that the prefs finished loading, not that they finished loading *successfully*. Whoops. Anyways, now people get kicked if their prefs fail to load. And I improved the error handling. Second bug: if a user disconnected while their prefs were loading, it would cause an exception. This exception would go unobserved on lobby servers or raise through gameticker on non-lobby servers. This happened even on a live server once and then triggered the first bug, but idk how. Fixed this by properly plumbing through cancellation into the preferences loading code. The stuff is now cancelled properly. Third bug: if somebody has a loadout item with a playtime requirement active, load-time sanitization of player prefs could run into a race condition because the sanitization can happen *before* play time was loaded. Fixed by moving pref sanitizations to a later stage in the load process. (cherry picked from commit 7a38b22ddbf03814680277d54c285dcc70345e20) * Automatic changelog update (cherry picked from commit 0cb50a24c37f83da2f852660cf5e38a8936750d8) * Little morgue overhaul (#27750) (cherry picked from commit d099b634242b3f8b84724f90b279f5b20f153333) * Automatic changelog update (cherry picked from commit 35dc85fd47a9d3e6af10de2f7aad3076586ee4da) * Make arguments and parameters wrap to one variable per line (#27766) (cherry picked from commit b9906eb34cb56f7ef34f5b4f050b0ef2f87b1be9) * Revert "Fix turned off thrusters consume power" (#27755) Revert "Fix turned off thrusters consume power (#26690)" This reverts commit 70959e7bb081c1a6e1457a8f8ee7732da91bb270. (cherry picked from commit 1e30234539a0dbfce1724a66eb27e5e0ab439d86) * Fix construction instructions on flippables (#27574) Fixes #27547 (cherry picked from commit 28f5d490a4a6153bf56e4f8b4c5d3fa17fe8f14d) * Log event starts to admin alert chat (#27761) (cherry picked from commit 09b53192708543f1f8c4796a01907193db66216e) * Automatic changelog update (cherry picked from commit 31a832710654627702b9362f71fb327ac8c93ea9) * Set max line width to 120 (#27765) (cherry picked from commit 0926891f4f0591bf34a79b17aae1f7b1a91acd0d) * Automatic changelog update (cherry picked from commit cd8e90c58ecd47fb018e402bd7dea84a9715bb13) * Weapon Reflection Movement Mechanic (#27219) * Weapon Reflection Movement Mechanic Adds a movement mechanic to deflection. Standing still gives you your best chance of deflecting a shot. Moving lowers this to 2/3rds. Sprinting to 1/3rd. This allows for robust players to express better and provides counterplay to someone finding a goober-strong deflection weapon, giving more design space. As part of this PR I've also touched the numbers of a few swords, shields, etc. and modified some descriptions to make them read better. The balance numbers are not remotely final, but as intent: 1. All the sidearm swords (katana, cutlass, captain's sabre) have the same damage. There's no good reason the "ceremonial" blade the captain has doing more damage than a katana. 2. The Captain's Sabre has a 30% reflect chance, dropping to 20% when moving and 10% when sprinting. This one is controversial due to the recent nerf, I suspect: This could easily be 15->10->5? 3. The Energy Katana has a flat 30% reflect chance. 4. The meme Throngler has a 30% reflect chance, dropping to 20% when moving and 10% when sprinting. 5. The E-Sword has a 30% reflect chance, dropping to 20% when moving and 10% when sprinting. 6. The Double E-Sword has a mighty 75% reflect chance, dropping to 50% and then 25%. 7. Both reflective shields - Mirror and Energy - have a 95% deflect chance, dropping to 63% then 31%. * Resolve PR comments. * Weh? * Reign in double esword a tad * Shield nerfs no longer real * Improve Mirror Cult desc * Simple alert for deflection! No art yet. * Added a new icon for deflecting (cherry picked from commit b90373356e7f4f0eee693732964eac9c9eaa1f02) * Automatic changelog update (cherry picked from commit 6301e94390790c3a19a62c2a12bda1629037f79c) * make lube speed up lathes (#25515) * add LatheGetSpeedEvent * add LatheLube system * make typical lathes accept lube * spill * :trollface: * rework to generic ReagentSpeedSystem * hyperlathe ops --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 262b9698cf0cfaad19c68223d7ed777cbe7dc33f) * Automatic changelog update (cherry picked from commit 685188fd109c31e54fbf77cddf56743c678e4406) * Stop Toilets crushing you into walls (#27778) (cherry picked from commit 24e227660a34e33966f5b9bd7a5f69c775c9669b) * make hyper printer inherit base lathe (#27777) Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 89cbb100fd52a6ae5cf19f35e426b5627cd3f72f) * Change combat gloves sprite (#27373) * Changed combat gloves sprite. * Edited combat gloves sprite. (cherry picked from commit 8ec52ff69cb784e5b2640370c8a79b7f530114d9) * Automatic changelog update (cherry picked from commit 18bd221407d46725fc928cc6b5f4f8ee34ba0a76) * Make the floppy lizard ears have two colors. (#27679) * Make the floppy lizard ears have two colors. * please fix whatever the hell happened * fix the error * suggestion from Ubaser * another suggestion from ubaser (cherry picked from commit bd06aa2365d6ce093ac47462deb69858c6cc18c0) * make dragons breathe fire (#26746) * add ActionGun system * add RepeatingTrigger * dragons breath projectile, repeatedly explodes * give dragon fire breathing action, fireproof it * oop * oop 2 * prevent troll * proper repeating thing * pro * webedit ops * realops --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit d6d1c9ed8a748366e129155d2bb317dc8db24e37) * Automatic changelog update (cherry picked from commit ab1a2de367e307eaadaef9d2c90addeb96d625b9) * Fix preferences sent to client not being sanitized (#27789) Fucking whoops In #27742 I made it so sanitization of character profiles was moved to be *after* database load. Except that means I moved it to be after the copy of all character profiles got sent to the client. Move the sending to *also* be in that second load stage, and rename it. Fixes the issue. (cherry picked from commit 9efe4dc70120a001ac2964b11d6773cb0a39d1da) * Revert "Make the floppy lizard ears have two colors." (#27790) Revert "Make the floppy lizard ears have two colors. (#27679)" This reverts commit bd06aa2365d6ce093ac47462deb69858c6cc18c0. (cherry picked from commit caa822b9a01adb65286365bf091c31547a160018) * Fix the changelog window being very laggy until a tab is clicked (#27795) (cherry picked from commit 15153d95a4bc209ae6df053f86e303cb16b38103) * Shoot Over Racks (#27797) Racks now have table collisions (cherry picked from commit b104125c0ebcc829b54dc05dcabd9b7fb6585f96) * Fix cak and breaddog not being able to escape inventories (#27794) Fix cak and breaddog (cherry picked from commit 99212762d6da89263c8c98e83f9a52e7bd43b881) * Automatic changelog update (cherry picked from commit 1a09374b016039892a3b9aeae4e61f1114515f89) * Fix pull not stopping when character is downed (#27796) (cherry picked from commit 83099640e69fe004e9230422732fd353de9780e5) * Automatic changelog update (cherry picked from commit c097c98a1e09ff7bdd8ebb475e4cdd621d09011f) * ебал движок * zaebal * Reimplement supplybots as non-vehicles (#27769) * Reimplement supplybots as non-vehicles * what the hell is a container container? * Dumpable * let them hear supply comms * unmigrate * no more QM access * Skill issue --------- Co-authored-by: plykiya (cherry picked from commit 1952ae3267ce3724f202e2fb5e69ddfb6ed86951) * Replace Train syndicate Jaws (#27734) Should push the right changes to my Train Branch (cherry picked from commit aad5b9e53bedfc24c3a919d21946573c7211fe37) * Automatic changelog update (cherry picked from commit 29860a0cf7d6b541b941792ae8978ddc0030a505) * Added new HTN operations and preconditions (#27486) * Added new HTN operations & preconditions * Ok I forgot about partial * Namespace pierce the skies * Some fixes, debug and new operators * Bruh git eat my files (cherry picked from commit 31491775e597fe9906df66d7285d5b63ba92daa2) * Move step sound distance and footstep variation to MobMoverComponent (#27799) (cherry picked from commit 401350759cd6486afa577c12b4536f39491b5254) * Automatic changelog update (cherry picked from commit 130ab51e38d8f2b1c1f7aeb588949999a506c424) * Bike Horn, Clown Recorder, Suspenders for Theatrical Performances Crate (#27668) added clown and mime item to theatrical crate (cherry picked from commit c1ed8542647e1f0e62757917e8338370426ae3f5) * Automatic changelog update (cherry picked from commit 00aa6d0bdd47361ff2eed204c8e3a65c491e2845) * Fix Supplybot Ghostrole (#27811) * Add raffle to supply bot * Add GhostTakeoverAvailable --------- Co-authored-by: plykiya (cherry picked from commit db4c9787c985bc30440c63e9aa5bc3a6cae29b8a) * Adds supplybot to crafting menu (#27827) Add supplybot to crafting menu Co-authored-by: plykiya (cherry picked from commit 4c68fce06449995ebdc4dc5ad7ddf86a325b42c5) * fix mech energy display for 0 (#27828) Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 1f67733775ba8acdaa7458addf1aaff0fc48b1d9) * Drinking from spray bottles (#27815) Added drinking from spray bottles (cherry picked from commit 372807673b15a296170599f62c0576de0b7daa23) * Automatic changelog update (cherry picked from commit a7b86f724edaf24caa09edb70efe358165d63c53) * Add CanAttack check if target is in a container (#27689) (cherry picked from commit a2329889aa40ef30ca29c1e508e7460ebc710477) * Atmos pipes now deal blunt damage (#27673) * pipe * weak * inhand * IT WORKS * inventory (cherry picked from commit 4d991d1554c4b9b954b4d44b74f06ff76e359bab) * Automatic changelog update (cherry picked from commit 9d4ead30b9d948d75f2dc46e0e81d17cbffa11cc) * Add Missing Unlocks to Emagged Lathes and Move Recipes to Protolathe (#27575) * Add missing emag recipes to lathes * Move autolathe dynamic recipes over to the protolathe * No disablers! * Move blast grenades to protolathe as well * Forgot about tranq shells * forgotten things from the autolathe PR * Altered lathe descriptions to more accurately reflect their purpose --------- Co-authored-by: Plykiya (cherry picked from commit 515456824812ebd125ce8ee2dbf9df0c2470c391) * Automatic changelog update (cherry picked from commit 38a2beff920c39b08736dc30904c3ac4867051f3) * Add auto map vote cvar (#27496) * Add auto map vote cvar * :trollface: (cherry picked from commit fe35188e2c7b3f7cf209aebf7f97c184e30ae8fb) * ninja criminal records hacking (#24982) * more humour * spotted a troll * add TryFindObjective to MindSystem * replace copypaste bool conditions with CodeCondition * use CodeConditionSystem in ninja + add handling for criminal hack * add criminal records hacking * update objectives * :trollface: --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 24ab5c098251254e69264bda2a45c7c639244a68) * malf killer 9000 (robotics console) (#24855) * create devicenet frequencies * create borg transponder and give it to all nt borgs * add robotics console * actually implement battery charge display + some fix * tab * real explosion * little safer * disable destroy button clientside too when on cooldown * m * how do i do this when i review things... Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * webedit ops Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * ui updates * oracle java * do a thing * update ui when a borg times out * maybe fix test * add IsLocked to LockSystem * make destroying gib the chassis again, so emagging isnt sus * use locking * require using alt click to unlock so normal click is open ui * the * use LogType.Action * take this L * pocket lint? * sharer * pro ops * robor pushmarkup * m * update and make it not use prototype anymore * frame0 * update yaml * untroll * bad * h --------- Co-authored-by: deltanedas <@deltanedas:kde.org> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> (cherry picked from commit b33730db22cd6d505a79e0b7fa39c34425d9639e) * Automatic changelog update (cherry picked from commit bf0de0ffeb5b6d1533adcfbcedfa1350ee2f9206) * Revolutionaries can now cuff command instead of killing/exiling them (#27627) * command can now be restrained for revs victory * headrevs still must be killed (cherry picked from commit 7d918c95d0adbe38e63b706ebf899ddca364af01) * Nukie agent requires chemistry hours, rather than general medical hours. (#27098) * Update nukeops.yml Change nukie agent's playtime requirement from 5 hours medical to 5 hours chemistry. * Update nukeops.yml again 5 hours -> 3 hours (cherry picked from commit 86405ecace1f5311b862c8793e698ae45c4fa6a1) * Automatic changelog update (cherry picked from commit c866c2f5240abefec3e25917ec18017567a8bf82) * Make storage UI close upon being locked (#27810) * make storage close on lock * formatting and comments * Update Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs Co-authored-by: ShadowCommander * Apply suggestions from code review Co-authored-by: ShadowCommander * Swap to foreach instead of for Co-authored-by: Kara --------- Co-authored-by: ShadowCommander Co-authored-by: Kara (cherry picked from commit de729f9037280791262cac9135d94524fec4814f) * fix master (#27833) pro Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit b96ed726f19f3323a478a7712cc6198d5bb884d0) * make fire not burn through hardsuits (#27161) * add FireProtection system and event * minor optimisation + make flammable use fire protection event * add fire protection values to some things, nerf firesuit heat resistance * bruh * unrevert laser nerfs, make elite hardsuit fully fireproof --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit cd92046966cf2537b664223a43853d33a6d351d3) * Automatic changelog update (cherry picked from commit 0d8149f151a862401bef425cd637010068b4ac3b) * Change minimalist theme empty slot outline (#27860) Change minimalist them empty slot outline (cherry picked from commit 4231efc780223832db9f0e1aa5c0f0f1bbb290e8) * Prevent non-inital infected from getting the succumb to zombie action (#27820) * b * Update ZombieRuleSystem.cs * hi (cherry picked from commit fe5f4162acbfbd7db2fe0882531fba9e096057b0) * Automatic changelog update (cherry picked from commit b5e31cbf2b46538d7f395d2046cebcc19be40ad3) * Fix NoMaterialArbitrage crashing when multiple lathe recipes give the same product (#27842) (cherry picked from commit 2de3dbc9cea4fbb63baa501e0fe99fd66839db3e) * CMO Drip DLC (#26153) * All the stuff yes yes * THE GOD DAMN META bruh * New sprites and all that jazz yay * loadouts working? (cherry picked from commit 77ee0088f9bd2ac8ff09e4b4ee2777bb7f2bea05) * Automatic changelog update (cherry picked from commit 55e82ab239b05a0ef2d01357d59ec7d0fe9760f4) * Revert "Add auto map vote cvar" (#27869) Revert "Add auto map vote cvar (#27496)" This reverts commit fe35188e2c7b3f7cf209aebf7f97c184e30ae8fb. (cherry picked from commit 4e3332636a1b6faac12212b983efb34d2b4cd460) * Move id and health examinable to shared (#27867) * Move id and health examinable to shared * Make GetInfo public (cherry picked from commit 0e3a2b3ba1d7bd0cd192e162a1d15a69dc8feaa9) * Fix two issues with ReplacementAccentSystem (#27866) (cherry picked from commit 0d0d46e01fb708a412688ad07ae0f633082ffbac) * add health icons to the secmed hud (#27483) redo change (cherry picked from commit e41a48765857d41466dc10ea52766e3b9833e2d2) * Automatic changelog update (cherry picked from commit 581e105aa2a02c396698250faa4e705956c2c486) * Adds new "Short-Sighted" trait! (#26037) * initial commit * blindness trait now uses minDamage as suggested by deathride * made fixes for review for shortsightedness * review appeasal * removed PermanentPoorVision & merged its functionality into PermanentBlindness (cherry picked from commit 1699ddecf8bec31a6c05b8fe13367f57a67da5d1) * Automatic changelog update (cherry picked from commit a4ab997f1f829099bba8aae844fa95259dac2f6f) * Traitor objective issuers (#27855) * the thing * another one --------- Co-authored-by: whateverusername0 (cherry picked from commit 42571b12e92da2cb929b1e6a2054f88e0d237b48) * Fix evac shuttles not activating the shuttle ETA timer (#27847) * Update emergency_lox.yml * tge (cherry picked from commit 967de41a5c2ef566e44c26ca56b00263fca35273) * Automatic changelog update (cherry picked from commit 1a4d238247b36744b6f7182e026f8c4a058c59a7) * Minor map fixes (#27564) secradio to oasis, crimrec instead of statrec on box, reporter actually added on oasis (cherry picked from commit 5b423802617ab678b9c4a61064fc89427f0731ce) * Automatic changelog update (cherry picked from commit b55cf45ec5396af90c4aec2de589159ed97aa44a) * Make suit storage only available for hardsuits, softsuits, and armor (#27546) * AAAAAAAAAAAAdd! * o shit * I FUCKING HATE INDENTATION GRAAAAAAAAAH (cherry picked from commit da2b9afc3a6af6791222092d1223074ccb4dde1e) * Automatic changelog update (cherry picked from commit 4dc3ec390ecd544b65f022807bee1daba7e8a6b7) * Automatic changelog update (cherry picked from commit c838d17fdb084c7132f76f57cfb286dbede325df) * Cluster med refactor V2, robotics console, emergency N2 lockers (#27840) * Cluster med refactor V2, robotics console, emergency N2 lockers * adresses some more issues * removes bible an chest rig (cherry picked from commit 973a8b3ad71419f045b0ff3dedd452c4771fd0dd) * Adds wielding for all large guns (#26970) * Adds wielding assets * Modifies meta.json files and adds artist credit * Adds wieldable component to a bunch of weapons * Moves shotgun inhands and wield inhands to their own folders (because its the only way the sprites would work) * Removes the wieldable component from some guns * Adds wielding sprites for wieldable guns that didnt have them * Adds gun wielding bonuses and base innaccuracy to wieldable guns. * Corrects wielded accuracy to be default accuracy instead of perfect * Makes the drozd smg and bulldog shotgun wieldable * Makes nukie c20r wieldable and adds sprites * Adds BaseGunWieldable * Makes all the newly wieldable gun use the base inheritable * Adds accuracy to smgs to resolve inheritance conflict * Makes all wieldable shotguns require wielding to fire because of a bug involving spread innacuracy * Adds wield bonus message on examine (cherry picked from commit 2287f59e8a0aff8cc2239902536940a3f6ed724b) * Automatic changelog update (cherry picked from commit 6c99534761d5d5dc4d74b5908d4485bfd80865d1) * Atlas Rework (#27702) * reworked atmos * fix rtg atmos * security perma and bridge * misc tweaks * minor fixes * fix skill issue * fix map render * requested changes * fix cameras * add robotics console * remove door states * air alarm * fix funky tiles at bar * add missing tiny fans * remove pod fan from last commit * moved robodrobe (why did i change sci slightly) * add buckets and water to jani (cherry picked from commit d4ea3ca25aa04a7b9cd243b387fd9d3f8a3269a5) * Automatic changelog update (cherry picked from commit f76d3d8a5ed3f6dcd7adcab9850525b525dd693e) * saltern robotics console (#27834) Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit d061aa437e18777e5163b6aedc0826835e3363f5) * New event: Approaching unknown shuttle (#24490) * setup codebase * Add first shuttle * tak * sync striker * sync 2 * pipipi * Preloaded roundstart shuttles! * Make it abstract "PreloaderGrid" not "PreloaderShuttle" * to do * added china cuisin shuttle * fixes * add disaster evacpod * remove enemy * final shuttles * weight 5 -> 10 * move data to component * remove autotrailer touching * doc, respath * fix frozen positioning * fixes + cvar * finally * fix evacpod * remove blacklistrules * remove `UnknownShuttleSpawnRule`, refactor `LoadMapRule` to support preloaded grids * use tryload * cleanup * fixes * use preloadedgrid for loneops * weight unknown shuttles differently (preliminal) * leftover * cleanup and raffling * partial review * singleton gridpreloader no station coupling * fix grid atmoses * `roleLoadout` support for `LoadoutComponent`, fix missing gear * weighting changes * init logic fix --------- Co-authored-by: Kara (cherry picked from commit e522bbf90d8d18ee0909b3c2b708598eb50bec61) * Automatic changelog update (cherry picked from commit 501d039b26aa9fa3d193f6025c88bf1dcdf09f93) * Update Core (#27887) add (cherry picked from commit cfa6a0050e4c6a64294aa8cc7a097183bc7c7d5a) * fix fland kitchen freezer (#27532) * fix fland kitchen freezer * run fixgridatmos (cherry picked from commit d688ad2878d4571c625a4948fb6196a5132c2f48) * Automatic changelog update (cherry picked from commit abd961d9c46db94f07bb685e3bc5f3cb8f30adc2) * change shadowstone desc. (#27900) shadowstone desc. (cherry picked from commit 40802738ec84496cb55ad824bf0f94ed7a7916c6) * Automatic changelog update (cherry picked from commit 0250cd99be75c2238a005491a47a51f11fee2062) * Remove THC oil (#27889) remove THC oil (cherry picked from commit 938c3104e7685e1910b66f60e914ccfc4d8001fb) * Change o2/plasma ratio in TEG guidebook (#27763) (cherry picked from commit bc53a46a7392ae0bc3911634c19225610c459a8f) * Add ActionPerformedEvent, ActionsSystem.SetIfBiggerCooldown, action id to action events and BackgroundOn field (#27682) * Add ActionPerformedEvent and ActionsSystem.SetIfBiggerCooldown * Add action id to action events and backgroundon field to action component (cherry picked from commit 9741fda672e27bc68ebed87bdaf7f23adda6f7c1) * Fix votes using an audio entity (#27871) * Fix votes using an audio entity Just retains a source around and uses that. I think the audio limit is like 256 sources on the lower end so this is like whatever to persist. * Restart * weh (cherry picked from commit 5578bcc6f861a2211e9f2678d4132ae50f2a303d) * Fix ninja suit suit storage and other armor missing their suit storage (#27897) b (cherry picked from commit 9845d8bd30008230d49b47dd51a3c7bbf2c9de2e) * Adds Support for Guidebook Buttons in UIs (#27891) * Adds Support for Guidebook Buttons in UIs * read it from the component * the code is perfect * moony review --------- Co-authored-by: ike709 (cherry picked from commit af4c6373f68360ff56d6b9695b1323b3b00fe28b) * Automatic changelog update (cherry picked from commit c81c1c1f1e80bb8992132ba5adc4e551980ff9ad) * Make FTL constants in ShuttleSystem into cvars (#27706) * Make FTL constants in ShuttleSystem into cvars * Fix tests (cherry picked from commit eed560bf3ee8402c5ad150b1246dea6a943cfe19) * Fix const data field in BlindableComponent (#27919) * Fix const data field in BlindableComponent * Fix usages (cherry picked from commit 7524fb93b68bd610df108d1f19d40730f8b3f744) * Fix collection modified error when locking storage (#27913) (cherry picked from commit 1db48b86d1355cc2653989d2eaf5d7b179fa76af) * Fix shuttle cvars comments (#27923) * Fix shuttle cvars comments * Add another line to ftl mass limit (cherry picked from commit 9a04170e8667052716a73acffbb4a1c33d6273d5) * Fix security jumpsuit sprite's asymmetry (#27925) * inital * Update meta.json (cherry picked from commit 9ee42e11389e9d006588c67edd66e1bb2d526cab) * Do not wake up NPC if there is still a mind attached. (#27651) * Do not wake up NPC if there is still a mind attached. This became apparent with diona nymphs (?) and slime gyras (?). This caused players that disconnected while a nymph, gyras or other npc to resume their NPC behavior. Which I would call unwanted. This fixes that. * Zombies become AI anyway * Update Content.Server/NPC/Systems/NPCSystem.cs --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> (cherry picked from commit b860774d7cd7ee2eb03558e9d02e400916953091) * Automatic changelog update (cherry picked from commit 742a1a5fbd3ad24b48c9e7cd92c29e184cdf9288) * Fix ghosts getting spawned in nullspace (#27617) * Add tests for ghost spawn position * Make ghosts spawn immediately * Format mind system * Move ghost spawning to GhostSystem * Spawn ghost on grid or map This fixes the ghosts being attached the parent entity instead of the grid. * Move logging out of the ghost system * Make round start observer spawn using GhostSystem * Move GameTicker ghost spawning to GhostSystem Moved the more robust character name selection code over. Moved the TimeOfDeath code over. Added canReturn logic. * Add overrides and default for ghost spawn coordinates * Add warning log to ghost spawn fail * Clean up test * Dont spawn ghost on map delete * Minor changes to the role test * Fix role test failing to spawn ghost It was failing the map check due to using Nullspace * Fix ghost tests when running in parallel Not sure what happened, but it seems to be because they were running simultaneously and overwriting values. * Clean up ghost tests * Test that map deletion does not spawn ghosts * Spawn ghost on the next available map * Disallow spawning on deleted maps * Fix map deletion ghost test * Cleanup (cherry picked from commit a985c5e83ead6098783ed2129eed516dbd619586) * revenant can no longer harvest souls while in solid objects (#27612) meow (cherry picked from commit 4e26be8617d309c49e7127892d0f0cdc56a468b0) * Automatic changelog update (cherry picked from commit 1698e1cfab6ab1bdb7de00ba9e1c6f1bc8f4563f) * Automatic changelog update (cherry picked from commit 73c142064830f1028c42ac619296d092a6603b85) * fixes * Embed a few more Cryogenics chems in Guidebook (#27935) (cherry picked from commit 829e12d26323a55d94639a213299d65ca716fa9d) * Add an admin smite for making people slip really far (and localize the admin smites better) (#27246) * Sliiiiiiiiiiiiiiiiiip * what * Localize! * antiterminate (cherry picked from commit cf148288a07809249b5569f8d77892284e634b7b) * Resolve all non-obsoleting warnings in content (#27934) * Resolve all non-obsoleting warnings in content * Update ClientGameTicker.cs * Update SkeletonAccentSystem.cs * Update BwoinkSystem.cs (cherry picked from commit 1596e04d0f320ce5cc13296a53fbda868d2047a8) * Replace AttachToGridOrMap with DropNextTo (#27950) (cherry picked from commit 8938e1d8b25d903355a9e058bbb12904a270ae06) * Resolve `'TransformComponent.MapPosition' is obsolete` in content (#27939) * Resolve `'TransformComponent.MapPosition' is obsolete: 'Use TransformSystem.GetMapCoordinates'` in content * build? (cherry picked from commit 855234aa309b0329e1435466b09b85448fa31178) * Prevent admin-frozen players from ghosting or suiciding, add "Freeze And Mute" verb (#27813) * prevent admin-frozen players from ghosting or suiciding * Add "Freeze and Mute" admin verb * Allow "Freeze And Mute" admin verb when player is already frozen but not muted * Remove redundant scream handler (scream action just emotes, duh) * AdminFrozenSystem: clean imports * Update Content.Server/Chat/Commands/SuicideCommand.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Update Ghost.cs * retrigger ci (empty commit) --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit 37099e481e3341bcf82939a677ef5c0df458abbb) * Automatic changelog update (cherry picked from commit 17e0a7f56c4791b7d8443240826db811aafd2c13) * Add live templates for networked data field, networked component and auto state component (#27906) * Add live templates for networked data field, networked component and auto state component * Fix field access * Fix readonly (cherry picked from commit ed7075942d827100408429cd0e1bc4d9bbacfc5d) * Record deletion (#27883) * Allow for Station Records interface for aghosts to delete records * Fix record consoles not working when there are more than 2 crew members. HOW DID NOONE NOTICE THIS SOONER??? * Stop being unconventional (cherry picked from commit c8b55e5e449fc4f43206c3a6a5a84ef53023cd18) * Automatic changelog update (cherry picked from commit cfee7e3fdceccf4808d49ce305ed105e62766491) * Fix borg UI regenerating every tick (#27956) * Fix UI elements being recreated when they didn't need to be * Fix up comparison (cherry picked from commit 9c3dab0be3fa2ecc66a21b471e5e78be8fcf43d0) * Automatic changelog update (cherry picked from commit c325ca8566f1032f24be7140e9bf94f04d740200) * Open slot storage keybind can now also close the UI (#27962) (cherry picked from commit d6e2cc0a8b1d93ffdfa184a694183ea7c8b7a1e4) * Automatic changelog update (cherry picked from commit efc430f651192fe0d6e2b7a076eb1ed2ed59192f) * Resolve `'EntitySystem.Get()' is obsolete` in content (#27936) * PROJECT 0 WARNINGS: Resolve `'EntitySystem.Get()' is obsolete` in content * pass entman * dog ass test * webeditor (cherry picked from commit 993eef1e7c22b2b79e528967ef5bb669f50236b1) * fix weird behavior with storage HUD buttons (#27961) (cherry picked from commit 03af7fcdc1bc28b6eef46877b5eae1cde2c2cf2f) * Implement Equals for ApcBoundInterfaceState (#27965) * Implement Equals for ApcBoundInterfaceState Saves a lot on bandwidth. Also made it round to the nearest 5. * Also this (cherry picked from commit ce0a175c731bf205f59cb93dcb3a2268c4cedb24) * Change some `EntityQueryEnumerator` to `AllEntityQuery` (#27969) (cherry picked from commit 1f03111ff8affe1554a5fac4d1a49b1cccdf2fbb) * Fix skirts femalemask (#27984) Fix skirts (cherry picked from commit 74020abc91af0242a2bd47b195fba8bac301daab) * Automatic changelog update (cherry picked from commit 1a9766bd67dc390193cd81319b9d218e073ad259) * Revert "Stop Toilets crushing you into walls" (#27994) Revert "Stop Toilets crushing you into walls (#27778)" This reverts commit 24e227660a34e33966f5b9bd7a5f69c775c9669b. (cherry picked from commit 950adc8fdecaf89e7ab402ebb5197d0ff8a538dd) * Make failing to fire a gun that requires wielding not delay the next shot (#27973) Make failing to fire a wield-only gun not delay the next shot (cherry picked from commit f22e5404aaf3903213ce53df6e674f35c53b057a) * Automatic changelog update (cherry picked from commit 0edc9218d655758f739d92f513b39fd8026e7ce2) * Fix incorrect message displaying when trying to remove stuck item from someones hand. (#28024) * Fix * Fixed the other spot! (cherry picked from commit 550a3afc52035e19e659b01624956c6751d290e1) * Make hotplate and grill anchorable on table (#28026) Make hotplate and grill anchorable (cherry picked from commit 26747be232c364abcb4e43fb934c85ef0e3e1264) * Renamed old snake_case IDs to PascalCase IDs (#28014) * Renamed soda_dispenser to SodaDispenser * oops, wrong time * oops * guidebook * chem_master (cherry picked from commit 9e8920c9aacc5f7aa19848ef36ae9ad3ce1c6364) * Automatic changelog update (cherry picked from commit 3d2f3c174b4fb7b9cf07898ba3a5ff4af82fe5ed) * Replace Chef Ship Helmet (#28036) Replace Chef Ship EVA Helm (cherry picked from commit f1260dae00b15a0c351d55b6db6fd162293b4e48) * Fix salvage magnet UI opening again when activating the console twice (#28010) (cherry picked from commit 9ea06f3a39a80a250a59396431576fe1bc1ac6dd) * Automatic changelog update (cherry picked from commit 13ba3fc4da08a13de0314884487a749faa4c88a3) * Makes bullet casings destructible by explosions (#27910) makes casings destructible (cherry picked from commit 3243afbb035ec673737095b878ee753bbbf6f252) * Fix the client not passing the weapon to can attack checks (#28040) (cherry picked from commit c94751f2d2c0d3951d1252d2c3955b01cedb543e) * biome flexibility changes (#28017) make biome apply template on mapinit, add api for setting Enabled Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit e37f95c24c447e568e3d6a6c33f1ba587c4a9495) * Fix Shuttle Roles spawning without PDAs and Headsets (#28045) * Move to starting gear, define a bunch of stuff * Spacing (cherry picked from commit 2be42871937748a6d4d78081a7c8631213d4eb96) * Automatic changelog update (cherry picked from commit 6fd5015940697ae78c3defb441222c5a7314cfdd) * Disposal unit recharging state fix (#28059) (cherry picked from commit 9b5dd1fab209dcb9508d6c2c93eaa5ba74ed9be8) * Remove The Throngler from Grand Lottery (#28060) Peace and Quiet (cherry picked from commit f3910d34107761f1d5cd7e993e08124796cfaa49) * Automatic changelog update (cherry picked from commit 91afb12993a25f53d639332b79a20aaf99ad021f) * Move most rotting code to shared (#28050) * Move most rotting code to shared * Remove unused dependency (cherry picked from commit e53f225a39a266cb8c0648640ce53592d6ad58a8) * Fix sandbox check failure when compiling with latest .NET SDK. (#28077) Roslyn now compiles char + string with string.Concat(ROS). This means doing ref char -> ROS which is not sandbox safe. Actually fixing this in the sandboxer is difficult so I'm gonna just pass on that for now. (cherry picked from commit b35dc427e114854e2312230ce96e4b6629ffe647) * Make some CCVars server-change only (#28079) * | CVar.SERVER * Ooh ee ooh aah aah ting tang walla walla bing bang (cherry picked from commit 893b60dba9f2a704560af576f5bd6185df7ac7e8) * fix ninja hacking not affecting sechud (#28021) minor refactor and fix Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit b453b9414810ed927228eb563c6b1c491532c5e3) * Automatic changelog update (cherry picked from commit 0a9ac37fcc511202adc2fefbcd3df0f105458123) * fixes * Fix under-selecting antags (#28327) Fix under selecting antags (cherry picked from commit 217d081b29f7c15dccfa43d43d5f83121b75370b) * fixes --------- Co-authored-by: PJBot Co-authored-by: Vasilis Co-authored-by: Lamrr <96937466+Lamrr@users.noreply.github.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Tayrtahn Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: Hanz <41141796+hanzdegloker@users.noreply.github.com> Co-authored-by: Jay <67732946+duskyjay@users.noreply.github.com> Co-authored-by: Just-a-Unity-Dev <67359748+Just-a-Unity-Dev@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: Ed <96445749+theshued@users.noreply.github.com> Co-authored-by: Tyzemol <85772526+Tyzemol@users.noreply.github.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: RumiTiger <154005209+RumiTiger@users.noreply.github.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Verm <32827189+vermidia@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Co-authored-by: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Co-authored-by: T-Stalker <43253663+DogZeroX@users.noreply.github.com> Co-authored-by: exincore Co-authored-by: 0x6273 <0x40@keemail.me> Co-authored-by: Kara Co-authored-by: Ygg01 Co-authored-by: ElectroJr Co-authored-by: Jezithyr Co-authored-by: ShadowCommander Co-authored-by: Łukasz Mędrek Co-authored-by: Hannah Giovanna Dawson Co-authored-by: TurboTracker <130304754+TurboTrackerss14@users.noreply.github.com> Co-authored-by: OnsenCapy <101037138+LGRuthes@users.noreply.github.com> Co-authored-by: pigeonpeas <147350443+pigeonpeas@users.noreply.github.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: Hobbitmax <91288081+Hobbitmax@users.noreply.github.com> Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: Rio <110139251+Riolume@users.noreply.github.com> Co-authored-by: vorkathbruh <152932728+vorkathbruh@users.noreply.github.com> Co-authored-by: Sphiral <145869023+SphiraI@users.noreply.github.com> Co-authored-by: PrPleGoo Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Co-authored-by: username <113782077+whateverusername0@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+boaz1111@users.noreply.github.com> Co-authored-by: Джексон Миссиссиппи Co-authored-by: RiceMar1244 <138547931+ricemar1244@users.noreply.github.com> Co-authored-by: Doctor-Cpu <77215380+Doctor-Cpu@users.noreply.github.com> Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com> Co-authored-by: MisterMecky Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Co-authored-by: ike709 Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> Co-authored-by: no <165581243+pissdemon@users.noreply.github.com> Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Co-authored-by: Tunguso4ka <71643624+Tunguso4ka@users.noreply.github.com> Co-authored-by: Nairod <110078045+Nairodian@users.noreply.github.com> Co-authored-by: Dexler <69513582+DexlerXD@users.noreply.github.com> Co-authored-by: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com> --- .editorconfig | 1 + Content.Benchmarks/MapLoadBenchmark.cs | 4 +- Content.Client/Access/IdCardSystem.cs | 4 +- .../UI/AgentIDCardBoundUserInterface.cs | 6 +- .../Access/UI/AgentIDCardWindow.xaml.cs | 6 +- Content.Client/Actions/ActionsSystem.cs | 3 + .../Components/HeadstandComponent.cs | 2 +- .../Components/KillSignComponent.cs | 5 +- .../Managers/ClientAdminManager.cs | 7 +- .../Systems/AdminFrozenSystem.cs | 7 + .../Administration/Systems/AdminVerbSystem.cs | 23 + .../SpawnExplosionWindow.xaml.cs | 6 +- .../Animations/TrackUserComponent.cs | 17 + .../Jukebox/JukeboxBoundUserInterface.cs | 1 - Content.Client/Audio/Jukebox/JukeboxSystem.cs | 14 +- .../Changelog/ChangelogWindow.xaml.cs | 2 - .../Components/SolutionItemStatusComponent.cs | 22 + .../EntitySystems/SolutionItemStatusSystem.cs | 22 + .../Chemistry/UI/InjectorStatusControl.cs | 2 +- .../UI/ReagentDispenserBoundUserInterface.cs | 2 + .../Chemistry/UI/SolutionStatusControl.cs | 59 + .../Clothing/ClientClothingSystem.cs | 27 +- .../Systems/CriminalRecordsConsoleSystem.cs | 4 +- .../Systems/CriminalRecordsHackerSystem.cs | 5 + .../Systems/CriminalRecordsSystem.cs | 5 + Content.Client/Decals/ToggleDecalCommand.cs | 4 +- .../Decals/UI/DecalPlacerWindow.xaml.cs | 3 +- Content.Client/DeviceNetwork/JammerSystem.cs | 8 + .../Disposal/Systems/DisposalUnitSystem.cs | 2 +- Content.Client/DoAfter/DoAfterOverlay.cs | 12 +- Content.Client/DoAfter/DoAfterSystem.cs | 4 +- .../Extinguisher/FireExtinguisherComponent.cs | 6 +- Content.Client/Eye/EyeLerpingSystem.cs | 2 +- Content.Client/Fax/System/FaxVisualsSystem.cs | 48 + Content.Client/Fax/UI/FaxBoundUi.cs | 23 +- .../GPS/UI/HandheldGpsStatusControl.cs | 5 +- .../Commands/ShowManifestCommand.cs | 8 - .../GameTicking/Managers/ClientGameTicker.cs | 52 +- .../Controls/GuideReagentEmbed.xaml.cs | 3 +- Content.Client/Guidebook/GuideEntry.cs | 2 +- Content.Client/Guidebook/GuidebookSystem.cs | 5 + .../UI/HealthAnalyzerWindow.xaml.cs | 4 +- .../Humanoid/HumanoidAppearanceSystem.cs | 5 +- .../Implants/UI/ImplanterStatusControl.cs | 16 +- Content.Client/Input/ContentContexts.cs | 1 + .../Inventory/ClientInventorySystem.cs | 3 +- .../Inventory/StrippableBoundUserInterface.cs | 4 +- .../Items/UI/PollingItemStatusControl.cs | 28 + .../Labels/EntitySystems/HandLabelerSystem.cs | 18 + .../UI/HandLabelerBoundUserInterface.cs | 29 +- .../Labels/UI/HandLabelerWindow.xaml.cs | 29 +- .../EntitySystems/ExpendableLightSystem.cs | 2 +- .../MagicMirrorBoundUserInterface.cs | 3 - .../MagicMirror/MagicMirrorSystem.cs | 8 + Content.Client/Mech/Ui/MechMenu.xaml.cs | 14 +- .../MouseRotator/MouseRotatorSystem.cs | 5 +- .../NetworkConfiguratorBoundUserInterface.cs | 1 + .../Systems/NetworkConfiguratorSystem.cs | 4 +- .../NodeContainer/NodeVisCommand.cs | 8 +- .../Options/UI/Tabs/GraphicsTab.xaml | 3 + .../Options/UI/Tabs/GraphicsTab.xaml.cs | 12 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 + .../Overlays/ShowCriminalRecordIconsSystem.cs | 28 + .../Overlays/ShowHungerIconsSystem.cs | 43 +- Content.Client/Overlays/ShowJobIconsSystem.cs | 60 + .../Overlays/ShowMindShieldIconsSystem.cs | 28 + .../Overlays/ShowSecurityIconsSystem.cs | 91 - .../Overlays/ShowSyndicateIconsSystem.cs | 26 +- .../Overlays/ShowThirstIconsSystem.cs | 43 +- Content.Client/PDA/PdaBoundUserInterface.cs | 7 +- Content.Client/Paper/PaperComponent.cs | 7 +- Content.Client/Pinpointer/NavMapSystem.cs | 29 +- Content.Client/Pinpointer/UI/NavMapControl.cs | 297 +- Content.Client/Popups/PopupSystem.cs | 18 + .../Power/ActivatableUIRequiresPowerSystem.cs | 21 + .../PowerMonitoringConsoleNavMapControl.cs | 70 +- .../UI/HumanoidProfileEditor.xaml.cs | 1 - Content.Client/RCD/AlignRCDConstruction.cs | 13 +- Content.Client/RCD/RCDMenu.xaml.cs | 10 +- .../Overlays/RadiationPulseOverlay.cs | 9 +- .../ReplaySpectatorSystem.Position.cs | 9 +- .../Robotics/Systems/RoboticsConsoleSystem.cs | 7 + .../UI/RoboticsConsoleBoundUserInterface.cs | 50 + .../Robotics/UI/RoboticsConsoleWindow.xaml | 40 + .../Robotics/UI/RoboticsConsoleWindow.xaml.cs | 147 + .../RoundEnd/RoundEndSummaryUIController.cs | 51 + .../RoundEnd/RoundEndSummaryWindow.cs | 1 - .../UI/SalvageMagnetBoundUserInterface.cs | 23 +- .../Shuttles/UI/BaseShuttleControl.xaml.cs | 2 +- Content.Client/Shuttles/UI/DockObject.xaml.cs | 4 + .../Silicons/Borgs/BorgMenu.xaml.cs | 19 +- .../Laws/Ui/SiliconLawBoundUserInterface.cs | 21 +- Content.Client/Sprite/SpriteFadeSystem.cs | 4 +- .../Station/StationSpawningSystem.cs | 5 +- .../StationRecords/GeneralRecord.xaml | 13 + .../StationRecords/GeneralRecord.xaml.cs | 33 + ...lStationRecordConsoleBoundUserInterface.cs | 1 + .../GeneralStationRecordConsoleWindow.xaml | 2 +- .../GeneralStationRecordConsoleWindow.xaml.cs | 101 +- .../Storage/StorageBoundUserInterface.cs | 19 +- .../Storage/Systems/StorageSystem.cs | 4 +- Content.Client/Strip/StrippableSystem.cs | 2 +- Content.Client/Stylesheets/StyleBase.cs | 1 + Content.Client/Stylesheets/StyleNano.cs | 23 + Content.Client/Tabletop/TabletopSystem.cs | 5 +- Content.Client/Tips/TippyUI.xaml | 11 + Content.Client/Tips/TippyUI.xaml.cs | 54 + Content.Client/Tips/TippyUIController.cs | 241 + .../Tools/Components/WelderComponent.cs | 18 - Content.Client/Tools/ToolSystem.cs | 20 +- .../Tools/UI/WelderStatusControl.cs | 59 +- .../UserInterface/Controls/ClipControl.cs | 55 + .../UserInterface/Controls/FancyWindow.xaml | 1 + .../Controls/FancyWindow.xaml.cs | 27 + .../UserInterface/Controls/MainViewport.cs | 7 +- .../UserInterface/Controls/SlotButton.cs | 1 + .../UserInterface/Controls/SlotControl.cs | 33 +- .../Systems/Actions/ActionUIController.cs | 114 +- .../Systems/Actions/Controls/ActionButton.cs | 43 +- .../Systems/Alerts/Controls/AlertControl.cs | 4 +- .../Systems/Alerts/Widgets/AlertsUI.xaml.cs | 3 +- .../Systems/Chat/ChatUIController.cs | 6 +- .../Systems/Hands/Controls/HandButton.cs | 3 + .../Systems/Hands/HandsUIController.cs | 93 +- .../Systems/Hotbar/HotbarUIController.cs | 2 +- .../Systems/Hotbar/Widgets/HotbarGui.xaml | 36 +- .../Systems/Hotbar/Widgets/HotbarGui.xaml.cs | 34 +- .../Inventory/Controls/ItemStatusPanel.xaml | 33 +- .../Controls/ItemStatusPanel.xaml.cs | 92 +- .../Inventory/InventoryUIController.cs | 6 +- .../Systems/Storage/StorageUIController.cs | 2 +- .../Systems/Viewport/ViewportUIController.cs | 9 +- .../Verbs/UI/VerbMenuUIController.cs | 25 +- Content.Client/Verbs/VerbSystem.cs | 21 +- Content.Client/Viewport/ScalingViewport.cs | 47 +- Content.Client/Voting/VoteManager.cs | 22 +- .../Components/WeaponArcVisualsComponent.cs | 2 + .../Weapons/Melee/MeleeArcOverlay.cs | 6 +- .../Weapons/Melee/MeleeSpreadCommand.cs | 3 +- .../Melee/MeleeWeaponSystem.Effects.cs | 36 +- .../Weapons/Melee/MeleeWeaponSystem.cs | 10 +- .../Weapons/Ranged/GunSpreadOverlay.cs | 6 +- .../Weapons/Ranged/ItemStatus/BulletRender.cs | 252 + .../Ranged/Systems/GunSystem.AmmoCounter.cs | 265 +- .../Weapons/Ranged/Systems/GunSystem.cs | 68 +- .../Ui/AnalysisConsoleBoundUserInterface.cs | 10 +- .../Ui/AnalysisConsoleMenu.xaml | 48 +- .../Ui/AnalysisConsoleMenu.xaml.cs | 53 +- .../UI/PolymorphableCanisterBUI.cs | 2 +- Content.IntegrationTests/Pair/TestMapData.cs | 7 +- .../Pair/TestPair.Helpers.cs | 56 +- .../Pair/TestPair.Recycle.cs | 3 +- .../Pair/TestPair.Timing.cs | 19 +- Content.IntegrationTests/PoolManager.Cvars.cs | 2 + Content.IntegrationTests/PoolManager.cs | 4 +- .../Tests/Administration/Logs/AddTests.cs | 4 +- .../Tests/Commands/RestartRoundTest.cs | 4 +- .../Tests/Damageable/DamageableTest.cs | 9 + .../DestructibleTestPrototypes.cs | 8 + .../Tests/DeviceNetwork/DeviceNetworkTest.cs | 2 +- .../Tests/DoAfter/DoAfterCancellationTests.cs | 2 - .../Tests/Doors/AirlockTest.cs | 2 +- Content.IntegrationTests/Tests/EntityTest.cs | 27 +- .../Tests/Fluids/PuddleTest.cs | 5 +- .../Tests/GameRules/AntagPreferenceTest.cs | 76 + .../Tests/GameRules/FailAndStartPresetTest.cs | 152 + .../Tests/GameRules/NukeOpsTest.cs | 207 + .../Tests/GameRules/RuleMaxTimeRestartTest.cs | 10 + .../Tests/GameRules/SecretStartsTest.cs | 6 +- .../Tests/Hands/HandTests.cs | 4 +- .../Click/InteractionSystemTests.cs | 1 - .../Tests/Interaction/InRangeUnobstructed.cs | 4 +- .../InteractionTest.EntitySpecifier.cs | 25 +- ...teractionTest.EntitySpecifierCollection.cs | 14 +- .../Interaction/InteractionTest.Helpers.cs | 18 +- .../Tests/Interaction/InteractionTest.cs | 3 +- .../Tests/Interaction/MovementTest.cs | 2 +- .../Tests/Linter/StaticFieldValidationTest.cs | 150 + .../Tests/Mapping/MappingTests.cs | 102 + .../Tests/MaterialArbitrageTest.cs | 58 +- .../Tests/PostMapInitTest.cs | 34 +- .../Tests/Power/PowerTest.cs | 4 +- .../Tests/PrototypeSaveTest.cs | 22 +- .../Tests/ResettingEntitySystemTests.cs | 3 - .../Tests/RoundEndTest.cs | 10 +- .../Tests/Shuttle/DockTest.cs | 4 +- .../Tests/Station/EvacShuttleTest.cs | 127 + Content.IntegrationTests/Tests/StorageTest.cs | 57 +- .../Tests/Tiles/TileConstructionTests.cs | 4 +- .../Tests/Utility/EntityWhitelistTest.cs | 27 +- .../Components/IdExaminableComponent.cs | 8 - .../Access/Systems/AccessOverriderSystem.cs | 25 +- .../Access/Systems/AgentIDCardSystem.cs | 8 +- .../Access/Systems/IdCardConsoleSystem.cs | 6 +- Content.Server/Access/Systems/IdCardSystem.cs | 162 - .../Access/Systems/PresetIdCardSystem.cs | 4 +- .../Actions/ActionOnInteractSystem.cs | 9 +- .../Administration/Commands/DSay.cs | 4 +- .../Commands/ExplosionCommand.cs | 3 +- .../Administration/Commands/ReadyAll.cs | 4 +- .../Commands/ShuttleCommands.cs | 10 +- .../Commands/ThrowScoreboardCommand.cs | 4 +- .../Components/HeadstandComponent.cs | 2 +- .../Components/KillSignComponent.cs | 5 +- .../Administration/Logs/AdminLogsEui.cs | 3 +- Content.Server/Administration/ServerApi.cs | 1 + .../Systems/AdminFrozenSystem.cs | 16 + .../Systems/AdminVerbSystem.Antags.cs | 95 +- .../Systems/AdminVerbSystem.Smites.cs | 106 +- .../Administration/Systems/AdminVerbSystem.cs | 66 +- .../Administration/Systems/BwoinkSystem.cs | 7 +- .../Administration/UI/SpawnExplosionEui.cs | 2 +- .../EntitySystems/SpeakOnUIClosedSystem.cs | 1 + Content.Server/Alert/Commands/ClearAlert.cs | 6 +- Content.Server/Alert/Commands/ShowAlert.cs | 6 +- Content.Server/AlertLevel/AlertLevelSystem.cs | 10 + .../Ame/EntitySystems/AmeControllerSystem.cs | 8 +- .../Anomaly/AnomalySystem.Generator.cs | 2 +- .../Anomaly/AnomalySystem.Scanner.cs | 7 +- Content.Server/Anomaly/AnomalySystem.cs | 3 - .../Effects/ElectricityAnomalySystem.cs | 2 +- .../Anomaly/Effects/InjectionAnomalySystem.cs | 4 +- .../Antag/AntagSelectionPlayerPool.cs | 27 + .../Antag/AntagSelectionSystem.API.cs | 328 + Content.Server/Antag/AntagSelectionSystem.cs | 702 +- .../Components/AntagSelectionComponent.cs | 192 + .../GhostRoleAntagSpawnerComponent.cs | 14 + .../Mimic/MobReplacementRuleComponent.cs | 2 +- .../Antag/MobReplacementRuleSystem.cs | 1 + .../Arcade/BlockGame/BlockGame.Ui.cs | 68 +- Content.Server/Arcade/BlockGame/BlockGame.cs | 6 +- .../BlockGame/BlockGameArcadeComponent.cs | 4 +- .../Arcade/BlockGame/BlockGameArcadeSystem.cs | 43 +- .../SpaceVillainArcadeSystem.cs | 12 +- .../SpaceVillainGame/SpaceVillainGame.Ui.cs | 3 +- .../Atmos/Commands/ListGasesCommand.cs | 4 +- .../Atmos/Commands/ShowAtmosCommand.cs | 4 +- .../Atmos/Components/AtmosPlaqueComponent.cs | 2 +- .../Atmos/Components/BreathToolComponent.cs | 3 +- .../Components/GasMixtureHolderComponent.cs | 4 +- .../Components/MapAtmosphereComponent.cs | 1 + .../Atmos/EntitySystems/AirFilterSystem.cs | 1 - .../Atmos/EntitySystems/AirtightSystem.cs | 52 +- .../Atmos/EntitySystems/AtmosExposedSystem.cs | 1 + .../EntitySystems/AtmosphereSystem.API.cs | 2 +- .../EntitySystems/AtmosphereSystem.Gases.cs | 1 + .../AtmosphereSystem.GridAtmosphere.cs | 1 + .../EntitySystems/AtmosphereSystem.Hotspot.cs | 1 + .../EntitySystems/AtmosphereSystem.Map.cs | 1 + .../Atmos/EntitySystems/FlammableSystem.cs | 64 +- .../Atmos/EntitySystems/GasAnalyzerSystem.cs | 16 +- .../Atmos/EntitySystems/GasTankSystem.cs | 2 +- .../EntitySystems/GasTileOverlaySystem.cs | 4 +- Content.Server/Atmos/IGasMixtureHolder.cs | 4 +- Content.Server/Atmos/IGasReactionEffect.cs | 3 +- .../Monitor/Components/AirAlarmComponent.cs | 2 - .../Atmos/Monitor/Systems/AirAlarmModes.cs | 4 +- .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 27 +- .../Binary/Components/GasPortComponent.cs | 2 + .../EntitySystems/GasPressurePumpSystem.cs | 34 +- .../EntitySystems/GasVolumePumpSystem.cs | 10 +- .../Components/AtmosPipeColorComponent.cs | 2 +- .../Trinary/EntitySystems/GasFilterSystem.cs | 14 +- .../Trinary/EntitySystems/GasMixerSystem.cs | 12 +- .../Unary/EntitySystems/GasCanisterSystem.cs | 21 +- .../EntitySystems/GasThermoMachineSystem.cs | 8 +- .../Atmos/Portable/PortableScrubberSystem.cs | 1 + .../Atmos/Portable/SpaceHeaterSystem.cs | 2 +- .../Atmos/Reactions/AmmoniaOxygenReaction.cs | 1 + .../Atmos/Reactions/BZProductionReaction.cs | 1 + .../Atmos/Reactions/FrezonCoolantReaction.cs | 1 + .../Reactions/FrezonProductionReaction.cs | 1 + .../Atmos/Reactions/GasReactionPrototype.cs | 14 +- .../HalonOxygenAbsorptionReaction.cs | 1 + .../Reactions/HealiumProductionReaction.cs | 1 + .../Atmos/Reactions/HydrogenFireReaction.cs | 1 + .../HyperNobliumProductionReaction.cs | 1 + .../Reactions/N2ODecompositionReaction.cs | 1 + .../Reactions/NitriumDecompositionReaction.cs | 1 + .../Reactions/NitriumProductionReaction.cs | 1 + .../Atmos/Reactions/PlasmaFireReaction.cs | 1 + .../Reactions/PluoxiumProductionReaction.cs | 1 + .../ProtoNitrateBZaseActionReaction.cs | 1 + .../ProtoNitrateHydrogenConversionReaction.cs | 1 + .../ProtoNitrateProductionReaction.cs | 1 + ...rotoNitrateTritiumDeirradiationReaction.cs | 1 + .../Atmos/Reactions/TritiumFireReaction.cs | 1 + .../Atmos/Reactions/WaterVaporReaction.cs | 2 + .../Reactions/ZaukerDecompositionReaction.cs | 1 + .../Reactions/ZaukerProductionReaction.cs | 1 + Content.Server/Atmos/Rotting/RottingSystem.cs | 107 +- .../TileAtmosCollectionSerializer.cs | 1 + Content.Server/Atmos/TileMixtureEnumerator.cs | 1 + Content.Server/Audio/Jukebox/JukeboxSystem.cs | 8 +- Content.Server/Beam/BeamSystem.cs | 6 +- .../Bed/Cryostorage/CryostorageSystem.cs | 18 +- .../Body/Systems/BloodstreamSystem.cs | 2 +- .../Body/Systems/InternalsSystem.cs | 17 +- Content.Server/Botany/SeedPrototype.cs | 4 +- .../Botany/Systems/PlantHolderSystem.cs | 1 + .../Botany/Systems/SeedAnalyzerSystem.cs | 11 +- .../StationCargoOrderDatabaseComponent.cs | 16 + .../Cargo/Systems/CargoSystem.Bounty.cs | 10 +- .../Cargo/Systems/CargoSystem.Orders.cs | 57 +- .../Cargo/Systems/CargoSystem.Shuttle.cs | 32 +- .../Cargo/Systems/CargoSystem.Telepad.cs | 82 +- Content.Server/Cargo/Systems/PricingSystem.cs | 4 +- .../CartridgeLoader/CartridgeLoaderSystem.cs | 8 +- .../Changeling/ChangelingRuleComponent.cs | 28 +- .../Changeling/ChangelingRuleSystem.cs | 202 +- .../Changeling/ChangelingSystem.Abilities.cs | 32 +- Content.Server/Changeling/ChangelingSystem.cs | 11 + Content.Server/Chat/Commands/LOOCCommand.cs | 4 +- .../Chat/Commands/SuicideCommand.cs | 25 +- .../V2/Commands/DeleteChatMessageCommand.cs | 36 + .../V2/Commands/NukeChatMessagesCommand.cs | 41 + Content.Server/Chat/V2/Messages.cs | 94 + .../Chat/V2/Repository/ChatRepository.cs | 196 + .../Components/ReagentTankComponent.cs | 23 - .../EntitySystems/SolutionContainerSystem.cs | 175 +- .../EntitySystems/ChemMasterSystem.cs | 36 +- .../EntitySystems/HypospraySystem.cs | 1 - .../Chemistry/EntitySystems/InjectorSystem.cs | 10 +- .../EntitySystems/ReactionMixerSystem.cs | 2 +- .../EntitySystems/ReagentDispenserSystem.cs | 2 +- .../TransformableContainerSystem.cs | 2 +- .../Chemistry/EntitySystems/VaporSystem.cs | 2 +- .../ReactionEffects/AreaReactionEffect.cs | 10 +- .../CreateEntityReactionEffect.cs | 2 +- .../ReactionEffects/EmpReactionEffect.cs | 6 +- .../ExplosionReactionEffect.cs | 3 +- .../HasTagCondition.cs | 2 +- .../ReagentEffectConditions/OrganType.cs | 4 +- .../ReagentThreshold.cs | 4 +- .../Chemistry/ReagentEffects/AdjustReagent.cs | 4 +- ...nBoodstream.cs => ChemCleanBloodstream.cs} | 2 +- .../ReagentEffects/ExtinguishReaction.cs | 2 +- .../Chemistry/ReagentEffects/HealthChange.cs | 4 +- .../Chemistry/ReagentEffects/Ignite.cs | 2 +- .../ReagentEffects/ModifyBleedAmount.cs | 2 +- .../ReagentEffects/ModifyBloodLevel.cs | 2 +- .../ReagentEffects/MovespeedModifier.cs | 2 +- .../Chemistry/ReagentEffects/Oxygenate.cs | 2 +- .../Chemistry/ReagentEffects/Paralyze.cs | 2 +- .../Chemistry/ReagentEffects/ReduceRotting.cs | 31 + .../Chemistry/ReagentEffects/SatiateThirst.cs | 2 +- .../ReagentEffects/WashCreamPieReaction.cs | 2 +- .../TileReactions/CleanDecalsReaction.cs | 15 +- .../TileReactions/CleanTileReaction.cs | 12 +- .../TileReactions/CreateEntityTileReaction.cs | 12 +- .../TileReactions/ExtinguishTileReaction.cs | 7 +- .../TileReactions/FlammableTileReaction.cs | 7 +- .../TileReactions/PryTileReaction.cs | 7 +- .../SpillIfPuddlePresentTileReaction.cs | 7 +- .../TileReactions/SpillTileReaction.cs | 7 +- .../Cloning/CloningConsoleSystem.cs | 6 +- Content.Server/Cloning/CloningSystem.cs | 2 +- Content.Server/Clothing/MagbootsSystem.cs | 19 +- .../Systems/ChameleonClothingSystem.cs | 2 +- .../CommunicationsConsoleSystem.cs | 48 +- .../Configurable/ConfigurationSystem.cs | 9 +- .../Components/WelderRefinableComponent.cs | 34 +- .../Construction/Conditions/Locked.cs | 5 +- .../Construction/ConstructionSystem.Guided.cs | 12 + .../ConstructionSystem.Initial.cs | 2 +- .../ConstructionSystem.Interactions.cs | 4 +- Content.Server/Construction/RefiningSystem.cs | 7 +- .../ThrowInsertContainerComponent.cs | 35 + .../Containers/ThrowInsertContainerSystem.cs | 41 + Content.Server/Content.Server.csproj | 2 +- Content.Server/Crayon/CrayonSystem.cs | 15 +- .../CrewManifest/CrewManifestSystem.cs | 10 +- .../Systems/CriminalRecordsConsoleSystem.cs | 48 +- .../Systems/CriminalRecordsHackerSystem.cs | 63 + .../Systems/CriminalRecordsSystem.cs | 33 +- .../Systems/DamageOnToolInteractSystem.cs | 2 - Content.Server/Database/ServerDbBase.cs | 40 +- Content.Server/Database/ServerDbManager.cs | 32 +- Content.Server/Database/ServerDbPostgres.cs | 14 +- Content.Server/Database/ServerDbSqlite.cs | 20 +- Content.Server/Database/UserDbDataManager.cs | 64 +- Content.Server/Decals/DecalSystem.cs | 2 +- .../Thresholds/Behaviors/BurnBodyBehavior.cs | 10 +- .../Thresholds/Behaviors/EjectVendorItems.cs | 2 +- .../Thresholds/Behaviors/OpenBehavior.cs | 2 +- .../Behaviors/SpawnEntitiesBehavior.cs | 7 +- .../Thresholds/Behaviors/SpawnGasBehavior.cs | 1 + .../Thresholds/Behaviors/SpillBehavior.cs | 4 +- .../Systems/SignalTimerSystem.cs | 12 +- .../Systems/NetworkConfiguratorSystem.cs | 70 +- .../Disposal/Mailing/MailingUnitSystem.cs | 6 +- .../Disposal/Tube/DisposalTubeSystem.cs | 18 +- .../Components/DisposalHolderComponent.cs | 1 + .../Unit/EntitySystems/DisposalUnitSystem.cs | 47 +- .../Systems/DoorElectronicsSystem.cs | 2 +- Content.Server/Dragon/DragonSystem.cs | 2 +- Content.Server/Emp/EmpSystem.cs | 4 +- Content.Server/Entry/IgnoredComponents.cs | 3 +- .../Components/ExplosiveComponent.cs | 7 + .../Components/RepeatingTriggerComponent.cs | 25 + .../EntitySystems/ExplosionSystem.CVars.cs | 4 +- .../ExplosionSystem.Processing.cs | 6 +- .../EntitySystems/ExplosionSystem.cs | 2 +- .../EntitySystems/SmokeOnTriggerSystem.cs | 7 +- .../Explosion/EntitySystems/TriggerSystem.cs | 21 + .../Extinguisher/FireExtinguisherComponent.cs | 2 +- .../ActivatableUIRequiresVisionSystem.cs | 22 +- Content.Server/Fax/AdminUI/AdminFaxEui.cs | 3 +- Content.Server/Fax/FaxConstants.cs | 1 + Content.Server/Fax/FaxSystem.cs | 88 +- .../Fluids/EntitySystems/DrainSystem.cs | 32 +- .../EntitySystems/PuddleSystem.Spillable.cs | 23 +- .../Fluids/EntitySystems/PuddleSystem.cs | 2 +- .../Fluids/EntitySystems/SmokeSystem.cs | 2 +- .../Fluids/EntitySystems/SpraySystem.cs | 2 +- .../Systems/ForensicScannerSystem.cs | 21 +- .../GameTicking/Commands/DelayStartCommand.cs | 4 +- .../GameTicking/Commands/EndRoundCommand.cs | 4 +- .../Commands/ForcePresetCommand.cs | 3 +- .../GameTicking/Commands/GoLobbyCommand.cs | 4 +- .../GameTicking/Commands/ObserveCommand.cs | 4 +- .../Commands/RestartRoundCommand.cs | 10 +- .../GameTicking/Commands/StartRoundCommand.cs | 4 +- .../Commands/ToggleReadyCommand.cs | 4 +- .../Components/ActiveGameRuleComponent.cs | 2 +- .../Components/DelayedStartRuleComponent.cs | 16 + .../Components/EndedGameRuleComponent.cs | 2 +- .../Components/GameRuleComponent.cs | 9 +- .../GameTicking/GameTicker.GamePreset.cs | 7 +- .../GameTicking/GameTicker.GameRule.cs | 65 +- .../GameTicking/GameTicker.Player.cs | 23 +- .../GameTicking/GameTicker.RoundFlow.cs | 29 +- Content.Server/GameTicking/GameTicker.cs | 1 + .../Rules/Components/LoadMapRuleComponent.cs | 34 + .../Rules/Components/NinjaRuleComponent.cs | 2 +- .../NukeOperativeSpawnerComponent.cs | 11 +- .../Components/NukeOpsShuttleComponent.cs | 2 + .../Rules/Components/NukeopsRuleComponent.cs | 65 +- .../Rules/Components/PiratesRuleComponent.cs | 24 - .../Components/RevolutionaryRuleComponent.cs | 37 - .../Rules/Components/ThiefRuleComponent.cs | 36 +- .../Rules/Components/TraitorRuleComponent.cs | 26 +- .../Rules/Components/ZombieRuleComponent.cs | 58 - .../GameTicking/Rules/DeathMatchRuleSystem.cs | 28 +- .../Rules/GameRuleSystem.Utility.cs | 54 +- .../GameTicking/Rules/GameRuleSystem.cs | 43 +- .../Rules/InactivityTimeRestartRuleSystem.cs | 1 + .../Rules/KillCalloutRuleSystem.cs | 1 + .../GameTicking/Rules/LoadMapRuleSystem.cs | 108 + .../Rules/MaxTimeRestartRuleSystem.cs | 3 + .../GameTicking/Rules/NukeopsRuleSystem.cs | 852 +- .../GameTicking/Rules/PiratesRuleSystem.cs | 320 - .../GameTicking/Rules/RespawnRuleSystem.cs | 1 + .../Rules/RevolutionaryRuleSystem.cs | 221 +- .../RoundstartStationVariationRuleSystem.cs | 1 + .../GameTicking/Rules/SandboxRuleSystem.cs | 1 + .../GameTicking/Rules/SecretRuleSystem.cs | 151 +- .../GameTicking/Rules/SubGamemodesSystem.cs | 1 + .../GameTicking/Rules/ThiefRuleSystem.cs | 96 +- .../GameTicking/Rules/TraitorRuleSystem.cs | 251 +- .../GameTicking/Rules/ZombieRuleSystem.cs | 213 +- .../Gateway/Systems/GatewaySystem.cs | 8 +- Content.Server/Gatherable/GatherableSystem.cs | 4 +- Content.Server/Geras/GerasComponent.cs | 18 + Content.Server/Geras/GerasSystem.cs | 51 + Content.Server/Ghost/Ghost.cs | 21 +- Content.Server/Ghost/GhostSystem.cs | 13 +- .../Roles/Components/GhostRoleComponent.cs | 6 +- .../GhostRoleMobSpawnerComponent.cs | 16 +- Content.Server/Ghost/Roles/GhostRoleSystem.cs | 81 +- .../Ghost/Roles/UI/GhostRolesEui.cs | 4 +- .../Gravity/GravityGeneratorSystem.cs | 22 +- .../GridPreloader/GridPreloaderComponent.cs | 16 + .../GridPreloader/GridPreloaderSystem.cs | 147 + Content.Server/Guardian/GuardianSystem.cs | 2 +- Content.Server/Hands/Systems/HandsSystem.cs | 6 +- .../HumanoidAppearanceSystem.Modifier.cs | 14 +- .../IdentityManagement/IdentitySystem.cs | 2 +- .../ImmovableRod/ImmovableRodSystem.cs | 19 +- .../Instruments/InstrumentComponent.cs | 5 +- .../Instruments/InstrumentSystem.cs | 35 +- .../Interaction/InteractionSystem.cs | 27 +- .../Inventory/ServerInventorySystem.cs | 17 - .../Kitchen/EntitySystems/MicrowaveSystem.cs | 11 +- .../EntitySystems/ReagentGrinderSystem.cs | 6 +- .../Kitchen/EntitySystems/SharpSystem.cs | 4 +- .../Labels/Label/HandLabelerSystem.cs | 114 +- Content.Server/Labels/Label/LabelSystem.cs | 2 +- Content.Server/Lathe/LatheSystem.cs | 14 +- .../Components/EmergencyLightComponent.cs | 2 +- .../EntitySystems/EmergencyLightSystem.cs | 100 +- .../UnpoweredFlashlightSystem.cs | 113 - .../Light/Events/LightToggleEvent.cs | 12 - Content.Server/Lightning/LightningSystem.cs | 4 +- .../Lightning/LightningTargetSystem.cs | 4 +- .../ActivatableUIRequiresLockSystem.cs | 1 + .../MagicMirror/MagicMirrorSystem.cs | 100 +- Content.Server/Mapping/MappingCommand.cs | 61 +- .../Maps/Conditions/HolidayMapCondition.cs | 2 +- .../MassMedia/Systems/NewsSystem.cs | 22 +- .../Mech/Components/MechAirComponent.cs | 1 + Content.Server/Mech/Systems/MechSystem.cs | 5 +- .../CrewMonitoringConsoleSystem.cs | 4 +- Content.Server/Medical/CryoPodSystem.cs | 8 +- .../Medical/HealthAnalyzerSystem.cs | 10 +- .../Medical/Stethoscope/StethoscopeSystem.cs | 21 +- .../Medical/SuitSensors/SuitSensorSystem.cs | 18 +- .../HTN/Preconditions/GunAmmoPrecondition.cs | 2 +- .../Preconditions/KeyNotExistsPrecondition.cs | 12 + .../Math/KeyBoolEqualsPrecondition.cs | 23 + .../Math/KeyFloatEqualsPrecondition.cs | 18 + .../Math/KeyFloatGreaterPrecondition.cs | 17 + .../Math/KeyFloatLessPrecondition.cs | 17 + .../Operators/Math/AddFloatOperator.cs | 33 + .../Operators/Math/SetBoolOperator.cs | 28 + .../Operators/{ => Math}/SetFloatOperator.cs | 18 +- .../Operators/Math/SetRandomFloatOperator.cs | 34 + .../Operators/PlaySoundOperator.cs | 28 + .../Operators/SayKeyOperator.cs | 36 + .../NPC/Systems/NPCSteeringSystem.cs | 2 +- Content.Server/NPC/Systems/NPCSystem.cs | 6 + .../NPC/Systems/NPCUtilitySystem.cs | 2 +- .../Ninja/Systems/NinjaGlovesSystem.cs | 11 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 28 +- .../Ninja/Systems/SpiderChargeSystem.cs | 5 +- .../NodeContainer/Nodes/PipeNode.cs | 6 +- Content.Server/Nuke/NukeCodePaperSystem.cs | 2 + Content.Server/Nuke/NukeSystem.cs | 14 +- Content.Server/NukeOps/WarDeclaratorSystem.cs | 9 +- .../Nutrition/EntitySystems/FoodSystem.cs | 6 +- .../EntitySystems/SliceableFoodSystem.cs | 22 +- .../EntitySystems/SmokingSystem.Vape.cs | 1 + .../Components/CodeConditionSystem.cs | 17 + .../SpiderChargeConditionComponent.cs | 3 - .../Components/TerrorConditionComponent.cs | 17 - Content.Server/Objectives/ObjectivesSystem.cs | 19 +- .../Objectives/Systems/CodeConditionSystem.cs | 76 + .../Systems/NinjaConditionsSystem.cs | 13 - Content.Server/PAI/PAISystem.cs | 8 +- Content.Server/PDA/PdaSystem.cs | 27 +- Content.Server/PDA/Ringer/RingerSystem.cs | 20 +- Content.Server/Paper/PaperComponent.cs | 2 +- Content.Server/Paper/PaperSystem.cs | 22 +- Content.Server/Parallax/BiomeSystem.cs | 17 +- .../ParticleAcceleratorSystem.ControlBox.cs | 33 +- .../ParticleAcceleratorSystem.Parts.cs | 2 +- .../ParticleAcceleratorLimiterWireAction.cs | 3 +- .../ParticleAcceleratorStrengthWireAction.cs | 3 +- .../ParticleAcceleratorToggleWireAction.cs | 8 +- .../Payload/EntitySystems/PayloadSystem.cs | 4 +- Content.Server/Pinpointer/NavMapSystem.cs | 231 +- Content.Server/Pinpointer/StationMapSystem.cs | 14 +- .../GlobalPlayTimeTrackingManager.cs | 5 + .../IPlayTimeTrackingManager.cs | 3 +- .../PlayTimeTrackingManager.cs | 2 +- .../Pointing/EntitySystems/PointingSystem.cs | 2 +- .../Polymorph/Systems/PolymorphSystem.cs | 2 +- Content.Server/Popups/PopupSystem.cs | 8 + .../Power/Commands/PowerStatCommand.cs | 4 +- .../ActivatableUIRequiresPowerComponent.cs | 8 - .../Power/Components/ChargerComponent.cs | 7 + .../ActivatableUIRequiresPowerSystem.cs | 5 +- .../Power/EntitySystems/ApcSystem.cs | 23 +- .../Power/EntitySystems/ChargerSystem.cs | 27 +- .../PowerMonitoringConsoleSystem.cs | 44 +- .../Power/Generation/Teg/TegSystem.cs | 1 + .../Generator/GeneratorExhaustGasSystem.cs | 1 + .../Generator/PortableGeneratorSystem.cs | 17 +- Content.Server/Power/PowerWireAction.cs | 2 +- Content.Server/PowerCell/PowerCellSystem.cs | 1 + Content.Server/Prayer/PrayerSystem.cs | 2 +- .../Managers/IServerPreferencesManager.cs | 4 + .../Managers/ServerPreferencesManager.cs | 112 +- .../Radio/Components/RadioJammerComponent.cs | 20 - .../Radio/EntitySystems/JammerSystem.cs | 68 +- .../Radio/EntitySystems/RadioDeviceSystem.cs | 15 +- .../Radio/EntitySystems/RadioSystem.cs | 2 +- Content.Server/Radio/RadioEvent.cs | 2 +- .../RandomMetadata/RandomMetadataSystem.cs | 15 +- .../Repairable/RepairableComponent.cs | 15 +- Content.Server/Repairable/RepairableSystem.cs | 3 +- .../Research/Systems/ResearchSystem.Client.cs | 4 +- .../Systems/ResearchSystem.Console.cs | 11 +- .../Systems/DiskConsoleSystem.cs | 2 +- .../Respawn/SpecialRespawnSystem.cs | 2 +- .../EntitySystems/RevenantSystem.Abilities.cs | 15 +- .../Robotics/Systems/RoboticsConsoleSystem.cs | 146 + Content.Server/RoundEnd/RoundEndSystem.cs | 6 +- .../Expeditions/SalvageExpeditionComponent.cs | 11 +- .../SalvageSystem.ExpeditionConsole.cs | 4 +- .../Salvage/SalvageSystem.Expeditions.cs | 10 + .../Salvage/SalvageSystem.Magnet.cs | 13 +- .../Salvage/SalvageSystem.Runner.cs | 19 +- Content.Server/Salvage/SalvageSystem.cs | 2 +- .../Salvage/SpawnSalvageMissionJob.cs | 9 +- .../Sandbox/Commands/ColorNetworkCommand.cs | 2 +- .../SensorMonitoringConsoleComponent.cs | 2 +- .../SensorMonitoringConsoleSystem.UI.cs | 22 +- .../DockingSignalControlComponent.cs | 14 + .../Shuttles/Components/FTLComponent.cs | 3 + .../StationEmergencyShuttleComponent.cs | 2 +- .../Shuttles/Systems/ArrivalsSystem.cs | 15 +- .../Systems/DockingSignalControlSystem.cs | 28 + .../Systems/EmergencyShuttleSystem.Console.cs | 65 +- .../Systems/EmergencyShuttleSystem.cs | 80 +- .../Shuttles/Systems/RadarConsoleSystem.cs | 4 +- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 9 +- .../Systems/ShuttleSystem.FasterThanLight.cs | 52 +- .../Shuttles/Systems/ShuttleSystem.IFF.cs | 6 +- .../Shuttles/Systems/ShuttleSystem.cs | 2 + .../Shuttles/Systems/ThrusterSystem.cs | 10 - .../Silicons/Borgs/BorgSystem.Transponder.cs | 107 + .../Silicons/Borgs/BorgSystem.Ui.cs | 25 +- Content.Server/Silicons/Borgs/BorgSystem.cs | 7 + .../Silicons/Laws/SiliconLawSystem.cs | 4 +- .../EntitySystems/EventHorizonSystem.cs | 4 +- .../PowerSolarControlConsoleSystem.cs | 6 +- .../EntitySystems/ConditionalSpawnerSystem.cs | 1 + .../Components/PirateAccentComponent.cs | 3 +- .../Components/ReplacementAccentComponent.cs | 6 + .../EntitySystems/AddAccentClothingSystem.cs | 28 +- .../EntitySystems/FrenchAccentSystem.cs | 15 +- .../Speech/EntitySystems/FrontalLispSystem.cs | 15 +- .../EntitySystems/LizardAccentSystem.cs | 62 +- .../EntitySystems/MobsterAccentSystem.cs | 46 +- .../Speech/EntitySystems/MothAccentSystem.cs | 20 +- .../EntitySystems/ParrotAccentSystem.cs | 4 +- .../EntitySystems/PirateAccentSystem.cs | 4 +- .../EntitySystems/ReplacementAccentSystem.cs | 15 +- .../EntitySystems/ScrambledAccentSystem.cs | 4 +- .../EntitySystems/SkeletonAccentSystem.cs | 7 +- .../EntitySystems/SouthernAccentSystem.cs | 12 +- .../Components/StationBiomeComponent.cs | 22 + .../Station/Events/StationPostInitEvent.cs | 2 + .../Station/Systems/StationBiomeSystem.cs | 35 + .../Station/Systems/StationSpawningSystem.cs | 28 +- .../Station/Systems/StationSystem.cs | 29 +- .../BasicStationEventSchedulerSystem.cs | 61 +- .../AlertLevelInterceptionRuleComponent.cs | 15 + .../Components/LoneOpsSpawnRuleComponent.cs | 18 - .../Components/StationEventComponent.cs | 26 +- .../StationEvents/EventManagerSystem.cs | 20 +- .../Events/AlertLevelInterceptionRule.cs | 23 + .../StationEvents/Events/AnomalySpawnRule.cs | 1 + .../Events/BluespaceArtifactRule.cs | 3 +- .../Events/BluespaceLockerRule.cs | 3 +- .../StationEvents/Events/BreakerFlipRule.cs | 3 +- .../Events/BureaucraticErrorRule.cs | 1 + .../StationEvents/Events/CargoGiftsRule.cs | 3 +- .../StationEvents/Events/ClericalErrorRule.cs | 3 +- .../StationEvents/Events/FalseAlarmRule.cs | 1 + .../StationEvents/Events/GasLeakRule.cs | 1 + .../StationEvents/Events/ImmovableRodRule.cs | 1 + .../StationEvents/Events/IonStormRule.cs | 2 +- .../StationEvents/Events/KudzuGrowthRule.cs | 1 + .../StationEvents/Events/LoneOpsSpawnRule.cs | 51 - .../Events/MassHallucinationsRule.cs | 1 + .../StationEvents/Events/MeteorSwarmSystem.cs | 1 + .../StationEvents/Events/NinjaSpawnRule.cs | 1 + .../Events/PowerGridCheckRule.cs | 1 + .../Events/RandomEntityStorageSpawnRule.cs | 1 + .../Events/RandomSentienceRule.cs | 1 + .../StationEvents/Events/RandomSpawnRule.cs | 1 + .../StationEvents/Events/SolarFlareRule.cs | 1 + .../Events/StationEventSystem.cs | 3 + .../StationEvents/Events/VentClogRule.cs | 1 + .../StationEvents/Events/VentCrittersRule.cs | 1 + .../StationEvents/MeteorSchedulerSystem.cs | 1 + .../RampingStationEventSchedulerSystem.cs | 3 +- .../GeneralStationRecordConsoleComponent.cs | 6 + .../GeneralStationRecordConsoleSystem.cs | 26 +- .../Systems/StationRecordsSystem.cs | 13 +- .../Components/EntityStorageComponent.cs | 1 + .../EntitySystems/SpawnItemsOnUseSystem.cs | 4 +- .../EntitySystems/StorageSystem.Fill.cs | 11 + .../Storage/EntitySystems/StorageSystem.cs | 167 - .../Store/Systems/StoreSystem.Ui.cs | 21 +- Content.Server/Store/Systems/StoreSystem.cs | 8 +- Content.Server/Strip/StrippableSystem.cs | 14 +- .../SurveillanceCameraMonitorSystem.cs | 5 +- .../Systems/SurveillanceCameraRouterSystem.cs | 14 +- .../Systems/SurveillanceCameraSystem.cs | 13 +- .../ThiefUndeterminedBackpackSystem.cs | 2 +- Content.Server/Tips/TipsSystem.cs | 114 +- .../Tools/Components/WelderComponent.cs | 56 - Content.Server/Tools/ToolSystem.Welder.cs | 211 - Content.Server/Tools/ToolSystem.cs | 71 +- .../Traitor/Systems/AutoTraitorSystem.cs | 48 +- .../Uplink/Commands/AddUplinkCommand.cs | 6 +- .../UserInterface/ActivatableUISystem.cs | 235 - .../UserInterface/IntrinsicUIComponent.cs | 10 +- .../UserInterface/IntrinsicUISystem.cs | 31 +- .../VendingMachines/VendingMachineSystem.cs | 4 +- .../VoiceMask/VoiceMaskSystem.Equip.cs | 14 +- Content.Server/VoiceMask/VoiceMaskSystem.cs | 30 +- .../Weapons/Ranged/Systems/GunSystem.cs | 21 +- Content.Server/Wires/WiresSystem.cs | 21 +- .../Prototypes/NoiseChannelPrototype.cs | 2 +- .../Components/TraversalDistorterComponent.cs | 6 +- .../Systems/ArtifactAnalyzerSystem.cs | 31 +- .../Systems/TraversalDistorterSystem.cs | 44 +- .../XenoArtifacts/ArtifactSystem.Nodes.cs | 81 +- .../XenoArtifacts/ArtifactSystem.cs | 37 +- .../Effects/Systems/EmpArtifactSystem.cs | 6 +- .../Effects/Systems/GasArtifactSystem.cs | 1 + .../Effects/Systems/PortalArtifactSystem.cs | 3 +- .../Effects/Systems/ShuffleArtifactSystem.cs | 11 +- .../Effects/Systems/SpawnArtifactSystem.cs | 2 +- .../Systems/TemperatureArtifactSystem.cs | 1 + .../Effects/Systems/ThrowArtifactSystem.cs | 4 +- .../Systems/ArtifactExamineTriggerSystem.cs | 5 + .../Zombies/IncurableZombieComponent.cs | 10 +- .../Zombies/InitialInfectedExemptComponent.cs | 2 +- .../Zombies/PendingZombieComponent.cs | 14 +- .../Zombies/ZombieSystem.Transform.cs | 10 +- Content.Server/Zombies/ZombieSystem.cs | 10 + .../_Miracle/GulagSystem/GulagSystem.cs | 2 +- .../AspectsSystem/Aspects/AiRunLockAspect.cs | 1 + .../AspectsSystem/Aspects/BattledAspect.cs | 1 + .../AspectsSystem/Aspects/BloodyAspect.cs | 1 + .../AspectsSystem/Aspects/BombassAspect.cs | 1 + .../AspectsSystem/Aspects/CargoRichAspect.cs | 1 + .../AspectsSystem/Aspects/CatEarsAspect.cs | 1 + .../AspectsSystem/Aspects/ChairLeakAspect.cs | 1 + .../AspectsSystem/Aspects/DancingAspect.cs | 1 + .../AspectsSystem/Aspects/DarknessAspect.cs | 1 + .../AspectsSystem/Aspects/DrunkAspect.cs | 1 + .../Aspects/FastAndFuriousAspect.cs | 1 + .../AspectsSystem/Aspects/ImmersiveAspect.cs | 1 + .../AspectsSystem/Aspects/NoEngineAspect.cs | 1 + .../AspectsSystem/Aspects/PresentAspect.cs | 1 + .../Aspects/RandomAccentAspect.cs | 1 + .../Aspects/RandomAppearanceAspect.cs | 1 + .../AspectsSystem/Aspects/RandomItemAspect.cs | 1 + .../AspectsSystem/Aspects/ReflectAspect.cs | 1 + .../AspectsSystem/Aspects/SkeletonAspect.cs | 1 + .../AspectsSystem/Aspects/SlipperyAspect.cs | 1 + .../Aspects/StolenFloorAspect.cs | 1 + .../Aspects/TraitorRichAspect.cs | 3 +- .../AspectsSystem/Aspects/TraitoredAspect.cs | 35 +- .../AspectsSystem/Aspects/WeakAspect.cs | 1 + .../AspectsSystem/Aspects/WeakWallsAspect.cs | 1 + .../AspectsSystem/Aspects/WindowLeakAspect.cs | 1 + .../_White/AspectsSystem/Base/AspectSystem.cs | 3 +- .../_White/AuthPanel/AuthPanelSystem.cs | 24 +- .../_White/Carrying/CarryingSystem.cs | 5 +- .../_White/Chaplain/ArmamentsBeaconSystem.cs | 12 +- .../_White/Chaplain/NullRodSystem.cs | 8 +- .../_White/Cult/GameRule/CultRuleComponent.cs | 16 +- .../_White/Cult/GameRule/CultRuleSystem.cs | 272 +- .../Cult/Items/Systems/MagicHandSystem.cs | 9 +- .../Systems/TorchCultistsProviderSystem.cs | 27 +- .../Runes/Systems/CultSystem.BloodSpells.cs | 10 +- .../Runes/Systems/CultSystem.Constructs.cs | 20 +- .../Systems/CultSystem.ConstructsAbilities.cs | 1 + .../Cult/Runes/Systems/CultSystem.Rune.cs | 178 +- .../Structures/CultStructureCraftSystem.cs | 10 +- .../TimedProduction/CultistFactorySystem.cs | 19 +- .../ERTRecruitment/ERTRecruitmentRule.cs | 5 +- Content.Server/_White/Economy/ATMSystem.cs | 2 +- Content.Server/_White/Economy/EftposSystem.cs | 4 +- .../InstrumentPlayedStatSystem.cs | 6 +- .../Flamethrower/GasProjectileComponent.cs | 1 + .../Fluff/Systems/ClothingMidiSystem.cs | 70 +- .../_White/Harpy/HarpysingerSystem.cs | 9 +- .../InteractiveBoardSystem.cs | 5 +- .../_White/Items/Tricorder/TricorderSystem.cs | 2 +- .../_White/MeatyOre/MeatyOreStoreSystem.cs | 9 +- .../BodyScanner/BodyScannerConsoleSystem.cs | 12 +- Content.Server/_White/Mood/MoodSystem.cs | 11 +- .../SecurityHud/SecurityHudComponent.cs | 20 - .../_White/SecurityHud/SecurityHudSystem.cs | 33 +- .../Supermatter/Systems/SupermatterSystem.cs | 6 +- Content.Server/_White/TTS/VoiceMaskSystem.cs | 2 +- .../Appearance/WizardAppearanceSystem.cs | 51 + .../Wizard/Mirror/WizardMirrorSystem.cs | 13 +- .../_White/Wizard/WizardComponent.cs | 18 - .../_White/Wizard/WizardRuleComponent.cs | 40 +- .../_White/Wizard/WizardRuleSystem.cs | 423 +- Content.Shared/APC/SharedApc.cs | 29 +- .../Access/Components/IdCardComponent.cs | 6 + .../Components/IdExaminableComponent.cs | 6 + .../Access/SharedAgentIDCardSystem.cs | 10 +- .../Access/Systems/IdExaminableSystem.cs | 16 +- .../Access/Systems/SharedIdCardSystem.cs | 171 + .../ActionBlocker/ActionBlockerSystem.cs | 10 +- Content.Shared/Actions/ActionEvents.cs | 8 +- Content.Shared/Actions/BaseActionComponent.cs | 8 +- .../Actions/Events/ActionPerformedEvent.cs | 8 + .../Events/ValidateActionEntityTargetEvent.cs | 4 + .../Events/ValidateActionWorldTargetEvent.cs | 6 + Content.Shared/Actions/SharedActionsSystem.cs | 60 +- .../Administration/AdminFrozenComponent.cs | 9 +- .../Components/SharedHeadstandComponent.cs | 5 +- .../Components/SharedKillSignComponent.cs | 5 +- ...enSystem.cs => SharedAdminFrozenSystem.cs} | 20 +- Content.Shared/Alert/AlertType.cs | 3 +- Content.Shared/Antag/AntagAcceptability.cs | 13 + .../Armor/AllowSuitStorageComponent.cs | 10 + Content.Shared/Atmos/AtmosDirection.cs | 17 +- .../Atmos/GasMixture.cs | 5 +- .../Atmos/GasMixtureStringRepresentation.cs | 16 + .../Atmos/GetFireProtectionEvent.cs | 33 + .../Atmos/Reactions/GasReactionEnums.cs | 14 + .../Atmos/Rotting/SharedRottingSystem.cs | 141 +- .../Audio/Jukebox/JukeboxPrototype.cs | 2 +- .../Prototypes/MetabolismGroupPrototype.cs | 8 +- .../Prototypes/MetabolizerTypePrototype.cs | 7 +- .../Body/Systems/SharedBodySystem.Body.cs | 6 +- Content.Shared/CCVar/CCVars.cs | 164 +- Content.Shared/Cargo/CargoOrderData.cs | 24 +- .../Components/SharedCargoTelepadComponent.cs | 5 +- .../Changeling/ChangelingComponent.cs | 4 + Content.Shared/Chat/SharedChatSystem.cs | 8 +- .../SharedTypingIndicatorSystem.cs | 19 +- Content.Shared/Chat/V2/Repository/Types.cs | 60 + Content.Shared/Chat/V2/Types.cs | 94 + .../Chemistry/Components/InjectorComponent.cs | 3 +- .../Components/MixableSolutionComponent.cs | 13 + .../Components/ReagentTankComponent.cs | 22 + .../Chemistry/Components/Solution.cs | 7 - .../EntitySystems/RehydratableSystem.cs | 5 + .../EntitySystems/SharedInjectorSystem.cs | 2 +- ...redSolutionContainerSystem.Capabilities.cs | 26 +- .../SharedSolutionContainerSystem.cs | 335 +- .../EntitySystems/SolutionTransferSystem.cs | 11 +- .../Chemistry/Reaction/ITileReaction.cs | 5 +- .../Reaction/ReactionMixerComponent.cs | 3 - .../Chemistry/Reagent/ReagentPrototype.cs | 4 +- Content.Shared/Climbing/Systems/BonkSystem.cs | 11 +- .../Climbing/Systems/ClimbSystem.cs | 3 +- Content.Shared/Clothing/ClothingEvents.cs | 29 + .../Clothing/Components/ClothingComponent.cs | 3 + .../Components/FireProtectionComponent.cs | 17 + .../Components/HideLayerClothingComponent.cs | 24 + .../Clothing/Components/LoadoutComponent.cs | 20 +- .../Clothing/EntitySystems/ClothingSystem.cs | 95 +- .../EntitySystems/FireProtectionSystem.cs | 23 + .../Clothing/EntitySystems/MaskSystem.cs | 20 +- .../Clothing/EntitySystems/SkatesSystem.cs | 24 +- Content.Shared/Clothing/LoadoutSystem.cs | 20 +- .../Containers/ItemSlot/ItemSlotsSystem.cs | 6 +- Content.Shared/Content.Shared.csproj | 3 + .../CriminalRecordsHackerComponent.cs | 31 + .../SharedCriminalRecordsConsoleSystem.cs | 58 +- .../SharedCriminalRecordsHackerSystem.cs | 48 + .../Systems/SharedCriminalRecordsSystem.cs | 59 + .../Damage/Prototypes/DamageGroupPrototype.cs | 6 + .../Prototypes/DamageModifierSetPrototype.cs | 2 +- .../Damage/Prototypes/DamageTypePrototype.cs | 6 + .../Damage/Systems/DamageExamineSystem.cs | 5 +- .../DeviceLinking/DevicePortPrototype.cs | 4 +- .../DeviceLinking/SharedDeviceLinkSystem.cs | 3 +- .../SharedNetworkConfiguratorSystem.cs | 13 + .../Components/SharedDisposalUnitComponent.cs | 7 - Content.Shared/DoAfter/DoAfterEvent.cs | 2 +- .../DoAfter/SharedDoAfterSystem.Update.cs | 1 + Content.Shared/DoAfter/SharedDoAfterSystem.cs | 5 +- Content.Shared/Examine/ExamineSystemShared.cs | 8 +- .../SharedFireExtinguisherComponent.cs | 2 + .../Blinding/Components/BlindableComponent.cs | 6 +- .../Eye/Blinding/Systems/BlindableSystem.cs | 26 +- .../Eye/Blinding/Systems/EyeClosingSystem.cs | 3 +- .../Fax/Components}/FaxMachineComponent.cs | 48 +- .../Fax/Components/FaxableObjectComponent.cs | 16 + .../Fax/Components/FaxecuteComponent.cs | 19 + Content.Shared/Fax/DamageOnFaxecuteEvent.cs | 9 + Content.Shared/Fax/SharedFax.cs | 5 +- Content.Shared/Fax/Systems/FaxecuteSystem.cs | 34 + Content.Shared/Geras/SharedGerasSystem.cs | 16 + .../Ghost/Roles/GhostRolePrototype.cs | 10 +- .../Prototypes/PreloadedGridPrototype.cs | 21 + .../Systems/SharedGridPreloaderSystem.cs | 4 + .../Hands/Components/HandsComponent.cs | 34 + .../EntitySystems/SharedHandsSystem.Drop.cs | 11 +- .../SharedHandsSystem.Interactions.cs | 29 +- .../EntitySystems/SharedHandsSystem.Pickup.cs | 4 +- .../Hands/EntitySystems/SharedHandsSystem.cs | 38 +- .../HealthExaminableComponent.cs | 10 +- .../HealthExaminableSystem.cs | 4 +- .../Humanoid/HumanoidAppearanceComponent.cs | 6 + .../Humanoid/HumanoidCharacterAppearance.cs | 199 +- .../SharedHumanoidAppearanceSystem.cs | 15 +- .../Components/IdentityBlockerComponent.cs | 1 + .../Implants/SharedSubdermalImplantSystem.cs | 2 +- Content.Shared/Input/ContentKeyFunctions.cs | 1 + .../Interaction/Components/ClumsyComponent.cs | 30 +- .../Interaction/RotateToFaceSystem.cs | 2 +- .../Interaction/SharedInteractionSystem.cs | 32 +- .../Inventory/Events/UnequippedEvents.cs | 6 + .../Inventory/InventoryComponent.cs | 12 + .../Inventory/InventorySystem.Equip.cs | 16 +- .../Inventory/InventorySystem.Helpers.cs | 4 +- .../Inventory/InventorySystem.Relay.cs | 9 +- .../Inventory/InventorySystem.Slots.cs | 40 +- .../Inventory/InventoryTemplatePrototype.cs | 6 + Content.Shared/Inventory/SlotFlags.cs | 2 + .../Labels/Components/HandLabelerComponent.cs | 33 +- .../EntitySystems/SharedHandLabelerSystem.cs | 129 + .../Labels/EntitySystems/SharedLabelSystem.cs | 2 + Content.Shared/Labels/LabelEvents.cs | 66 +- .../SharedExpendableLightComponent.cs | 1 - .../UnpoweredFlashlightComponent.cs | 3 +- .../UnpoweredFlashlightSystem.cs | 122 + Content.Shared/Light/LightToggleEvent.cs | 6 + .../ContentLocalizationManager.cs | 4 +- Content.Shared/Lock/LockComponent.cs | 8 +- Content.Shared/Lock/LockSystem.cs | 16 +- .../MagicMirror/MagicMirrorComponent.cs | 8 +- .../MagicMirror/SharedMagicMirrorSystem.cs | 21 +- .../Medical/SuitSensor/SharedSuitSensor.cs | 2 +- Content.Shared/Mind/SharedMindSystem.cs | 25 +- .../Movement/Components/MobMoverComponent.cs | 9 + .../Movement/Pulling/Systems/PullingSystem.cs | 13 + .../Systems/SharedMoverController.Input.cs | 2 +- .../Movement/Systems/SharedMoverController.cs | 11 +- .../Ninja/Components/SpaceNinjaComponent.cs | 20 +- .../Ninja/Systems/SharedNinjaGlovesSystem.cs | 2 + .../NukeOps/NukeOperativeComponent.cs | 7 +- .../Nutrition/EntitySystems/HungerSystem.cs | 43 + .../Nutrition/EntitySystems/ThirstSystem.cs | 59 + .../ShowCriminalRecordIconsComponent.cs | 22 + .../Overlays/ShowHungerIconsComponent.cs | 2 +- ...sComponent.cs => ShowJobIconsComponent.cs} | 4 +- .../Overlays/ShowMindShieldIconsComponent.cs | 9 + .../Overlays/ShowSyndicateIconsComponent.cs | 2 +- .../Overlays/ShowThirstIconsComponent.cs | 2 +- Content.Shared/Paper/SharedPaperComponent.cs | 2 + .../Parallax/Biomes/BiomeComponent.cs | 13 +- Content.Shared/Physics/CollisionGroup.cs | 3 + Content.Shared/Pinpointer/NavMapComponent.cs | 39 +- .../Pinpointer/SharedNavMapSystem.cs | 250 +- .../Plunger/Systems/PlungerSystem.cs | 4 +- Content.Shared/Popups/SharedPopupSystem.cs | 12 + .../ActivatableUIRequiresPowerComponent.cs | 8 + .../SharedPowerMonitoringConsoleSystem.cs | 20 + .../Preferences/HumanoidCharacterProfile.cs | 32 +- .../Effects/LoadoutEffectGroupPrototype.cs | 2 +- .../Loadouts/Effects/SpeciesLoadoutEffect.cs | 6 + .../Loadouts/LoadoutGroupPrototype.cs | 2 +- .../Preferences/Loadouts/LoadoutPrototype.cs | 2 +- .../Loadouts/RoleLoadoutPrototype.cs | 2 +- Content.Shared/Prying/Systems/PryingSystem.cs | 17 +- Content.Shared/RCD/RCDPrototype.cs | 2 +- .../Components/SharedRadioJammerComponent.cs | 74 + .../Radio/EntitySystems/SharedJammerSystem.cs | 78 + .../Random/Helpers/SharedRandomExtensions.cs | 5 +- .../ReagentSpeed/ReagentSpeedComponent.cs | 34 + .../ReagentSpeed/ReagentSpeedSystem.cs | 33 + .../SharedRevolutionarySystem.cs | 6 - .../Components/RoboticsConsoleComponent.cs | 53 + Content.Shared/Robotics/RoboticsConsoleUi.cs | 126 + .../Systems/SharedRoboticsConsoleSystem.cs | 8 + Content.Shared/Roles/Jobs/SharedJobSystem.cs | 4 +- Content.Shared/Roles/SharedRoleSystem.cs | 67 + .../Roles/StartingGearEquippedEvent.cs | 10 + Content.Shared/Salvage/SalvageMapPrototype.cs | 2 +- .../Components/BorgTransponderComponent.cs | 43 + .../Silicons/Laws/SiliconLawPrototype.cs | 9 +- Content.Shared/Slippery/SlipperySystem.cs | 4 +- .../Prototypes/AirlockDepartmentsPrototype.cs | 2 +- .../Station/SharedStationSpawningSystem.cs | 80 +- .../StationRecords/GeneralRecordsUi.cs | 23 +- .../StatusIcon/StatusIconPrototype.cs | 2 +- Content.Shared/Stealth/SharedStealthSystem.cs | 2 +- .../ClothingRequiredStepTriggerComponent.cs | 10 + ...thingRequiredStepTriggerImmuneComponent.cs | 16 + .../ShoesRequiredStepTriggerComponent.cs | 11 - .../Components/StepTriggerImmuneComponent.cs | 9 + .../Systems/ShoesRequiredStepTriggerSystem.cs | 41 - .../Systems/StepTriggerImmuneSystem.cs | 37 + .../EntitySystems/MagnetPickupSystem.cs | 2 +- .../EntitySystems/SharedStorageSystem.cs | 307 +- Content.Shared/Storage/StorageComponent.cs | 31 +- .../Tabletop/SharedTabletopSystem.cs | 6 +- Content.Shared/Tag/TagSystem.cs | 117 +- .../Systems/SwapTeleporterSystem.cs | 15 +- Content.Shared/Timing/UseDelayComponent.cs | 65 +- Content.Shared/Timing/UseDelaySystem.cs | 178 +- Content.Shared/Tips/TippyEvent.cs | 19 + .../Tools/Components/SharedWelderComponent.cs | 21 - ...SharedWeldable.cs => WeldableComponent.cs} | 26 +- .../Tools/Components/WelderComponent.cs | 58 + .../Tools/Systems/SharedToolSystem.Welder.cs | 178 + .../Tools/Systems/SharedToolSystem.cs | 44 +- .../Tools/Systems/WeldableSystem.cs | 6 +- .../Assorted/PermanentBlindnessComponent.cs | 2 + .../Assorted/PermanentBlindnessSystem.cs | 32 +- .../UserInterface/ActivatableUIComponent.cs | 54 +- .../UserInterface/ActivatableUIEvents.cs | 6 +- ...ActivatableUIRequiresPowerCellComponent.cs | 7 +- .../ActivatableUISystem.Power.cs | 38 +- .../UserInterface/ActivatableUISystem.cs | 332 + Content.Shared/Verbs/SharedVerbSystem.cs | 26 +- Content.Shared/Verbs/VerbCategory.cs | 2 + Content.Shared/Verbs/VerbEvents.cs | 10 +- .../Weapons/Misc/SharedTetherGunSystem.cs | 2 +- .../Ranged/Components/ActionGunComponent.cs | 37 + .../Components/GunRequiresWieldComponent.cs | 7 +- .../Components/GunWieldBonusComponent.cs | 3 + .../Weapons/Ranged/Events/MuzzleFlashEvent.cs | 9 +- .../Ranged/Events/ShotAttemptedEvent.cs | 4 +- .../Weapons/Ranged/Systems/ActionGunSystem.cs | 41 + .../Systems/SharedGunSystem.Ballistic.cs | 4 +- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 22 +- .../Weapons/Reflect/ReflectComponent.cs | 37 +- .../Weapons/Reflect/ReflectSystem.cs | 94 +- Content.Shared/Whitelist/EntityWhitelist.cs | 149 +- .../Whitelist/EntityWhitelistSystem.cs | 84 + .../Components/WieldableComponent.cs | 7 + Content.Shared/Wieldable/WieldableSystem.cs | 28 +- .../Equipment/SharedArtifactAnalyzer.cs | 80 +- .../_White/Antag/GlobalAntagonistSystem.cs | 19 + .../Cult/Components/CultistComponent.cs | 4 - .../SharedPolymorphableCanisterSystem.cs | 9 +- .../Appearance/WizardAppearanceComponent.cs | 19 + .../Alert/ServerAlertsComponentTests.cs | 10 +- Content.Tests/Shared/DamageTest.cs | 16 + Content.YAMLLinter/Program.cs | 48 +- .../Audio/Announcements/attributions.yml | 5 + Resources/Audio/Announcements/intercept.ogg | Bin 0 -> 239180 bytes .../Grenades/SelfDestruct/SDS_Charge.ogg | Bin 0 -> 61451 bytes .../Grenades/SelfDestruct/SDS_Charge2.ogg | Bin 0 -> 55510 bytes .../Grenades/SelfDestruct/attributions.yml | 8 + Resources/Audio/Effects/chopstickbreak.ogg | Bin 0 -> 5552 bytes Resources/Audio/Effects/spray3.ogg | Bin 0 -> 12266 bytes Resources/Audio/Expedition/attributions.yml | 9 + Resources/Audio/Expedition/deadline.ogg | Bin 0 -> 1797293 bytes .../{Misc => Expedition}/tension_session.ogg | Bin Resources/Audio/Machines/warning_buzzer.ogg | Bin 29891 -> 57798 bytes Resources/Changelog/Admin.yml | 70 + Resources/Changelog/Changelog.yml | 3391 +- .../ConfigPresets/Build/development.toml | 1 + Resources/Credits/GitHub.txt | 2 +- Resources/Locale/en-US/accent/italian.ftl | 3 - Resources/Locale/en-US/accent/pirate.ftl | 2 +- .../Locale/en-US/accessories/human-hair.ftl | 1 + .../en-US/administration/admin-verbs.ftl | 1 + .../Locale/en-US/administration/smites.ftl | 47 +- .../en-US/administration/ui/admin-logs.ftl | 1 - Resources/Locale/en-US/alerts/alerts.ftl | 6 +- .../components/ame-controller-component.ftl | 1 - .../space-villain-game-component.ftl | 3 +- Resources/Locale/en-US/borg/borg.ftl | 5 + Resources/Locale/en-US/burning/bodyburn.ftl | 2 +- Resources/Locale/en-US/chat/chat-repo.ftl | 7 + .../en-US/chat/commands/ghost-command.ftl | 5 + .../en-US/chat/commands/suicide-command.ftl | 2 + .../components/solution-scanner-component.ftl | 1 + .../chemistry/components/solution-status.ftl | 2 + .../Locale/en-US/commands/tippy-command.ftl | 12 + .../en-US/commands/toolshed-commands.ftl | 2 + .../communications-console-component.ftl | 2 +- .../en-US/components/storage-component.ftl | 2 + .../construction/ui/construction-menu.ftl | 3 +- .../Locale/en-US/containers/containers.ftl | 3 + .../Locale/en-US/damage/damage-groups.ftl | 5 + .../Locale/en-US/damage/damage-types.ftl | 13 + .../Locale/en-US/devices/device-network.ftl | 2 + .../en-US/devices/network-configurator.ftl | 4 +- .../components/disposal-router-component.ftl | 4 - .../components/disposal-tagger-window.ftl | 3 - .../en-US/escape-menu/ui/options-menu.ftl | 6 +- Resources/Locale/en-US/fax/fax.ftl | 2 + .../Locale/en-US/flavors/flavor-profiles.ftl | 6 + .../fluids/components/absorbent-component.ftl | 10 +- .../game-presets/preset-pirates.ftl | 10 - .../game-presets/preset-revolutionary.ftl | 14 +- .../game-presets/preset-traitor.ftl | 3 +- Resources/Locale/en-US/geras/geras.ftl | 2 + .../ghost/roles/ghost-role-component.ftl | 24 + .../ghostrole-spawner-verb-selectable.ftl | 1 + .../en-US/guidebook/chemistry/conditions.ftl | 4 +- .../en-US/guidebook/chemistry/effects.ftl | 8 +- Resources/Locale/en-US/guidebook/guides.ftl | 2 +- Resources/Locale/en-US/implant/implant.ftl | 5 +- .../interaction-popup-component.ftl | 5 - .../Locale/en-US/inventory/item-status.ftl | 1 + .../Locale/en-US/job/job-supervisors.ftl | 2 +- .../machine-linking/transmitter_ports.ftl | 3 + Resources/Locale/en-US/markings/reptilian.ftl | 9 +- Resources/Locale/en-US/mech/mech.ftl | 1 + .../components/health-analyzer-component.ftl | 23 - .../en-US/metabolism/metabolism-groups.ftl | 7 + .../en-US/metabolism/metabolizer-types.ftl | 11 + .../Locale/en-US/ninja/ninja-actions.ftl | 2 + .../nutrition/components/drink-component.ftl | 4 +- .../en-US/radiation/geiger-component.ftl | 2 +- .../components/radio-jammer-component.ftl | 10 + .../meta/consumable/drink/alcohol.ftl | 18 + .../Locale/en-US/reagents/meta/medicine.ftl | 3 + .../Locale/en-US/reagents/meta/narcotics.ftl | 3 - .../en-US/reagents/meta/physical-desc.ftl | 3 - .../research/components/robotics-console.ftl | 19 + .../Locale/en-US/research/technologies.ftl | 2 +- Resources/Locale/en-US/seeds/seeds.ftl | 1 + Resources/Locale/en-US/speech/speech-liar.ftl | 132 + .../station-events/events/immovable-rod.ftl | 2 +- .../en-US/station-events/events/intercept.ftl | 1 + .../station-events/events/unknown-shuttle.ftl | 1 + .../general-station-records.ftl | 1 + .../en-US/step-trigger/shoes-required.ftl | 2 +- Resources/Locale/en-US/store/currency.ftl | 2 +- .../Locale/en-US/store/uplink-catalog.ftl | 7 +- Resources/Locale/en-US/thief/backpack.ftl | 6 +- .../tools/components/welder-component.ftl | 3 +- Resources/Locale/en-US/traits/traits.ftl | 6 + Resources/Locale/en-US/ui/verbs.ftl | 3 - Resources/Locale/en-US/verbs/verb-system.ftl | 2 +- .../en-US/wieldable/wieldable-component.ftl | 3 +- .../xenoarchaeology/artifact-analyzer.ftl | 7 + .../xenoarchaeology/traversal-distorter.ftl | 8 +- Resources/Locale/ru-RU/_white/cult/preset.ftl | 8 +- .../ru-RU/_white/speech/speech-liar.ftl | 132 + .../Locale/ru-RU/_white/traits/traits.ftl | 2 + .../Locale/ru-RU/_white/wizard/wizard.ftl | 2 +- .../ru-RU/white/securityhud/securityhud.ftl | 3 +- Resources/Maps/Dungeon/experiment.yml | 7 - Resources/Maps/Dungeon/lava_brig.yml | 2 +- Resources/Maps/Salvage/small-3.yml | 692 - .../ShuttleEvent/disaster_evacpod.yml | 350 + .../Maps/Shuttles/ShuttleEvent/honki.yml | 2666 + .../Maps/Shuttles/ShuttleEvent/lost_cargo.yml | 1411 + .../Shuttles/{ => ShuttleEvent}/striker.yml | 2 +- .../Shuttles/ShuttleEvent/syndie_evacpod.yml | 1188 + .../ShuttleEvent/traveling_china_cuisine.yml | 1872 + Resources/Maps/Shuttles/briggle.yml | 1181 + Resources/Maps/Shuttles/emergency_box.yml | 4 + Resources/Maps/Shuttles/emergency_courser.yml | 4 + Resources/Maps/Shuttles/emergency_delta.yml | 4 + Resources/Maps/Shuttles/emergency_lox.yml | 4 + Resources/Maps/Shuttles/emergency_meta.yml | 4 + Resources/Maps/Shuttles/emergency_omega.yml | 4 + Resources/Maps/Shuttles/emergency_raven.yml | 4 + Resources/Maps/Shuttles/emergency_rod.yml | 4 + Resources/Maps/Shuttles/emergency_transit.yml | 4 + Resources/Maps/Test/dev_map.yml | 1 - Resources/Maps/atlas.yml | 18949 +- Resources/Maps/box.yml | 19 +- Resources/Maps/cluster.yml | 6210 +- Resources/Maps/core.yml | 18323 +- Resources/Maps/europa.yml | 9500 - Resources/Maps/fland.yml | 6044 +- Resources/Maps/meta.yml | 7 - Resources/Maps/oasis.yml | 181085 +++++++++++++++ Resources/Maps/origin.yml | 2 +- Resources/Maps/saltern.yml | 191 +- Resources/Maps/train.yml | 3964 +- .../Prototypes/Accents/word_replacements.yml | 47 + Resources/Prototypes/Actions/types.yml | 17 +- .../Prototypes/AlertLevels/alert_levels.yml | 11 +- Resources/Prototypes/Alerts/alerts.yml | 9 + Resources/Prototypes/Anomaly/behaviours.yml | 5 +- .../Prototypes/Body/Prototypes/skrell.yml | 2 +- .../Catalog/Cargo/cargo_security.yml | 2 +- .../Prototypes/Catalog/Fills/Crates/cargo.yml | 3 - .../Catalog/Fills/Crates/service.yml | 6 +- .../Catalog/Fills/Lockers/dressers.yml | 3 + .../Catalog/Fills/Lockers/engineer.yml | 17 +- .../Catalog/Fills/Lockers/heads.yml | 4 + .../Catalog/Fills/Lockers/security.yml | 2 +- .../Catalog/Fills/Paper/manuals.yml | 4 +- .../VendingMachines/Inventories/boozeomat.yml | 4 + .../VendingMachines/Inventories/chang.yml | 1 + .../VendingMachines/Inventories/detdrobe.yml | 2 +- .../Inventories/dinnerware.yml | 1 + .../VendingMachines/Inventories/discount.yml | 1 + .../VendingMachines/Inventories/sec.yml | 2 + .../Prototypes/Catalog/thief_toolbox_sets.yml | 1 + .../Prototypes/Catalog/uplink_catalog.yml | 34 +- .../Chemistry/metabolism_groups.yml | 9 +- .../Chemistry/metabolizer_types.yml | 24 +- Resources/Prototypes/Damage/groups.yml | 5 + Resources/Prototypes/Damage/modifier_sets.yml | 2 +- Resources/Prototypes/Damage/types.yml | 13 + .../Prototypes/Datasets/corporations.yml | 12 + .../Prototypes/Datasets/criminal_records.yml | 6 + .../Device/devicenet_frequencies.yml | 11 + .../Prototypes/DeviceLinking/source_ports.yml | 5 + .../Entities/Clothing/Back/backpacks.yml | 4 +- .../Entities/Clothing/Back/specific.yml | 8 +- .../Clothing/Belt/base_clothingbelt.yml | 4 +- .../Entities/Clothing/Belt/belts.yml | 13 +- .../Entities/Clothing/Belt/quiver.yml | 4 + .../Entities/Clothing/Ears/specific.yml | 2 +- .../Entities/Clothing/Eyes/glasses.yml | 16 +- .../Prototypes/Entities/Clothing/Eyes/hud.yml | 43 +- .../Entities/Clothing/Eyes/specific.yml | 2 +- .../Entities/Clothing/Hands/gloves.yml | 11 +- .../Entities/Clothing/Hands/specific.yml | 4 +- .../Clothing/Head/base_clothinghead.yml | 20 +- .../Clothing/Head/hardsuit-helmets.yml | 8 +- .../Entities/Clothing/Head/hats.yml | 15 +- .../Entities/Clothing/Head/helmets.yml | 23 +- .../Entities/Clothing/Head/hoods.yml | 45 +- .../Entities/Clothing/Head/misc.yml | 11 + .../Entities/Clothing/Head/specific.yml | 2 +- .../Entities/Clothing/Head/welding.yml | 5 + .../Entities/Clothing/Masks/bandanas.yml | 5 +- .../Entities/Clothing/Masks/masks.yml | 89 +- .../Entities/Clothing/Masks/specific.yml | 16 +- .../Entities/Clothing/Neck/medals.yml | 24 + .../Entities/Clothing/Neck/specific.yml | 2 +- .../Entities/Clothing/OuterClothing/armor.yml | 56 +- .../OuterClothing/base_clothingouter.yml | 16 +- .../Entities/Clothing/OuterClothing/coats.yml | 19 +- .../Clothing/OuterClothing/hardsuits.yml | 249 +- .../Clothing/OuterClothing/specific.yml | 2 +- .../Entities/Clothing/OuterClothing/suits.yml | 74 +- .../Entities/Clothing/OuterClothing/vests.yml | 4 +- .../Clothing/Shoes/base_clothingshoes.yml | 1 + .../Entities/Clothing/Shoes/magboots.yml | 2 +- .../Entities/Clothing/Shoes/misc.yml | 2 + .../Entities/Clothing/Shoes/specific.yml | 2 +- .../Clothing/Uniforms/color_jumpskirts.yml | 32 +- .../Entities/Clothing/Uniforms/jumpskirts.yml | 30 +- .../Entities/Clothing/Uniforms/jumpsuits.yml | 15 +- .../Entities/Clothing/Uniforms/specific.yml | 4 +- .../Entities/Clothing/base_clothing.yml | 6 + .../Prototypes/Entities/Debugging/tippy.yml | 30 + .../Prototypes/Entities/Effects/puddle.yml | 5 +- .../Random/Food_Drinks/drinks_glass.yml | 6 + .../Random/Food_Drinks/food_produce.yml | 4 +- .../Entities/Markers/Spawners/ghost_roles.yml | 3 +- .../Entities/Markers/Spawners/mobs.yml | 14 + .../Customization/Markings/human_hair.yml | 7 + .../Mobs/Customization/Markings/reptilian.yml | 20 + .../Mobs/Cyborgs/base_borg_chassis.yml | 36 +- .../Entities/Mobs/Cyborgs/borg_chassis.yml | 30 + .../Entities/Mobs/Debugging/debug_counter.yml | 53 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 185 +- .../Entities/Mobs/NPCs/behonker.yml | 4 +- .../Entities/Mobs/NPCs/elemental.yml | 3 +- .../Entities/Mobs/NPCs/hellspawn.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/pets.yml | 19 +- .../Entities/Mobs/NPCs/revenant.yml | 4 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 66 +- .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 63 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 4 +- .../Entities/Mobs/Player/admin_ghost.yml | 30 +- .../Entities/Mobs/Player/dragon.yml | 45 + .../Entities/Mobs/Player/guardian.yml | 4 +- .../Entities/Mobs/Player/humanoid.yml | 304 + .../Entities/Mobs/Player/reptilian.yml | 3 +- .../Entities/Mobs/Player/silicon.yml | 18 +- .../Entities/Mobs/Player/terminator.yml | 8 +- .../Prototypes/Entities/Mobs/Player/vox.yml | 4 +- .../Prototypes/Entities/Mobs/Species/base.yml | 22 +- .../Entities/Mobs/Species/dwarf.yml | 5 + .../Entities/Mobs/Species/human.yml | 5 + .../Entities/Mobs/Species/reptilian.yml | 4 +- .../Entities/Mobs/Species/slime.yml | 34 + .../Prototypes/Entities/Mobs/Species/vox.yml | 10 + .../Objects/Consumable/Drinks/drinks.yml | 102 +- .../Consumable/Drinks/drinks_bottles.yml | 5 +- .../Objects/Consumable/Drinks/drinks_cans.yml | 6 +- .../Objects/Consumable/Drinks/drinks_cups.yml | 7 +- .../Consumable/Drinks/drinks_special.yml | 66 +- .../Consumable/Drinks/trash_drinks.yml | 18 +- .../Objects/Consumable/Food/Baked/bread.yml | 1 + .../Objects/Consumable/Food/Baked/cake.yml | 1 + .../Consumable/Food/Containers/bowl.yml | 6 +- .../Consumable/Food/Containers/box.yml | 5 +- .../Objects/Consumable/Food/produce.yml | 6 +- .../Machine/base_machineboard.yml | 2 +- .../Circuitboards/Machine/production.yml | 41 +- .../Devices/Circuitboards/computer.yml | 13 +- .../Objects/Devices/Electronics/door.yml | 6 +- .../Devices/Electronics/door_access.yml | 468 +- .../Objects/Devices/Electronics/triggers.yml | 17 +- .../reinforcement_teleporter.yml | 12 +- .../Syndicate_Gadgets/war_declarator.yml | 4 +- .../Objects/Devices/forensic_scanner.yml | 6 +- .../Entities/Objects/Devices/geiger.yml | 3 + .../Entities/Objects/Devices/mousetrap.yml | 2 +- .../Entities/Objects/Devices/pda.yml | 21 +- .../Entities/Objects/Devices/pinpointer.yml | 17 +- .../Entities/Objects/Devices/radio.yml | 17 + .../Objects/Devices/station_beacon.yml | 4 +- .../Entities/Objects/Devices/station_map.yml | 2 +- .../Fun/Instruments/base_instruments.yml | 8 +- .../Entities/Objects/Fun/candy_bucket.yml | 4 +- .../Entities/Objects/Fun/crayons.yml | 4 +- .../Prototypes/Entities/Objects/Fun/dice.yml | 2 +- .../Entities/Objects/Fun/immovable_rod.yml | 2 +- .../Prototypes/Entities/Objects/Fun/pai.yml | 10 +- .../Entities/Objects/Fun/snap_pops.yml | 7 +- .../Entities/Objects/Fun/whistles.yml | 30 +- .../Entities/Objects/Materials/shards.yml | 27 +- .../Entities/Objects/Misc/books.yml | 15 +- .../Entities/Objects/Misc/chopsticks.yml | 30 + .../Objects/Misc/fire_extinguisher.yml | 3 + .../Entities/Objects/Misc/fluff_lights.yml | 5 + .../Objects/Misc/identification_cards.yml | 4 +- .../Entities/Objects/Misc/medalcase.yml | 3 + .../Entities/Objects/Misc/paper.yml | 18 +- .../Entities/Objects/Misc/pet_carrier.yml | 2 +- .../Objects/Misc/subdermal_implants.yml | 8 +- .../Entities/Objects/Misc/utensils.yml | 27 +- .../Objects/Power/portable_recharger.yml | 38 + .../Entities/Objects/Shields/shields.yml | 4 +- .../Objects/Specific/Cargo/cargo_pallet.yml | 4 +- .../Objects/Specific/Chapel/bibles.yml | 4 +- .../Entities/Objects/Specific/Chapel/urn.yml | 6 +- .../Specific/Hydroponics/seedanalyzer.yml | 2 +- .../Objects/Specific/Janitorial/janitor.yml | 6 + .../Objects/Specific/Janitorial/spray.yml | 8 + .../Objects/Specific/Kitchen/foodcarts.yml | 4 +- .../Entities/Objects/Specific/Mech/mechs.yml | 4 +- .../Medical/handheld_crew_monitor.yml | 3 +- .../Specific/Medical/healthanalyzer.yml | 3 +- .../Objects/Specific/Medical/medkits.yml | 3 + .../Objects/Specific/Research/anomaly.yml | 4 +- .../Specific/Robotics/borg_modules.yml | 18 +- .../Objects/Specific/Security/body-camera.yml | 2 +- .../Objects/Specific/Service/barber.yml | 7 +- .../Xenoarchaeology/artifact_equipment.yml | 2 +- .../Xenoarchaeology/item_artifacts.yml | 16 +- .../Xenoarchaeology/structure_artifacts.yml | 16 +- .../Entities/Objects/Specific/atmos.yml | 6 +- .../Objects/Specific/chemical-containers.yml | 7 +- .../Objects/Specific/chemistry-bottles.yml | 9 +- .../Objects/Specific/chemistry-vials.yml | 9 +- .../Entities/Objects/Specific/chemistry.yml | 30 +- .../Entities/Objects/Specific/syndicate.yml | 4 +- .../Objects/Tools/access_configurator.yml | 4 +- .../Entities/Objects/Tools/appraisal.yml | 3 + .../Entities/Objects/Tools/bucket.yml | 8 +- .../Entities/Objects/Tools/cable_coils.yml | 3 + .../Entities/Objects/Tools/cowtools.yml | 9 +- .../Entities/Objects/Tools/decoys.yml | 47 +- .../Entities/Objects/Tools/flare.yml | 8 +- .../Entities/Objects/Tools/gas_tanks.yml | 7 +- .../Prototypes/Entities/Objects/Tools/gps.yml | 4 + .../Entities/Objects/Tools/hand_labeler.yml | 2 +- .../Objects/Tools/handheld_mass_scanner.yml | 4 +- .../Entities/Objects/Tools/jammer.yml | 32 +- .../Entities/Objects/Tools/jetpacks.yml | 2 +- .../Entities/Objects/Tools/spray_painter.yml | 4 +- .../Entities/Objects/Tools/t-ray.yml | 4 + .../Entities/Objects/Tools/toolbox.yml | 2 +- .../Entities/Objects/Tools/tools.yml | 16 +- .../Ammunition/Cartridges/base_cartridge.yml | 11 + .../Weapons/Guns/Basic/base_wieldable.yml | 12 + .../Objects/Weapons/Guns/Basic/watergun.yml | 4 +- .../Weapons/Guns/Battery/battery_guns.yml | 10 +- .../Entities/Objects/Weapons/Guns/Bow/bow.yml | 3 +- .../Objects/Weapons/Guns/LMGs/lmgs.yml | 1 + .../Weapons/Guns/Launchers/launchers.yml | 2 +- .../Weapons/Guns/Projectiles/arrows.yml | 3 +- .../Weapons/Guns/Projectiles/magic.yml | 33 + .../Weapons/Guns/Projectiles/projectiles.yml | 1 - .../Objects/Weapons/Guns/Rifles/rifles.yml | 2 +- .../Objects/Weapons/Guns/SMGs/smgs.yml | 8 +- .../Objects/Weapons/Guns/Snipers/snipers.yml | 4 +- .../Objects/Weapons/Guns/pneumatic_cannon.yml | 6 +- .../Objects/Weapons/Melee/baseball_bat.yml | 3 + .../Entities/Objects/Weapons/Melee/cane.yml | 7 +- .../Entities/Objects/Weapons/Melee/cult.yml | 2 +- .../Objects/Weapons/Melee/e_sword.yml | 5 +- .../Entities/Objects/Weapons/Melee/knife.yml | 1 - .../Objects/Weapons/Melee/stunprod.yml | 3 +- .../Entities/Objects/Weapons/Melee/sword.yml | 12 +- .../Objects/Weapons/Throwable/grenades.yml | 24 + .../Entities/Objects/Weapons/security.yml | 7 + .../Prototypes/Entities/Objects/base_item.yml | 4 +- .../Structures/Decoration/mannequin.yml | 4 +- .../Dispensers/base_structuredispensers.yml | 4 +- .../Entities/Structures/Dispensers/soda.yml | 8 +- .../Structures/Doors/Airlocks/access.yml | 18 +- .../Doors/Airlocks/base_structureairlocks.yml | 6 +- .../Structures/Doors/Airlocks/highsec.yml | 6 + .../Structures/Doors/Airlocks/shuttle.yml | 7 +- .../Structures/Doors/Firelocks/firelock.yml | 3 +- .../Structures/Doors/Shutter/shutters.yml | 4 +- .../Doors/Windoors/base_structurewindoors.yml | 9 +- .../Structures/Doors/Windoors/windoor.yml | 231 +- .../Structures/Furniture/bookshelf.yml | 4 +- .../Entities/Structures/Furniture/dresser.yml | 4 +- .../Entities/Structures/Furniture/toilet.yml | 9 +- .../Structures/Lighting/base_lighting.yml | 38 +- .../Structures/Lighting/ground_lighting.yml | 6 +- .../Structures/Lighting/strobe_lighting.yml | 4 +- .../Structures/Machines/Computers/arcades.yml | 9 +- .../Machines/Computers/computers.yml | 139 +- .../Machines/Computers/techdiskterminal.yml | 8 +- .../Structures/Machines/Medical/cryo_pod.yml | 4 +- .../Structures/Machines/anomaly_equipment.yml | 8 +- .../Structures/Machines/artifact_analyzer.yml | 57 +- .../Entities/Structures/Machines/bombs.yml | 2 +- .../Structures/Machines/chem_master.yml | 6 +- .../Structures/Machines/fax_machine.yml | 20 +- .../Structures/Machines/flatpacker.yml | 4 +- .../Entities/Structures/Machines/gateway.yml | 4 +- .../Structures/Machines/gravity_generator.yml | 4 +- .../Entities/Structures/Machines/hotplate.yml | 4 +- .../Entities/Structures/Machines/jukebox.yml | 4 +- .../Entities/Structures/Machines/lathe.yml | 132 +- .../Structures/Machines/microwave.yml | 5 +- .../Entities/Structures/Machines/nuke.yml | 4 +- .../Structures/Machines/reagent_grinder.yml | 7 +- .../Entities/Structures/Machines/research.yml | 4 +- .../Entities/Structures/Machines/salvage.yml | 4 +- .../Machines/surveillance_camera_routers.yml | 4 +- .../Structures/Machines/telecomms.yml | 84 +- .../Structures/Machines/vending_machines.yml | 8 +- .../Machines/wireless_surveillance_camera.yml | 2 +- .../Structures/Piping/Atmospherics/binary.yml | 6 +- .../Structures/Piping/Atmospherics/pipes.yml | 68 +- .../Piping/Atmospherics/portable.yml | 8 +- .../Piping/Atmospherics/trinary.yml | 9 +- .../Structures/Piping/Atmospherics/unary.yml | 7 +- .../Structures/Piping/Disposal/pipes.yml | 14 +- .../Structures/Piping/Disposal/units.yml | 18 +- .../Power/Generation/PA/control_box.yml | 8 +- .../Structures/Power/Generation/ame.yml | 4 +- .../Power/Generation/portable_generator.yml | 2 +- .../Entities/Structures/Power/apc.yml | 4 +- .../Entities/Structures/Power/substation.yml | 10 + .../Structures/Specific/Anomaly/anomalies.yml | 1 - .../Structures/Specific/Janitor/janicart.yml | 4 +- .../Storage/Canisters/gas_canisters.yml | 4 +- .../Storage/Crates/base_structurecrates.yml | 2 +- .../Structures/Storage/Crates/crates.yml | 4 +- .../Structures/Storage/filing_cabinets.yml | 8 +- .../Entities/Structures/Storage/glass_box.yml | 254 +- .../Entities/Structures/Storage/morgue.yml | 6 +- .../Entities/Structures/Storage/ore_box.yml | 4 +- .../Entities/Structures/Storage/storage.yml | 4 +- .../Structures/Wallmounts/air_alarm.yml | 8 +- .../Structures/Wallmounts/fire_alarm.yml | 4 +- .../Structures/Wallmounts/intercom.yml | 4 +- .../Entities/Structures/Wallmounts/mirror.yml | 32 +- .../Wallmounts/monitors_televisions.yml | 8 +- .../Structures/Wallmounts/noticeboard.yml | 4 +- .../Entities/Structures/Wallmounts/shelfs.yml | 5 +- .../Structures/Wallmounts/station_map.yml | 2 +- .../Wallmounts/surveillance_camera.yml | 4 +- .../Entities/Structures/Wallmounts/timer.yml | 4 +- .../Entities/Structures/cargo_telepad.yml | 2 + .../Entities/Structures/cryopod.yml | 4 +- .../Entities/Structures/plastic_flaps.yml | 36 +- .../Entities/Tiles/shadow_basalt.yml | 2 +- Resources/Prototypes/Flavors/flavors.yml | 30 + .../Prototypes/GameRules/cargo_gifts.yml | 17 +- Resources/Prototypes/GameRules/events.yml | 193 +- .../Prototypes/GameRules/meteorswarms.yml | 2 +- Resources/Prototypes/GameRules/midround.yml | 19 + Resources/Prototypes/GameRules/roundstart.yml | 219 +- .../Prototypes/GameRules/unknown_shuttles.yml | 74 + Resources/Prototypes/GameRules/variation.yml | 8 +- Resources/Prototypes/Guidebook/science.yml | 6 - Resources/Prototypes/Hydroponics/seeds.yml | 5 +- .../aghost_inventory_template.yml | 1 + .../arachnid_inventory_template.yml | 9 + .../corpse_inventory_template.yml | 5 + .../diona_inventory_template.yml | 7 + .../holoclown_inventory_template.yml | 2 + .../human_inventory_template.yml | 7 + .../kangaroo_inventory_template.yml | 3 + .../monkey_inventory_template.yml | 3 + .../Jobs/Medical/chief_medical_officer.yml | 27 + .../Loadouts/Jobs/Medical/medical_doctor.yml | 11 + .../Loadouts/Jobs/Security/detective.yml | 2 +- .../Prototypes/Loadouts/loadout_groups.yml | 20 +- Resources/Prototypes/Maps/Pools/default.yml | 1 + Resources/Prototypes/Maps/europa.yml | 2 + Resources/Prototypes/Maps/oasis.yml | 65 + Resources/Prototypes/NPCs/Combat/melee.yml | 6 +- Resources/Prototypes/NPCs/debug.yml | 84 + .../Prototypes/Objectives/base_objectives.yml | 8 + Resources/Prototypes/Objectives/ninja.yml | 18 +- Resources/Prototypes/Objectives/traitor.yml | 3 + Resources/Prototypes/Polymorphs/polymorph.yml | 11 + .../Reagents/Consumable/Drink/alcohol.yml | 8 +- .../Reagents/Consumable/Drink/drinks.yml | 30 +- .../Reagents/Consumable/Drink/juice.yml | 18 + .../Reagents/Consumable/Drink/soda.yml | 35 +- .../Reagents/Consumable/Food/food.yml | 8 +- Resources/Prototypes/Reagents/botany.yml | 8 + Resources/Prototypes/Reagents/gases.yml | 24 +- Resources/Prototypes/Reagents/medicine.yml | 21 + Resources/Prototypes/Reagents/narcotics.yml | 20 - Resources/Prototypes/Reagents/toxins.yml | 1 - .../Construction/Graphs/clothing/quiver.yml | 19 + .../Graphs/structures/glassbox.yml | 160 + .../Graphs/structures/plastic_flaps.yml | 51 - .../Graphs/utilities/wallmount_substation.yml | 32 +- .../Recipes/Construction/clothing.yml | 11 + .../Recipes/Construction/storage.yml | 18 + .../Recipes/Construction/structures.yml | 34 - .../Recipes/Cooking/meal_recipes.yml | 24 +- .../Recipes/Crafting/Graphs/bots/honkbot.yml | 26 +- .../Crafting/Graphs/bots/supplybot.yml | 23 + .../Graphs/improvised/makeshiftstunprod.yml | 51 +- .../Prototypes/Recipes/Crafting/bots.yml | 13 + .../Prototypes/Recipes/Lathes/clothing.yml | 16 + .../Prototypes/Recipes/Lathes/cooking.yml | 7 + .../Prototypes/Recipes/Lathes/electronics.yml | 190 +- .../Prototypes/Recipes/Lathes/janitorial.yml | 2 +- .../Prototypes/Recipes/Lathes/medical.yml | 2 +- .../Prototypes/Recipes/Lathes/security.yml | 20 + .../Prototypes/Recipes/Reactions/drinks.yml | 64 + .../Prototypes/Recipes/Reactions/medicine.yml | 18 +- .../Recipes/Reactions/pyrotechnic.yml | 2 +- Resources/Prototypes/Research/arsenal.yml | 1 + .../Prototypes/Research/civilianservices.yml | 6 +- .../Prototypes/Research/experimental.yml | 5 +- Resources/Prototypes/Research/industrial.yml | 1 + Resources/Prototypes/Roles/Antags/nukeops.yml | 6 +- .../Prototypes/Roles/Ghostroles/syndicate.yml | 27 + .../Roles/Jobs/Fun/misc_startinggear.yml | 171 +- Resources/Prototypes/Shaders/displacement.yml | 10 + .../Shuttles/shuttle_incoming_event.yml | 29 + .../SoundCollections/expeditions.yml | 5 + .../Prototypes/Stacks/Materials/materials.yml | 1 + Resources/Prototypes/StatusEffects/health.yml | 4 +- .../Prototypes/StatusEffects/security.yml | 2 +- Resources/Prototypes/StatusIcon/antag.yml | 2 +- .../Store/meatyore_store_presset.yml | 2 +- Resources/Prototypes/Traits/disabilities.yml | 12 + Resources/Prototypes/Traits/neutral.yml | 9 + .../Prototypes/Voice/speech_emote_sounds.yml | 32 +- .../XenoArch/Effects/normal_effects.yml | 2 +- .../XenoArch/Effects/utility_effects.yml | 4 +- Resources/Prototypes/_White/Cult/cult.yml | 6 + .../Prototypes/_White/Economy/eftpos.yml | 4 +- .../Clothing/Head/night_vision_goggle.yml | 7 +- .../Clothing/OuterClothing/hardsuits.yml | 43 + .../Entities/Cult/Altars/cult_altars.yml | 12 +- .../_White/Entities/Cult/Items/hands.yml | 4 +- .../_White/Entities/Cult/Items/tome_craft.yml | 9 +- .../_White/Entities/Cult/Runes/cult_runes.yml | 4 +- .../_White/Entities/Cult/constructs.yml | 2 +- .../Objects/Misc/armaments_beacon.yml | 4 +- .../Objects/Misc/interactiveboard.yml | 4 +- .../Entities/Objects/Tools/tricorder.yml | 20 +- .../Objects/Weapons/chaplain_weapons.yml | 4 +- .../Structures/Machines/doc_printer.yml | 8 +- .../Entities/Structures/Storage/Barrel.yml | 4 +- .../Entities/Structures/Wallmounts/auth.yml | 2 +- .../Structures/Wallmounts/consoles.yml | 20 +- .../Entities/Structures/Wallmounts/mirror.yml | 2 +- Resources/Prototypes/_White/Fluff/fluff.yml | 12 +- .../_White/JukeboxAndStuff/jukebox_stuff.yml | 6 +- Resources/Prototypes/_White/Maps/wizard.yml | 20 + .../Prototypes/_White/Mobs/Species/harpy.yml | 22 +- .../_White/Mood/generic_positveEffects.yml | 6 + .../_White/Recipes/lathe_recipes.yml | 16 - .../_White/Structures/Machines/atm.yml | 4 +- .../Prototypes/_White/Wizard/magic_items.yml | 4 +- .../Prototypes/_White/Wizard/spellbook.yml | 4 +- Resources/Prototypes/_White/Wizard/wizard.yml | 20 +- Resources/Prototypes/_White/sechud.yml | 10 +- Resources/Prototypes/floor_trap.yml | 116 + Resources/Prototypes/game_presets.yml | 13 - .../Prototypes/name_identifier_groups.yml | 6 + Resources/Prototypes/tags.yml | 24 +- Resources/Prototypes/themes.yml | 14 + .../Guidebook/Antagonist/Antagonists.xml | 1 + .../Guidebook/Antagonist/Revolutionaries.xml | 6 +- .../Guidebook/Antagonist/SpaceNinja.xml | 94 +- .../ServerInfo/Guidebook/Engineering/AME.xml | 33 +- .../Engineering/AccessConfigurator.xml | 46 +- .../Guidebook/Engineering/AirlockSecurity.xml | 130 +- .../Guidebook/Engineering/Atmospherics.xml | 91 +- .../Guidebook/Engineering/Construction.xml | 12 +- .../Guidebook/Engineering/Engineering.xml | 33 +- .../Guidebook/Engineering/Fires.xml | 22 +- .../Engineering/NetworkConfigurator.xml | 57 +- .../Guidebook/Engineering/Networking.xml | 37 +- .../Engineering/PortableGenerator.xml | 15 +- .../Guidebook/Engineering/Power.xml | 70 +- .../ServerInfo/Guidebook/Engineering/RTG.xml | 29 +- .../Guidebook/Engineering/Shuttlecraft.xml | 62 +- .../Guidebook/Engineering/Singularity.xml | 199 +- .../ServerInfo/Guidebook/Engineering/TEG.xml | 75 +- .../ServerInfo/Guidebook/Medical/Chemist.xml | 2 +- .../Guidebook/Medical/Cryogenics.xml | 6 +- .../ServerInfo/Guidebook/Medical/Medical.xml | 2 +- .../ServerInfo/Guidebook/Mobs/SlimePerson.xml | 16 +- .../Guidebook/Science/ArtifactReports.xml | 29 +- .../Guidebook/Science/TraversalDistorter.xml | 18 - .../Guidebook/Science/Xenoarchaeology.xml | 52 +- .../Guidebook/Security/Forensics.xml | 4 +- .../Guidebook/Service/Bartender.xml | 3 +- .../Eyes/Hud/syndagent.rsi/equipped-EYES.png | Bin 0 -> 5126 bytes .../Clothing/Eyes/Hud/syndagent.rsi/icon.png | Bin 0 -> 5331 bytes .../Eyes/Hud/syndagent.rsi/inhand-left.png | Bin 0 -> 4629 bytes .../Eyes/Hud/syndagent.rsi/inhand-right.png | Bin 0 -> 4636 bytes .../Clothing/Eyes/Hud/syndagent.rsi/meta.json | 26 + .../Hands/Gloves/combat.rsi/equipped-HAND.png | Bin 0 -> 441 bytes .../Clothing/Hands/Gloves/combat.rsi/icon.png | Bin 0 -> 591 bytes .../Hands/Gloves/combat.rsi/inhand-left.png | Bin 0 -> 564 bytes .../Hands/Gloves/combat.rsi/inhand-right.png | Bin 0 -> 567 bytes .../Hands/Gloves/combat.rsi/meta.json | 26 + .../black.rsi/equipped-HELMET-vox.png | Bin 0 -> 568 bytes .../Bandanas/black.rsi/equipped-MASK-vox.png | Bin 0 -> 528 bytes .../Head/Bandanas/black.rsi/meta.json | 10 +- .../Bandanas/blue.rsi/equipped-HELMET-vox.png | Bin 0 -> 578 bytes .../Bandanas/blue.rsi/equipped-MASK-vox.png | Bin 0 -> 552 bytes .../Clothing/Head/Bandanas/blue.rsi/meta.json | 10 +- .../botany.rsi/equipped-HELMET-vox.png | Bin 0 -> 725 bytes .../Bandanas/botany.rsi/equipped-MASK-vox.png | Bin 0 -> 629 bytes .../Head/Bandanas/botany.rsi/meta.json | 8 +- .../Bandanas/gold.rsi/equipped-HELMET-vox.png | Bin 0 -> 559 bytes .../Bandanas/gold.rsi/equipped-MASK-vox.png | Bin 0 -> 565 bytes .../Clothing/Head/Bandanas/gold.rsi/meta.json | 10 +- .../green.rsi/equipped-HELMET-vox.png | Bin 0 -> 545 bytes .../Bandanas/green.rsi/equipped-MASK-vox.png | Bin 0 -> 558 bytes .../Head/Bandanas/green.rsi/meta.json | 10 +- .../Bandanas/grey.rsi/equipped-HELMET-vox.png | Bin 0 -> 635 bytes .../Bandanas/grey.rsi/equipped-MASK-vox.png | Bin 0 -> 591 bytes .../Clothing/Head/Bandanas/grey.rsi/meta.json | 10 +- .../Bandanas/red.rsi/equipped-HELMET-vox.png | Bin 0 -> 531 bytes .../Bandanas/red.rsi/equipped-MASK-vox.png | Bin 0 -> 545 bytes .../Clothing/Head/Bandanas/red.rsi/meta.json | 10 +- .../skull.rsi/equipped-HELMET-vox.png | Bin 0 -> 382 bytes .../Bandanas/skull.rsi/equipped-MASK-vox.png | Bin 0 -> 639 bytes .../Head/Bandanas/skull.rsi/meta.json | 10 +- .../gladiator.rsi/equipped-HELMET-vox.png | Bin 0 -> 1863 bytes .../Head/Hats/gladiator.rsi/meta.json | 8 +- .../Hats/paper.rsi/equipped-HELMET-vox.png | Bin 0 -> 431 bytes .../Clothing/Head/Hats/paper.rsi/meta.json | 6 +- .../surgcap_blue.rsi/equipped-HELMET-vox.png | Bin 0 -> 524 bytes .../Head/Hats/surgcap_blue.rsi/meta.json | 6 +- .../surgcap_green.rsi/equipped-HELMET-vox.png | Bin 0 -> 529 bytes .../Head/Hats/surgcap_green.rsi/meta.json | 6 +- .../equipped-HELMET-vox.png | Bin 0 -> 537 bytes .../Head/Hats/surgcap_purple.rsi/meta.json | 6 +- .../templar.rsi/equipped-HELMET-vox.png | Bin 0 -> 1436 bytes .../Head/Helmets/templar.rsi/meta.json | 6 +- .../wizardhelm.rsi/equipped-HELMET-vox.png | Bin 0 -> 916 bytes .../Head/Helmets/wizardhelm.rsi/meta.json | 6 +- .../Hoods/Bio/bio.rsi/equipped-HELMET-vox.png | Bin 0 -> 933 bytes .../Clothing/Head/Hoods/Bio/bio.rsi/meta.json | 6 +- .../Hoods/Bio/cmo.rsi/equipped-HELMET-vox.png | Bin 0 -> 880 bytes .../Clothing/Head/Hoods/Bio/cmo.rsi/meta.json | 6 +- .../Bio/general.rsi/equipped-HELMET-vox.png | Bin 0 -> 933 bytes .../Head/Hoods/Bio/general.rsi/meta.json | 6 +- .../Bio/janitor.rsi/equipped-HELMET-vox.png | Bin 0 -> 855 bytes .../Head/Hoods/Bio/janitor.rsi/meta.json | 6 +- .../Bio/scientist.rsi/equipped-HELMET-vox.png | Bin 0 -> 1136 bytes .../Head/Hoods/Bio/scientist.rsi/meta.json | 6 +- .../Bio/security.rsi/equipped-HELMET-vox.png | Bin 0 -> 928 bytes .../Head/Hoods/Bio/security.rsi/meta.json | 6 +- .../Bio/virology.rsi/equipped-HELMET-vox.png | Bin 0 -> 920 bytes .../Head/Hoods/Bio/virology.rsi/meta.json | 6 +- .../chickenhead.rsi/equipped-HELMET-vox.png | Bin 0 -> 536 bytes .../Head/Misc/chickenhead.rsi/meta.json | 6 +- .../Misc/head_mirror.rsi/equipped-HELMET.png | Bin 0 -> 631 bytes .../Head/Misc/head_mirror.rsi/icon.png | Bin 0 -> 714 bytes .../Head/Misc/head_mirror.rsi/inhand-left.png | Bin 0 -> 678 bytes .../Misc/head_mirror.rsi/inhand-right.png | Bin 0 -> 680 bytes .../Head/Misc/head_mirror.rsi/meta.json | 26 + .../equipped-HELMET-vox.png | Bin 0 -> 578 bytes .../blue_flame_welding_mask.rsi/meta.json | 10 +- .../up-equipped-HELMET-vox.png | Bin 0 -> 1090 bytes .../equipped-HELMET-vox.png | Bin 0 -> 565 bytes .../Welding/flame_welding_mask.rsi/meta.json | 12 +- .../up-equipped-HELMET-vox.png | Bin 0 -> 1080 bytes .../up-equipped-HELMET.png | Bin 1037 -> 1078 bytes .../equipped-HELMET-vox.png | Bin 0 -> 513 bytes .../Head/Welding/paintedwelding.rsi/meta.json | 10 +- .../up-equipped-HELMET-vox.png | Bin 0 -> 897 bytes .../welding.rsi/equipped-HELMET-vox.png | Bin 0 -> 947 bytes .../Head/Welding/welding.rsi/meta.json | 10 +- .../welding.rsi/up-equipped-HELMET-vox.png | Bin 0 -> 1043 bytes .../Mask/bee.rsi/equipped-MASK-vox.png | Bin 0 -> 814 bytes .../Textures/Clothing/Mask/bee.rsi/meta.json | 6 +- .../Clothing/Mask/breath.rsi/meta.json | 14 +- .../Mask/breath.rsi/up-equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Mask/clown.rsi/equipped-MASK-vox.png | Bin 0 -> 729 bytes .../Clothing/Mask/clown.rsi/meta.json | 6 +- .../Mask/gas.rsi/equipped-MASK-vox.png | Bin 0 -> 672 bytes .../Textures/Clothing/Mask/gas.rsi/meta.json | 6 +- .../Mask/gasatmos.rsi/equipped-MASK-vox.png | Bin 0 -> 621 bytes .../Clothing/Mask/gasatmos.rsi/meta.json | 6 +- .../Mask/gascaptain.rsi/equipped-MASK-vox.png | Bin 0 -> 634 bytes .../Clothing/Mask/gascaptain.rsi/meta.json | 6 +- .../gassecurity.rsi/equipped-MASK-vox.png | Bin 0 -> 585 bytes .../Clothing/Mask/gassecurity.rsi/meta.json | 18 +- .../gassecurity.rsi/up-equipped-MASK-vox.png | Bin 0 -> 588 bytes .../gassyndicate.rsi/equipped-MASK-vox.png | Bin 0 -> 633 bytes .../Clothing/Mask/gassyndicate.rsi/meta.json | 12 +- .../equipped-MASK-vox.png | Bin 0 -> 301 bytes .../Mask/italian_moustache.rsi/meta.json | 6 +- .../Mask/medical.rsi/equipped-MASK-vox.png | Bin 0 -> 500 bytes .../Clothing/Mask/medical.rsi/meta.json | 10 +- .../Mask/medical.rsi/up-equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Mask/mime.rsi/equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Textures/Clothing/Mask/mime.rsi/meta.json | 6 +- .../Mask/muzzle.rsi/equipped-MASK-vox.png | Bin 0 -> 530 bytes .../Clothing/Mask/muzzle.rsi/meta.json | 6 +- .../Mask/ninja.rsi/equipped-MASK-vox.png | Bin 0 -> 552 bytes .../Clothing/Mask/ninja.rsi/meta.json | 6 +- .../equipped-MASK-vox.png | Bin 0 -> 893 bytes .../Mask/plaguedoctormask.rsi/meta.json | 6 +- .../Mask/sexyclown.rsi/equipped-MASK-vox.png | Bin 0 -> 992 bytes .../Clothing/Mask/sexyclown.rsi/meta.json | 6 +- .../Mask/sexymime.rsi/equipped-MASK-vox.png | Bin 0 -> 598 bytes .../Clothing/Mask/sexymime.rsi/meta.json | 6 +- .../Mask/sterile.rsi/equipped-MASK-vox.png | Bin 0 -> 478 bytes .../Clothing/Mask/sterile.rsi/meta.json | 18 +- .../Mask/sterile.rsi/up-equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Mask/swat.rsi/equipped-MASK-vox.png | Bin 0 -> 885 bytes .../Textures/Clothing/Mask/swat.rsi/meta.json | 14 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 978 bytes .../Armor/armor_reflec.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 828 bytes .../Armor/cult_armour.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3210 bytes .../Armor/heavygreen.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3161 bytes .../Armor/heavyred.rsi/meta.json | 4 +- .../cmo.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3106 bytes .../OuterClothing/Bio/cmo.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2834 bytes .../OuterClothing/Bio/general.rsi/meta.json | 5 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3141 bytes .../OuterClothing/Bio/janitor.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2771 bytes .../OuterClothing/Bio/scientist.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3236 bytes .../OuterClothing/Bio/security.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2945 bytes .../OuterClothing/Bio/virology.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1202 bytes .../Coats/jensencoat.rsi/meta.json | 4 +- .../pirate.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1244 bytes .../OuterClothing/Coats/pirate.rsi/meta.json | 4 +- .../warden.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1780 bytes .../OuterClothing/Coats/warden.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 645 bytes .../Misc/apronbotanist.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 534 bytes .../Misc/apronchef.rsi/meta.json | 4 +- .../chef.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1498 bytes .../OuterClothing/Misc/chef.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 839 bytes .../Misc/classicponcho.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1558 bytes .../OuterClothing/Misc/nunrobe.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1354 bytes .../OuterClothing/Suits/chicken.rsi/meta.json | 6 +- .../fire.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2588 bytes .../OuterClothing/Suits/fire.rsi/meta.json | 4 +- .../coat.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1044 bytes .../WinterCoats/coat.rsi/meta.json | 60 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1355 bytes .../WinterCoats/coatatmos.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1358 bytes .../WinterCoats/coatbar.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 655 bytes .../WinterCoats/coatcap.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1376 bytes .../WinterCoats/coatcargo.rsi/meta.json | 4 +- .../coatce.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1300 bytes .../WinterCoats/coatce.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1302 bytes .../WinterCoats/coatclown.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1321 bytes .../WinterCoats/coatengi.rsi/meta.json | 60 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1323 bytes .../WinterCoats/coathydro.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1286 bytes .../WinterCoats/coatmed.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 964 bytes .../WinterCoats/coatmime.rsi/meta.json | 60 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1212 bytes .../WinterCoats/coatminer.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1169 bytes .../WinterCoats/coatparamed.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1210 bytes .../WinterCoats/coatsci.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1232 bytes .../WinterCoats/coatsec.rsi/meta.json | 4 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1930 bytes .../WinterCoats/coatwarden.rsi/meta.json | 6 +- .../Boots/jackboots.rsi/equipped-FEET-vox.png | Bin 0 -> 532 bytes .../Shoes/Boots/jackboots.rsi/meta.json | 4 +- .../equipped-FEET-vox.png | Bin 0 -> 457 bytes .../Boots/magboots-advanced.rsi/meta.json | 10 +- .../on-equipped-FEET-vox.png | Bin 0 -> 852 bytes .../equipped-FEET-vox.png | Bin 0 -> 922 bytes .../Boots/magboots-syndicate.rsi/meta.json | 6 +- .../on-equipped-FEET-vox.png | Bin 0 -> 921 bytes .../Boots/magboots.rsi/equipped-FEET-vox.png | Bin 0 -> 461 bytes .../Shoes/Boots/magboots.rsi/meta.json | 10 +- .../magboots.rsi/on-equipped-FEET-vox.png | Bin 0 -> 839 bytes .../Misc/slippers.rsi/equipped-FEET-vox.png | Bin 0 -> 553 bytes .../Shoes/Misc/slippers.rsi/meta.json | 4 +- .../Misc/tourist.rsi/equipped-FEET-vox.png | Bin 0 -> 553 bytes .../Clothing/Shoes/Misc/tourist.rsi/meta.json | 54 +- .../Specific/clown.rsi/equipped-FEET-vox.png | Bin 0 -> 539 bytes .../Shoes/Specific/clown.rsi/meta.json | 6 +- .../Specific/swat.rsi/equipped-FEET-vox.png | Bin 0 -> 532 bytes .../Shoes/Specific/swat.rsi/meta.json | 54 +- .../Specific/wizard.rsi/equipped-FEET-vox.png | Bin 0 -> 345 bytes .../Shoes/Specific/wizard.rsi/meta.json | 4 +- .../equipped-INNERCLOTHING-monkey.png | Bin 0 -> 1183 bytes .../cmo_turtle.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1338 bytes .../Jumpskirt/cmo_turtle.rsi/icon.png | Bin 0 -> 842 bytes .../Jumpskirt/cmo_turtle.rsi/inhand-left.png | Bin 0 -> 893 bytes .../Jumpskirt/cmo_turtle.rsi/inhand-right.png | Bin 0 -> 921 bytes .../Jumpskirt/cmo_turtle.rsi/meta.json | 30 + .../olddress.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1263 bytes .../Uniforms/Jumpskirt/olddress.rsi/icon.png | Bin 0 -> 533 bytes .../Jumpskirt/olddress.rsi/inhand-left.png | Bin 0 -> 566 bytes .../Jumpskirt/olddress.rsi/inhand-right.png | Bin 0 -> 612 bytes .../Uniforms/Jumpskirt/olddress.rsi/meta.json | 26 + .../equipped-INNERCLOTHING-monkey.png | Bin 950 -> 864 bytes .../equipped-INNERCLOTHING.png | Bin 1310 -> 1215 bytes .../Jumpskirt/senior_physician.rsi/icon.png | Bin 538 -> 546 bytes .../senior_physician.rsi/inhand-left.png | Bin 619 -> 621 bytes .../senior_physician.rsi/inhand-right.png | Bin 610 -> 595 bytes .../equipped-INNERCLOTHING-monkey.png | Bin 0 -> 1277 bytes .../cmo_turtle.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1449 bytes .../Uniforms/Jumpsuit/cmo_turtle.rsi/icon.png | Bin 0 -> 837 bytes .../Jumpsuit/cmo_turtle.rsi/inhand-left.png | Bin 0 -> 892 bytes .../Jumpsuit/cmo_turtle.rsi/inhand-right.png | Bin 0 -> 917 bytes .../Jumpsuit/cmo_turtle.rsi/meta.json | 30 + .../Uniforms/Jumpsuit/security.rsi/meta.json | 2 +- .../equipped-INNERCLOTHING-monkey.png | Bin 987 -> 929 bytes .../equipped-INNERCLOTHING.png | Bin 1240 -> 1198 bytes .../Jumpsuit/senior_physician.rsi/icon.png | Bin 482 -> 493 bytes .../senior_physician.rsi/inhand-left.png | Bin 619 -> 621 bytes .../senior_physician.rsi/inhand-right.png | Bin 610 -> 595 bytes .../Alerts/deflecting.rsi/deflecting0.png | Bin 0 -> 1761 bytes .../Alerts/deflecting.rsi}/meta.json | 4 +- .../Interface/Ashen/item_status_left.png | Bin 0 -> 255 bytes .../Ashen/item_status_left_highlight.png | Bin 0 -> 195 bytes .../Interface/Ashen/item_status_right.png | Bin 0 -> 246 bytes .../Ashen/item_status_right_highlight.png | Bin 0 -> 189 bytes .../Interface/Ashen/template_small.png | Bin 0 -> 1282 bytes .../Interface/Clockwork/item_status_left.png | Bin 0 -> 371 bytes .../Clockwork/item_status_left_highlight.png | Bin 0 -> 307 bytes .../Interface/Clockwork/item_status_right.png | Bin 0 -> 389 bytes .../Clockwork/item_status_right_highlight.png | Bin 0 -> 326 bytes .../Interface/Default/item_status_left.png | Bin 0 -> 264 bytes .../Default/item_status_left_highlight.png | Bin 0 -> 251 bytes .../Interface/Default/item_status_right.png | Bin 0 -> 258 bytes .../Default/item_status_right_highlight.png | Bin 0 -> 237 bytes .../Interface/Minimalist/SlotBackground.png | Bin 240 -> 266 bytes .../Interface/Minimalist/item_status_left.png | Bin 0 -> 208 bytes .../Minimalist/item_status_left_highlight.png | Bin 0 -> 277 bytes .../Minimalist/item_status_right.png | Bin 0 -> 198 bytes .../item_status_right_highlight.png | Bin 0 -> 249 bytes .../Interface/Minimalist/template_small.png | Bin 0 -> 266 bytes Resources/Textures/Interface/Nano/help.png | Bin 0 -> 636 bytes .../Interface/Nano/item_status_left.svg | 100 - .../Nano/item_status_left.svg.96dpi.png | Bin 216 -> 0 bytes .../Interface/Nano/item_status_middle.svg | 100 - .../Nano/item_status_middle.svg.96dpi.png | Bin 220 -> 0 bytes .../Interface/Nano/item_status_right.svg | 100 - .../Nano/item_status_right.svg.96dpi.png | Bin 225 -> 0 bytes .../Interface/Plasmafire/item_status_left.png | Bin 0 -> 271 bytes .../Plasmafire/item_status_left_highlight.png | Bin 0 -> 220 bytes .../Plasmafire/item_status_right.png | Bin 0 -> 271 bytes .../item_status_right_highlight.png | Bin 0 -> 206 bytes .../Interface/Retro/item_status_left.png | Bin 0 -> 249 bytes .../Retro/item_status_left_highlight.png | Bin 0 -> 235 bytes .../Interface/Retro/item_status_right.png | Bin 0 -> 239 bytes .../Retro/item_status_right_highlight.png | Bin 0 -> 253 bytes .../Interface/Retro/template_small.png | Bin 0 -> 96 bytes .../Interface/Slimecore/item_status_left.png | Bin 0 -> 280 bytes .../Slimecore/item_status_left_highlight.png | Bin 0 -> 219 bytes .../Interface/Slimecore/item_status_right.png | Bin 0 -> 267 bytes .../Slimecore/item_status_right_highlight.png | Bin 0 -> 206 bytes .../Textures/LobbyScreens/attributions.yml | 5 + .../Textures/LobbyScreens/justaweekaway.webp | Bin 0 -> 309680 bytes .../Textures/LobbyScreens/justaweekaway.yml | 2 + .../Customization/human_hair.rsi/meta.json | 4 + .../human_hair.rsi/spookylong.png | Bin 0 -> 755 bytes .../reptilian_parts.rsi/frills_axolotl.png | Bin 412 -> 521 bytes .../reptilian_parts.rsi/frills_neckfull.png | Bin 0 -> 649 bytes .../reptilian_parts.rsi/meta.json | 860 +- .../snout_splotch_primary.png | Bin 0 -> 262 bytes .../snout_splotch_secondary.png | Bin 0 -> 230 bytes .../Species/Vox/displacement.rsi/jumpsuit.png | Bin 0 -> 906 bytes .../Species/Vox/displacement.rsi/meta.json | 18 + .../Drinks/budgetinsulsdrink.rsi/fill-1.png | Bin 0 -> 282 bytes .../Drinks/budgetinsulsdrink.rsi/fill-2.png | Bin 0 -> 298 bytes .../Drinks/budgetinsulsdrink.rsi/fill-3.png | Bin 0 -> 313 bytes .../Drinks/budgetinsulsdrink.rsi/icon.png | Bin 0 -> 313 bytes .../budgetinsulsdrink.rsi/icon_empty.png | Bin 0 -> 220 bytes .../Drinks/budgetinsulsdrink.rsi/meta.json | 28 + .../Drinks/coffeeglass.rsi/fill-1.png | Bin 0 -> 2962 bytes .../Drinks/coffeeglass.rsi/fill-2.png | Bin 0 -> 2988 bytes .../Drinks/coffeeglass.rsi/fill-3.png | Bin 0 -> 2985 bytes .../Drinks/coffeeglass.rsi/fill-4.png | Bin 0 -> 2988 bytes .../Drinks/coffeeglass.rsi/icon.png | Bin 0 -> 3113 bytes .../Drinks/coffeeglass.rsi/icon_empty.png | Bin 0 -> 3069 bytes .../Drinks/coffeeglass.rsi/meta.json | 29 + .../Drinks/colaglass.rsi/fill-1.png | Bin 0 -> 2916 bytes .../Drinks/colaglass.rsi/fill-2.png | Bin 0 -> 2937 bytes .../Drinks/colaglass.rsi/fill-3.png | Bin 0 -> 2946 bytes .../Drinks/colaglass.rsi/fill-4.png | Bin 0 -> 2958 bytes .../Drinks/colaglass.rsi/fill-5.png | Bin 0 -> 2961 bytes .../Consumable/Drinks/colaglass.rsi/icon.png | Bin 0 -> 3178 bytes .../Drinks/colaglass.rsi/icon_empty.png | Bin 0 -> 3161 bytes .../Consumable/Drinks/colaglass.rsi/meta.json | 32 + .../Drinks/dr_gibb_glass.rsi/fill-1.png | Bin 0 -> 2909 bytes .../Drinks/dr_gibb_glass.rsi/fill-2.png | Bin 0 -> 2911 bytes .../Drinks/dr_gibb_glass.rsi/fill-3.png | Bin 0 -> 2925 bytes .../Drinks/dr_gibb_glass.rsi/fill-4.png | Bin 0 -> 2920 bytes .../Drinks/dr_gibb_glass.rsi/fill-5.png | Bin 0 -> 2946 bytes .../Drinks/dr_gibb_glass.rsi/icon.png | Bin 305 -> 3135 bytes .../Drinks/dr_gibb_glass.rsi/icon_empty.png | Bin 0 -> 3087 bytes .../Drinks/dr_gibb_glass.rsi/meta.json | 33 +- .../Drinks/energy_drink.rsi/icon.png | Bin 504 -> 450 bytes .../Drinks/energy_drink.rsi/icon_open.png | Bin 488 -> 440 bytes .../Drinks/greenteaglass.rsi/fill-1.png | Bin 0 -> 2903 bytes .../Drinks/greenteaglass.rsi/fill-2.png | Bin 0 -> 2915 bytes .../Drinks/greenteaglass.rsi/fill-3.png | Bin 0 -> 2931 bytes .../Drinks/greenteaglass.rsi/fill-4.png | Bin 0 -> 2931 bytes .../Drinks/greenteaglass.rsi/icon.png | Bin 0 -> 3116 bytes .../Drinks/greenteaglass.rsi/icon_empty.png | Bin 0 -> 3098 bytes .../Drinks/greenteaglass.rsi/meta.json | 29 + .../Consumable/Drinks/icebucket.rsi/icon.png | Bin 0 -> 554 bytes .../Consumable/Drinks/icebucket.rsi/meta.json | 14 + .../Drinks/icedgreenteaglass.rsi/fill-1.png | Bin 0 -> 2925 bytes .../Drinks/icedgreenteaglass.rsi/fill-2.png | Bin 0 -> 2945 bytes .../Drinks/icedgreenteaglass.rsi/fill-3.png | Bin 0 -> 2984 bytes .../Drinks/icedgreenteaglass.rsi/fill-4.png | Bin 0 -> 2993 bytes .../Drinks/icedgreenteaglass.rsi/fill-5.png | Bin 0 -> 3025 bytes .../Drinks/icedgreenteaglass.rsi/icon.png | Bin 0 -> 3190 bytes .../icedgreenteaglass.rsi/icon_empty.png | Bin 0 -> 3032 bytes .../Drinks/icedgreenteaglass.rsi/meta.json | 32 + .../Consumable/Drinks/iceglass.rsi/fill-1.png | Bin 0 -> 2935 bytes .../Consumable/Drinks/iceglass.rsi/fill-2.png | Bin 0 -> 2978 bytes .../Consumable/Drinks/iceglass.rsi/fill-3.png | Bin 0 -> 3005 bytes .../Consumable/Drinks/iceglass.rsi/icon.png | Bin 363 -> 3215 bytes .../Drinks/iceglass.rsi/icon_empty.png | Bin 0 -> 3071 bytes .../Consumable/Drinks/iceglass.rsi/meta.json | 27 +- .../Consumable/Drinks/jigger.rsi/icon.png | Bin 0 -> 314 bytes .../Consumable/Drinks/jigger.rsi/meta.json | 14 + .../Drinks/lemonjuiceglass.rsi/fill-1.png | Bin 0 -> 2981 bytes .../Drinks/lemonjuiceglass.rsi/fill-2.png | Bin 0 -> 2993 bytes .../Drinks/lemonjuiceglass.rsi/fill-3.png | Bin 0 -> 2993 bytes .../Drinks/lemonjuiceglass.rsi/fill-4.png | Bin 0 -> 3000 bytes .../Drinks/lemonjuiceglass.rsi/fill-5.png | Bin 0 -> 3004 bytes .../Drinks/lemonjuiceglass.rsi/icon.png | Bin 0 -> 3308 bytes .../Drinks/lemonjuiceglass.rsi/icon_empty.png | Bin 0 -> 3278 bytes .../Drinks/lemonjuiceglass.rsi/meta.json | 32 + .../Drinks/moonshineglass.rsi/fill-1.png | Bin 0 -> 2930 bytes .../Drinks/moonshineglass.rsi/fill-2.png | Bin 0 -> 2929 bytes .../Drinks/moonshineglass.rsi/fill-3.png | Bin 0 -> 2937 bytes .../Drinks/moonshineglass.rsi/fill-4.png | Bin 0 -> 2970 bytes .../Drinks/moonshineglass.rsi/fill-5.png | Bin 0 -> 2971 bytes .../Drinks/moonshineglass.rsi/fill-6.png | Bin 0 -> 2967 bytes .../Drinks/moonshineglass.rsi/icon.png | Bin 0 -> 3067 bytes .../Drinks/moonshineglass.rsi/icon_empty.png | Bin 0 -> 3018 bytes .../Drinks/moonshineglass.rsi/meta.json | 35 + .../Drinks/orangejuiceglass.rsi/fill-1.png | Bin 0 -> 2956 bytes .../Drinks/orangejuiceglass.rsi/fill-2.png | Bin 0 -> 2960 bytes .../Drinks/orangejuiceglass.rsi/fill-3.png | Bin 0 -> 2972 bytes .../Drinks/orangejuiceglass.rsi/fill-4.png | Bin 0 -> 2981 bytes .../Drinks/orangejuiceglass.rsi/fill-5.png | Bin 0 -> 2982 bytes .../Drinks/orangejuiceglass.rsi/icon.png | Bin 0 -> 3136 bytes .../orangejuiceglass.rsi/icon_empty.png | Bin 0 -> 3121 bytes .../Drinks/orangejuiceglass.rsi/meta.json | 32 + .../Drinks/rubberneck.rsi/fill-1.png | Bin 0 -> 277 bytes .../Drinks/rubberneck.rsi/fill-2.png | Bin 0 -> 278 bytes .../Drinks/rubberneck.rsi/fill-3.png | Bin 0 -> 278 bytes .../Consumable/Drinks/rubberneck.rsi/icon.png | Bin 0 -> 278 bytes .../Drinks/rubberneck.rsi/icon_empty.png | Bin 0 -> 277 bytes .../Drinks/rubberneck.rsi/meta.json | 28 + .../Drinks/space-up_glass.rsi/fill-1.png | Bin 0 -> 2925 bytes .../Drinks/space-up_glass.rsi/fill-2.png | Bin 0 -> 2940 bytes .../Drinks/space-up_glass.rsi/fill-3.png | Bin 0 -> 2940 bytes .../Drinks/space-up_glass.rsi/fill-4.png | Bin 0 -> 2953 bytes .../Drinks/space-up_glass.rsi/fill-5.png | Bin 0 -> 2955 bytes .../Drinks/space-up_glass.rsi/fill-6.png | Bin 0 -> 2961 bytes .../Drinks/space-up_glass.rsi/icon.png | Bin 320 -> 3131 bytes .../Drinks/space-up_glass.rsi/icon_empty.png | Bin 0 -> 3094 bytes .../Drinks/space-up_glass.rsi/meta.json | 36 +- .../space_mountain_wind_glass.rsi/fill-1.png | Bin 0 -> 2934 bytes .../space_mountain_wind_glass.rsi/fill-2.png | Bin 0 -> 2945 bytes .../space_mountain_wind_glass.rsi/fill-3.png | Bin 0 -> 2956 bytes .../space_mountain_wind_glass.rsi/fill-4.png | Bin 0 -> 2963 bytes .../space_mountain_wind_glass.rsi/fill-5.png | Bin 0 -> 2990 bytes .../space_mountain_wind_glass.rsi/icon.png | Bin 404 -> 3160 bytes .../icon_empty.png | Bin 0 -> 3119 bytes .../space_mountain_wind_glass.rsi/meta.json | 33 +- .../Drinks/sugarglass.rsi/fill-1.png | Bin 0 -> 2874 bytes .../Drinks/sugarglass.rsi/fill-2.png | Bin 0 -> 2893 bytes .../Drinks/sugarglass.rsi/fill-3.png | Bin 0 -> 2902 bytes .../Drinks/sugarglass.rsi/fill-4.png | Bin 0 -> 2900 bytes .../Drinks/sugarglass.rsi/fill-5.png | Bin 0 -> 2911 bytes .../Drinks/sugarglass.rsi/fill-6.png | Bin 0 -> 2921 bytes .../Drinks/sugarglass.rsi/fill-7.png | Bin 0 -> 2920 bytes .../Consumable/Drinks/sugarglass.rsi/icon.png | Bin 0 -> 3051 bytes .../Drinks/sugarglass.rsi/icon_empty.png | Bin 0 -> 2986 bytes .../Drinks/sugarglass.rsi/meta.json | 38 + .../Consumable/Drinks/teaglass.rsi/fill-1.png | Bin 0 -> 2937 bytes .../Consumable/Drinks/teaglass.rsi/fill-2.png | Bin 0 -> 2944 bytes .../Consumable/Drinks/teaglass.rsi/fill-3.png | Bin 0 -> 2983 bytes .../Consumable/Drinks/teaglass.rsi/fill-4.png | Bin 0 -> 2955 bytes .../Consumable/Drinks/teaglass.rsi/icon.png | Bin 231 -> 3156 bytes .../Drinks/teaglass.rsi/icon_empty.png | Bin 0 -> 3127 bytes .../Consumable/Drinks/teaglass.rsi/meta.json | 30 +- .../Drinks/tequillaglass.rsi/fill-1.png | Bin 189 -> 3054 bytes .../Drinks/tequillaglass.rsi/fill-2.png | Bin 208 -> 3052 bytes .../Drinks/tequillaglass.rsi/fill-3.png | Bin 237 -> 3045 bytes .../Drinks/tequillaglass.rsi/fill-4.png | Bin 248 -> 0 bytes .../Drinks/tequillaglass.rsi/icon.png | Bin 447 -> 3149 bytes .../Drinks/tequillaglass.rsi/icon_empty.png | Bin 348 -> 3129 bytes .../Drinks/tequillaglass.rsi/meta.json | 49 +- .../Drinks/tonicglass.rsi/fill-1.png | Bin 0 -> 2864 bytes .../Drinks/tonicglass.rsi/fill-2.png | Bin 0 -> 2882 bytes .../Drinks/tonicglass.rsi/fill-3.png | Bin 0 -> 2883 bytes .../Drinks/tonicglass.rsi/fill-4.png | Bin 0 -> 2883 bytes .../Drinks/tonicglass.rsi/fill-5.png | Bin 0 -> 2883 bytes .../Consumable/Drinks/tonicglass.rsi/icon.png | Bin 0 -> 3146 bytes .../Drinks/tonicglass.rsi/icon_empty.png | Bin 0 -> 3085 bytes .../Drinks/tonicglass.rsi/meta.json | 32 + .../Drinks/watermelonglass.rsi/fill-1.png | Bin 0 -> 2933 bytes .../Drinks/watermelonglass.rsi/fill-2.png | Bin 0 -> 2936 bytes .../Drinks/watermelonglass.rsi/fill-3.png | Bin 0 -> 2973 bytes .../Drinks/watermelonglass.rsi/fill-4.png | Bin 0 -> 3000 bytes .../Drinks/watermelonglass.rsi/icon.png | Bin 0 -> 3180 bytes .../Drinks/watermelonglass.rsi/icon_empty.png | Bin 0 -> 3107 bytes .../Drinks/watermelonglass.rsi/meta.json | 29 + .../Drinks/xenobasher.rsi/fill-1.png | Bin 0 -> 790 bytes .../Drinks/xenobasher.rsi/fill-2.png | Bin 0 -> 839 bytes .../Consumable/Drinks/xenobasher.rsi/icon.png | Bin 0 -> 839 bytes .../Drinks/xenobasher.rsi/icon_empty.png | Bin 0 -> 754 bytes .../Drinks/xenobasher.rsi/meta.json | 23 + .../cigar-gold.rsi/lit-equipped-MASK-vox.png | Bin 0 -> 1123 bytes .../Cigars/cigar-gold.rsi/meta.json | 52 +- .../unlit-equipped-MASK-vox.png | Bin 0 -> 262 bytes .../cigar.rsi/lit-equipped-MASK-vox.png | Bin 0 -> 1123 bytes .../Smokeables/Cigars/cigar.rsi/meta.json | 52 +- .../cigar.rsi/unlit-equipped-MASK-vox.png | Bin 0 -> 262 bytes .../icon.png | Bin .../meta.json | 0 .../Objects/Devices/jammer.rsi/jammer.png | Bin 495 -> 939 bytes .../Devices/jammer.rsi/jammer_high_charge.png | Bin 0 -> 609 bytes .../Devices/jammer.rsi/jammer_low_charge.png | Bin 0 -> 617 bytes .../jammer.rsi/jammer_medium_charge.png | Bin 0 -> 608 bytes .../Objects/Devices/jammer.rsi/meta.json | 22 +- .../Devices/securityhandy.rsi/meta.json | 28 + .../walkietalkie-inhand-left.png | Bin 0 -> 372 bytes .../walkietalkie-inhand-right.png | Bin 0 -> 384 bytes .../securityhandy.rsi/walkietalkie-off.png | Bin 0 -> 357 bytes .../securityhandy.rsi/walkietalkie-on.png | Bin 0 -> 156 bytes .../securityhandy.rsi/walkietalkie.png | Bin 0 -> 348 bytes .../Fun/whistles.rsi/equipped-NECK.png | Bin 0 -> 288 bytes .../Objects/Fun/whistles.rsi/meta.json | 33 + .../Fun/whistles.rsi/sec-equipped-NECK.png | Bin 0 -> 6755 bytes .../sec.png} | Bin .../whistles.rsi/trench-equipped-NECK.png} | Bin .../Fun/whistles.rsi/trench.png} | Bin .../Objects/Fun/whistles.rsi/whistle.png | Bin 0 -> 593 bytes .../Objects/Misc/chopstick.rsi/icon.png | Bin 0 -> 4359 bytes .../Misc/chopstick.rsi/inhand-left.png | Bin 0 -> 749 bytes .../Misc/chopstick.rsi/inhand-right.png | Bin 0 -> 711 bytes .../Objects/Misc/chopstick.rsi/meta.json | 25 + .../Objects/Misc/chopstick.rsi/paired.png | Bin 0 -> 4648 bytes .../utensils.rsi/bar_spoon-inhand-left.png | Bin 0 -> 260 bytes .../utensils.rsi/bar_spoon-inhand-right.png | Bin 0 -> 251 bytes .../Objects/Misc/utensils.rsi/bar_spoon.png | Bin 0 -> 312 bytes .../Objects/Misc/utensils.rsi/meta.json | 13 +- .../charging-equipped-BACKPACK.png | Bin 0 -> 1886 bytes .../portable_recharger.rsi/charging-unlit.png | Bin 0 -> 539 bytes .../Power/portable_recharger.rsi/charging.png | Bin 0 -> 964 bytes .../portable_recharger.rsi/inhand-left.png | Bin 0 -> 714 bytes .../portable_recharger.rsi/inhand-right.png | Bin 0 -> 735 bytes .../Power/portable_recharger.rsi/meta.json | 92 + .../Specific/Chapel/quran.rsi/icon.png | Bin 0 -> 707 bytes .../Specific/Chapel/quran.rsi/inhand-left.png | Bin 0 -> 886 bytes .../Chapel/quran.rsi/inhand-right.png | Bin 0 -> 1071 bytes .../Specific/Chapel/quran.rsi/meta.json | 22 + .../Hydroponics/chili.rsi/produce.png | Bin 300 -> 279 bytes .../Hydroponics/chilly.rsi/produce.png | Bin 172 -> 200 bytes .../Robotics/borgmodule.rsi/icon-bomb.png | Bin 0 -> 248 bytes .../Robotics/borgmodule.rsi/meta.json | 8 +- .../borgmodule.rsi/syndicateborgbomb.png | Bin 0 -> 686 bytes .../emergency.rsi/equipped-SUITSTORAGE.png | Bin 0 -> 643 bytes .../Objects/Tanks/emergency.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 444 bytes .../Tanks/emergency_clown.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 525 bytes .../Tanks/emergency_double.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 652 bytes .../Tanks/emergency_double_red.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 665 bytes .../Tanks/emergency_extended.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 440 bytes .../emergency_extended_red.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 440 bytes .../Objects/Tanks/emergency_red.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 665 bytes .../Tanks/emergency_yellow.rsi/meta.json | 4 + .../Tanks/plasma.rsi/equipped-SUITSTORAGE.png | Bin 0 -> 383 bytes .../Objects/Tanks/plasma.rsi/meta.json | 4 + .../Battery/antiquelasergun.rsi/meta.json | 2 +- .../Guns/Battery/laser_cannon.rsi/meta.json | 146 +- .../laser_cannon.rsi/wielded-inhand-left.png | Bin 0 -> 1039 bytes .../laser_cannon.rsi/wielded-inhand-right.png | Bin 0 -> 1039 bytes .../Guns/Battery/laser_gun.rsi/meta.json | 78 +- .../laser_gun.rsi/wielded-inhand-left.png | Bin 0 -> 807 bytes .../laser_gun.rsi/wielded-inhand-right.png | Bin 0 -> 803 bytes .../Guns/Battery/pulse_carbine.rsi/meta.json | 78 +- .../pulse_carbine.rsi/wielded-inhand-left.png | Bin 0 -> 792 bytes .../wielded-inhand-right.png | Bin 0 -> 805 bytes .../Guns/Battery/pulse_rifle.rsi/meta.json | 78 +- .../pulse_rifle.rsi/wielded-inhand-left.png | Bin 0 -> 792 bytes .../pulse_rifle.rsi/wielded-inhand-right.png | Bin 0 -> 805 bytes .../Weapons/Guns/Battery/xray.rsi/meta.json | 100 +- .../Battery/xray.rsi/wielded-inhand-left.png | Bin 0 -> 1551 bytes .../Battery/xray.rsi/wielded-inhand-right.png | Bin 0 -> 1578 bytes .../Guns/Launchers/china_lake.rsi/meta.json | 12 +- .../china_lake.rsi/wielded-inhand-left.png | Bin 0 -> 839 bytes .../china_lake.rsi/wielded-inhand-right.png | Bin 0 -> 863 bytes .../Weapons/Guns/Rifles/ak.rsi/meta.json | 18 +- .../Rifles/ak.rsi/wielded-inhand-left.png | Bin 0 -> 1198 bytes .../Rifles/ak.rsi/wielded-inhand-right.png | Bin 0 -> 1192 bytes .../Weapons/Guns/Rifles/lecter.rsi/meta.json | 12 +- .../Rifles/lecter.rsi/wielded-inhand-left.png | Bin 0 -> 832 bytes .../lecter.rsi/wielded-inhand-right.png | Bin 0 -> 822 bytes .../Weapons/Guns/SMGs/c20r.rsi/meta.json | 10 +- .../SMGs/c20r.rsi/wielded-inhand-left.png | Bin 0 -> 679 bytes .../SMGs/c20r.rsi/wielded-inhand-right.png | Bin 0 -> 671 bytes .../Weapons/Guns/SMGs/drozd.rsi/meta.json | 74 +- .../SMGs/drozd.rsi/wielded-inhand-left.png | Bin 0 -> 719 bytes .../SMGs/drozd.rsi/wielded-inhand-right.png | Bin 0 -> 709 bytes .../Guns/Shotguns/blunderbuss.rsi/meta.json | 10 +- .../blunderbuss.rsi/wielded-inhand-left.png | Bin 0 -> 949 bytes .../blunderbuss.rsi/wielded-inhand-right.png | Bin 0 -> 964 bytes .../Guns/Shotguns/bulldog.rsi/meta.json | 12 +- .../bulldog.rsi/wielded-inhand-left.png | Bin 0 -> 802 bytes .../bulldog.rsi/wielded-inhand-right.png | Bin 0 -> 803 bytes .../Guns/Shotguns/db_shotgun.rsi/meta.json | 2 +- .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../db_shotgun_inhands_64x.rsi/meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 836 bytes .../wielded-inhand-right.png | Bin 0 -> 842 bytes .../Guns/Shotguns/enforcer.rsi/meta.json | 2 +- .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../enforcer_inhands_64x.rsi/meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 775 bytes .../wielded-inhand-right.png | Bin 0 -> 762 bytes .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 867 bytes .../wielded-inhand-right.png | Bin 0 -> 877 bytes .../Guns/Shotguns/inhands_64x.rsi/meta.json | 51 - .../Weapons/Guns/Shotguns/pump.rsi/meta.json | 2 +- .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../Shotguns/pump_inhands_64x.rsi/meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 905 bytes .../wielded-inhand-right.png | Bin 0 -> 922 bytes .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../Shotguns/sawn_inhands_64x.rsi/meta.json | 19 + .../Guns/Snipers/bolt_gun_wood.rsi/meta.json | 12 +- .../bolt_gun_wood.rsi/wielded-inhand-left.png | Bin 0 -> 714 bytes .../wielded-inhand-right.png | Bin 0 -> 733 bytes .../Guns/Snipers/heavy_sniper.rsi/meta.json | 12 +- .../heavy_sniper.rsi/wielded-inhand-left.png | Bin 0 -> 1719 bytes .../heavy_sniper.rsi/wielded-inhand-right.png | Bin 0 -> 1665 bytes Resources/Textures/Shaders/displacement.swsl | 18 + .../Machines/artifact_crusher.rsi/icon.png | Bin 0 -> 1570 bytes .../Machines/artifact_crusher.rsi/meta.json | 3 + .../building.png | Bin 0 -> 3419 bytes .../circuit_imprinter_hypercon.rsi/icon.png | Bin 0 -> 797 bytes .../circuit_imprinter_hypercon.rsi/meta.json | 52 + .../circuit_imprinter_hypercon.rsi/panel.png | Bin 0 -> 244 bytes .../circuit_imprinter_hypercon.rsi/unlit.png | Bin 0 -> 4771 bytes .../fax_machine.rsi/inserting_hamster.png} | Bin 21026 -> 23368 bytes .../fax_machine.rsi/inserting_mothroach.png | Bin 0 -> 23838 bytes .../fax_machine.rsi/inserting_mouse.png | Bin 0 -> 23808 bytes .../Machines/fax_machine.rsi/meta.json | 57 + .../pipe.rsi/Bend-inhand-left.png | Bin 0 -> 6821 bytes .../pipe.rsi/Bend-inhand-right.png | Bin 0 -> 6825 bytes .../pipe.rsi/Fourway-inhand-left.png | Bin 0 -> 6914 bytes .../pipe.rsi/Fourway-inhand-right.png | Bin 0 -> 6915 bytes .../pipe.rsi/TJunction-inhand-left.png | Bin 0 -> 6895 bytes .../pipe.rsi/TJunction-inhand-right.png | Bin 0 -> 6893 bytes .../Atmospherics/pipe.rsi/inhand-left.png | Bin 0 -> 6818 bytes .../Atmospherics/pipe.rsi/inhand-right.png | Bin 0 -> 6826 bytes .../Piping/Atmospherics/pipe.rsi/meta.json | 46 +- .../Piping/Atmospherics/pipe.rsi/pipeBend.png | Bin 3965 -> 621 bytes .../Atmospherics/pipe.rsi/storageBend.png | Bin 0 -> 449 bytes .../Atmospherics/pipe.rsi/storageStraight.png | Bin 0 -> 503 bytes .../pipe.rsi/storageTJunction.png | Bin 0 -> 509 bytes .../Storage/glassbox.rsi/DamageOverlay_12.png | Bin 1294 -> 512 bytes .../Storage/glassbox.rsi/DamageOverlay_4.png | Bin 733 -> 311 bytes .../Storage/glassbox.rsi/DamageOverlay_8.png | Bin 1116 -> 423 bytes .../{glassbox-empty-open.png => base.png} | Bin .../{glass-4.png => glass-broken.png} | Bin .../glassbox.rsi/glassbox-filled-closed.png | Bin 901 -> 0 bytes .../glassbox.rsi/glassbox-filled-open.png | Bin 796 -> 0 bytes .../Storage/glassbox.rsi/glassbox.png | Bin 313 -> 0 bytes .../Structures/Storage/glassbox.rsi/icon.png | Bin 0 -> 459 bytes .../Structures/Storage/glassbox.rsi/meta.json | 50 +- .../Tiles/Misc/floortrap.rsi/floortrap.png | Bin 0 -> 152 bytes .../Misc/floortrap.rsi/floortrapspawn.png | Bin 0 -> 189 bytes .../Misc/floortrap.rsi}/meta.json | 8 +- Resources/Textures/Tiles/rglass.png | Bin 1055 -> 6911 bytes Resources/Textures/Tips/tippy.rsi/down.png | Bin 0 -> 5325 bytes Resources/Textures/Tips/tippy.rsi/left.png | Bin 0 -> 4000 bytes Resources/Textures/Tips/tippy.rsi/meta.json | 20 + Resources/Textures/Tips/tippy.rsi/right.png | Bin 0 -> 4341 bytes Resources/engineCommandPerms.yml | 2 + Resources/keybinds.yml | 3 + Resources/map_attributions.txt | 2 + Resources/migration.yml | 22 +- RobustToolbox | 2 +- SpaceStation14.sln.DotSettings | 42 + .../Displacement Map Flip.lua | 78 + .../Displacement Map Visualizer.lua | 171 + .../Displacement Map.png | Bin 0 -> 1212 bytes runclient.bat | 6 +- runserver.bat | 6 +- 2221 files changed, 247280 insertions(+), 50928 deletions(-) create mode 100644 Content.Client/Administration/Systems/AdminFrozenSystem.cs create mode 100644 Content.Client/Animations/TrackUserComponent.cs create mode 100644 Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs create mode 100644 Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs create mode 100644 Content.Client/Chemistry/UI/SolutionStatusControl.cs create mode 100644 Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs create mode 100644 Content.Client/CriminalRecords/Systems/CriminalRecordsSystem.cs create mode 100644 Content.Client/DeviceNetwork/JammerSystem.cs create mode 100644 Content.Client/Fax/System/FaxVisualsSystem.cs create mode 100644 Content.Client/Items/UI/PollingItemStatusControl.cs create mode 100644 Content.Client/Labels/EntitySystems/HandLabelerSystem.cs create mode 100644 Content.Client/MagicMirror/MagicMirrorSystem.cs create mode 100644 Content.Client/Overlays/ShowCriminalRecordIconsSystem.cs create mode 100644 Content.Client/Overlays/ShowJobIconsSystem.cs create mode 100644 Content.Client/Overlays/ShowMindShieldIconsSystem.cs create mode 100644 Content.Client/Power/ActivatableUIRequiresPowerSystem.cs create mode 100644 Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs create mode 100644 Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs create mode 100644 Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml create mode 100644 Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs create mode 100644 Content.Client/RoundEnd/RoundEndSummaryUIController.cs create mode 100644 Content.Client/StationRecords/GeneralRecord.xaml create mode 100644 Content.Client/StationRecords/GeneralRecord.xaml.cs create mode 100644 Content.Client/Tips/TippyUI.xaml create mode 100644 Content.Client/Tips/TippyUI.xaml.cs create mode 100644 Content.Client/Tips/TippyUIController.cs delete mode 100644 Content.Client/Tools/Components/WelderComponent.cs create mode 100644 Content.Client/UserInterface/Controls/ClipControl.cs create mode 100644 Content.Client/Weapons/Ranged/ItemStatus/BulletRender.cs create mode 100644 Content.IntegrationTests/Tests/GameRules/AntagPreferenceTest.cs create mode 100644 Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs create mode 100644 Content.IntegrationTests/Tests/GameRules/NukeOpsTest.cs create mode 100644 Content.IntegrationTests/Tests/Linter/StaticFieldValidationTest.cs create mode 100644 Content.IntegrationTests/Tests/Mapping/MappingTests.cs create mode 100644 Content.IntegrationTests/Tests/Station/EvacShuttleTest.cs delete mode 100644 Content.Server/Access/Components/IdExaminableComponent.cs create mode 100644 Content.Server/Administration/ServerApi.cs create mode 100644 Content.Server/Administration/Systems/AdminFrozenSystem.cs create mode 100644 Content.Server/Antag/AntagSelectionPlayerPool.cs create mode 100644 Content.Server/Antag/AntagSelectionSystem.API.cs create mode 100644 Content.Server/Antag/Components/AntagSelectionComponent.cs create mode 100644 Content.Server/Antag/Components/GhostRoleAntagSpawnerComponent.cs create mode 100644 Content.Server/Chat/V2/Commands/DeleteChatMessageCommand.cs create mode 100644 Content.Server/Chat/V2/Commands/NukeChatMessagesCommand.cs create mode 100644 Content.Server/Chat/V2/Messages.cs create mode 100644 Content.Server/Chat/V2/Repository/ChatRepository.cs delete mode 100644 Content.Server/Chemistry/Components/ReagentTankComponent.cs rename Content.Server/Chemistry/ReagentEffects/{ChemCleanBoodstream.cs => ChemCleanBloodstream.cs} (92%) create mode 100644 Content.Server/Chemistry/ReagentEffects/ReduceRotting.cs create mode 100644 Content.Server/Containers/ThrowInsertContainerComponent.cs create mode 100644 Content.Server/Containers/ThrowInsertContainerSystem.cs create mode 100644 Content.Server/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs create mode 100644 Content.Server/Explosion/Components/RepeatingTriggerComponent.cs rename Content.Server/GameTicking/{Rules => }/Components/ActiveGameRuleComponent.cs (84%) create mode 100644 Content.Server/GameTicking/Components/DelayedStartRuleComponent.cs rename Content.Server/GameTicking/{Rules => }/Components/EndedGameRuleComponent.cs (81%) rename Content.Server/GameTicking/{Rules => }/Components/GameRuleComponent.cs (83%) create mode 100644 Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs delete mode 100644 Content.Server/GameTicking/Rules/Components/PiratesRuleComponent.cs create mode 100644 Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs delete mode 100644 Content.Server/GameTicking/Rules/PiratesRuleSystem.cs create mode 100644 Content.Server/Geras/GerasComponent.cs create mode 100644 Content.Server/Geras/GerasSystem.cs create mode 100644 Content.Server/GridPreloader/GridPreloaderComponent.cs create mode 100644 Content.Server/GridPreloader/GridPreloaderSystem.cs delete mode 100644 Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs delete mode 100644 Content.Server/Light/Events/LightToggleEvent.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/KeyNotExistsPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyBoolEqualsPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyFloatEqualsPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyFloatGreaterPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyFloatLessPrecondition.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Math/AddFloatOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Math/SetBoolOperator.cs rename Content.Server/NPC/HTN/PrimitiveTasks/Operators/{ => Math}/SetFloatOperator.cs (52%) create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Math/SetRandomFloatOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/PlaySoundOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/SayKeyOperator.cs create mode 100644 Content.Server/Objectives/Components/CodeConditionSystem.cs delete mode 100644 Content.Server/Objectives/Components/TerrorConditionComponent.cs create mode 100644 Content.Server/Objectives/Systems/CodeConditionSystem.cs delete mode 100644 Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs delete mode 100644 Content.Server/Radio/Components/RadioJammerComponent.cs create mode 100644 Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs create mode 100644 Content.Server/Shuttles/Components/DockingSignalControlComponent.cs create mode 100644 Content.Server/Shuttles/Systems/DockingSignalControlSystem.cs create mode 100644 Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs create mode 100644 Content.Server/Station/Components/StationBiomeComponent.cs create mode 100644 Content.Server/Station/Systems/StationBiomeSystem.cs create mode 100644 Content.Server/StationEvents/Components/AlertLevelInterceptionRuleComponent.cs delete mode 100644 Content.Server/StationEvents/Components/LoneOpsSpawnRuleComponent.cs create mode 100644 Content.Server/StationEvents/Events/AlertLevelInterceptionRule.cs delete mode 100644 Content.Server/Tools/Components/WelderComponent.cs delete mode 100644 Content.Server/Tools/ToolSystem.Welder.cs delete mode 100644 Content.Server/UserInterface/ActivatableUISystem.cs delete mode 100644 Content.Server/_White/SecurityHud/SecurityHudComponent.cs create mode 100644 Content.Server/_White/Wizard/Appearance/WizardAppearanceSystem.cs create mode 100644 Content.Shared/Access/Components/IdExaminableComponent.cs rename {Content.Server => Content.Shared}/Access/Systems/IdExaminableSystem.cs (85%) create mode 100644 Content.Shared/Actions/Events/ActionPerformedEvent.cs create mode 100644 Content.Shared/Actions/Events/ValidateActionEntityTargetEvent.cs create mode 100644 Content.Shared/Actions/Events/ValidateActionWorldTargetEvent.cs rename Content.Shared/Administration/{AdminFrozenSystem.cs => SharedAdminFrozenSystem.cs} (78%) create mode 100644 Content.Shared/Armor/AllowSuitStorageComponent.cs rename {Content.Server => Content.Shared}/Atmos/GasMixture.cs (98%) create mode 100644 Content.Shared/Atmos/GasMixtureStringRepresentation.cs create mode 100644 Content.Shared/Atmos/GetFireProtectionEvent.cs create mode 100644 Content.Shared/Atmos/Reactions/GasReactionEnums.cs create mode 100644 Content.Shared/Chat/V2/Repository/Types.cs create mode 100644 Content.Shared/Chat/V2/Types.cs create mode 100644 Content.Shared/Chemistry/Components/MixableSolutionComponent.cs create mode 100644 Content.Shared/Chemistry/Components/ReagentTankComponent.cs create mode 100644 Content.Shared/Clothing/Components/FireProtectionComponent.cs create mode 100644 Content.Shared/Clothing/Components/HideLayerClothingComponent.cs create mode 100644 Content.Shared/Clothing/EntitySystems/FireProtectionSystem.cs create mode 100644 Content.Shared/CriminalRecords/Components/CriminalRecordsHackerComponent.cs create mode 100644 Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsHackerSystem.cs create mode 100644 Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsSystem.cs rename {Content.Server/Fax => Content.Shared/Fax/Components}/FaxMachineComponent.cs (80%) create mode 100644 Content.Shared/Fax/Components/FaxableObjectComponent.cs create mode 100644 Content.Shared/Fax/Components/FaxecuteComponent.cs create mode 100644 Content.Shared/Fax/DamageOnFaxecuteEvent.cs create mode 100644 Content.Shared/Fax/Systems/FaxecuteSystem.cs create mode 100644 Content.Shared/Geras/SharedGerasSystem.cs create mode 100644 Content.Shared/GridPreloader/Prototypes/PreloadedGridPrototype.cs create mode 100644 Content.Shared/GridPreloader/Systems/SharedGridPreloaderSystem.cs rename {Content.Server => Content.Shared}/HealthExaminable/HealthExaminableComponent.cs (64%) rename {Content.Server => Content.Shared}/HealthExaminable/HealthExaminableSystem.cs (95%) create mode 100644 Content.Shared/Labels/EntitySystems/SharedHandLabelerSystem.cs create mode 100644 Content.Shared/Light/EntitySystems/UnpoweredFlashlightSystem.cs create mode 100644 Content.Shared/Light/LightToggleEvent.cs rename {Content.Server => Content.Shared}/MagicMirror/MagicMirrorComponent.cs (89%) create mode 100644 Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs rename Content.Shared/Overlays/{ShowSecurityIconsComponent.cs => ShowJobIconsComponent.cs} (51%) create mode 100644 Content.Shared/Overlays/ShowMindShieldIconsComponent.cs create mode 100644 Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs create mode 100644 Content.Shared/Preferences/Loadouts/Effects/SpeciesLoadoutEffect.cs create mode 100644 Content.Shared/Radio/Components/SharedRadioJammerComponent.cs create mode 100644 Content.Shared/Radio/EntitySystems/SharedJammerSystem.cs create mode 100644 Content.Shared/ReagentSpeed/ReagentSpeedComponent.cs create mode 100644 Content.Shared/ReagentSpeed/ReagentSpeedSystem.cs create mode 100644 Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs create mode 100644 Content.Shared/Robotics/RoboticsConsoleUi.cs create mode 100644 Content.Shared/Robotics/Systems/SharedRoboticsConsoleSystem.cs create mode 100644 Content.Shared/Roles/StartingGearEquippedEvent.cs create mode 100644 Content.Shared/Silicons/Borgs/Components/BorgTransponderComponent.cs create mode 100644 Content.Shared/StepTrigger/Components/ClothingRequiredStepTriggerComponent.cs create mode 100644 Content.Shared/StepTrigger/Components/ClothingRequiredStepTriggerImmuneComponent.cs delete mode 100644 Content.Shared/StepTrigger/Components/ShoesRequiredStepTriggerComponent.cs create mode 100644 Content.Shared/StepTrigger/Components/StepTriggerImmuneComponent.cs delete mode 100644 Content.Shared/StepTrigger/Systems/ShoesRequiredStepTriggerSystem.cs create mode 100644 Content.Shared/StepTrigger/Systems/StepTriggerImmuneSystem.cs create mode 100644 Content.Shared/Tips/TippyEvent.cs delete mode 100644 Content.Shared/Tools/Components/SharedWelderComponent.cs rename Content.Shared/Tools/Components/{SharedWeldable.cs => WeldableComponent.cs} (55%) create mode 100644 Content.Shared/Tools/Components/WelderComponent.cs create mode 100644 Content.Shared/Tools/Systems/SharedToolSystem.Welder.cs rename {Content.Server => Content.Shared}/UserInterface/ActivatableUIComponent.cs (59%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUIRequiresPowerCellComponent.cs (65%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUISystem.Power.cs (72%) create mode 100644 Content.Shared/UserInterface/ActivatableUISystem.cs create mode 100644 Content.Shared/Weapons/Ranged/Components/ActionGunComponent.cs create mode 100644 Content.Shared/Weapons/Ranged/Systems/ActionGunSystem.cs create mode 100644 Content.Shared/Whitelist/EntityWhitelistSystem.cs create mode 100644 Content.Shared/_White/Antag/GlobalAntagonistSystem.cs create mode 100644 Content.Shared/_White/Wizard/Appearance/WizardAppearanceComponent.cs create mode 100644 Resources/Audio/Announcements/intercept.ogg create mode 100644 Resources/Audio/Effects/Grenades/SelfDestruct/SDS_Charge.ogg create mode 100644 Resources/Audio/Effects/Grenades/SelfDestruct/SDS_Charge2.ogg create mode 100644 Resources/Audio/Effects/Grenades/SelfDestruct/attributions.yml create mode 100644 Resources/Audio/Effects/chopstickbreak.ogg create mode 100644 Resources/Audio/Effects/spray3.ogg create mode 100644 Resources/Audio/Expedition/attributions.yml create mode 100644 Resources/Audio/Expedition/deadline.ogg rename Resources/Audio/{Misc => Expedition}/tension_session.ogg (100%) create mode 100644 Resources/Locale/en-US/chat/chat-repo.ftl create mode 100644 Resources/Locale/en-US/chat/commands/ghost-command.ftl create mode 100644 Resources/Locale/en-US/chemistry/components/solution-status.ftl create mode 100644 Resources/Locale/en-US/commands/tippy-command.ftl create mode 100644 Resources/Locale/en-US/damage/damage-groups.ftl create mode 100644 Resources/Locale/en-US/damage/damage-types.ftl delete mode 100644 Resources/Locale/en-US/game-ticking/game-presets/preset-pirates.ftl create mode 100644 Resources/Locale/en-US/geras/geras.ftl create mode 100644 Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl create mode 100644 Resources/Locale/en-US/inventory/item-status.ftl create mode 100644 Resources/Locale/en-US/metabolism/metabolism-groups.ftl create mode 100644 Resources/Locale/en-US/metabolism/metabolizer-types.ftl create mode 100644 Resources/Locale/en-US/research/components/robotics-console.ftl create mode 100644 Resources/Locale/en-US/speech/speech-liar.ftl create mode 100644 Resources/Locale/en-US/station-events/events/intercept.ftl create mode 100644 Resources/Locale/en-US/station-events/events/unknown-shuttle.ftl delete mode 100644 Resources/Locale/en-US/ui/verbs.ftl create mode 100644 Resources/Locale/ru-RU/_white/speech/speech-liar.ftl create mode 100644 Resources/Locale/ru-RU/_white/traits/traits.ftl create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/disaster_evacpod.yml create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/honki.yml create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/lost_cargo.yml rename Resources/Maps/Shuttles/{ => ShuttleEvent}/striker.yml (99%) create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/syndie_evacpod.yml create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/traveling_china_cuisine.yml create mode 100644 Resources/Maps/Shuttles/briggle.yml create mode 100644 Resources/Maps/oasis.yml create mode 100644 Resources/Prototypes/Datasets/corporations.yml create mode 100644 Resources/Prototypes/Entities/Debugging/tippy.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Debugging/debug_counter.yml create mode 100644 Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml create mode 100644 Resources/Prototypes/Entities/Objects/Power/portable_recharger.yml create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml create mode 100644 Resources/Prototypes/GameRules/unknown_shuttles.yml create mode 100644 Resources/Prototypes/Maps/oasis.yml create mode 100644 Resources/Prototypes/NPCs/debug.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/structures/glassbox.yml create mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/bots/supplybot.yml create mode 100644 Resources/Prototypes/Roles/Ghostroles/syndicate.yml create mode 100644 Resources/Prototypes/Shaders/displacement.yml create mode 100644 Resources/Prototypes/Shuttles/shuttle_incoming_event.yml create mode 100644 Resources/Prototypes/SoundCollections/expeditions.yml create mode 100644 Resources/Prototypes/_White/Cult/cult.yml create mode 100644 Resources/Prototypes/_White/Entities/Clothing/OuterClothing/hardsuits.yml create mode 100644 Resources/Prototypes/_White/Maps/wizard.yml create mode 100644 Resources/Prototypes/floor_trap.yml delete mode 100644 Resources/ServerInfo/Guidebook/Science/TraversalDistorter.xml create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/equipped-EYES.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/gladiator.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/paper.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/surgcap_blue.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/surgcap_green.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/surgcap_purple.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/templar.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/wizardhelm.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/bio.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/cmo.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/general.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/janitor.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/scientist.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/security.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/virology.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Misc/chickenhead.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Misc/head_mirror.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Misc/head_mirror.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Misc/head_mirror.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Misc/head_mirror.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Misc/head_mirror.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Welding/blue_flame_welding_mask.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/blue_flame_welding_mask.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/flame_welding_mask.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/flame_welding_mask.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/paintedwelding.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/paintedwelding.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/welding.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/welding.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Mask/bee.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/breath.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/clown.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gas.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gasatmos.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gascaptain.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gassecurity.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gassecurity.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gassyndicate.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/italian_moustache.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/medical.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/medical.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/mime.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/muzzle.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/ninja.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/plaguedoctormask.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sexyclown.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sexymime.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sterile.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sterile.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/swat.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/armor_reflec.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/cult_armour.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/heavygreen.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/heavyred.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/cmo.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/general.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/janitor.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/scientist.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/security.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/virology.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/jensencoat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/pirate.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/warden.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/apronbotanist.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/apronchef.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/chef.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/classicponcho.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/nunrobe.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/chicken.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatatmos.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatbar.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcap.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcargo.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatce.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatclown.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatengi.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathydro.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatmed.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatmime.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatminer.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatparamed.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatsci.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatsec.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwarden.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/jackboots.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-advanced.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-advanced.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-syndicate.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-syndicate.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Misc/slippers.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Misc/tourist.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Specific/clown.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Specific/swat.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Specific/wizard.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/cmo_turtle.rsi/equipped-INNERCLOTHING-monkey.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/cmo_turtle.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/cmo_turtle.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/cmo_turtle.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/cmo_turtle.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/cmo_turtle.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/cmo_turtle.rsi/equipped-INNERCLOTHING-monkey.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/cmo_turtle.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/cmo_turtle.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/cmo_turtle.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/cmo_turtle.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/cmo_turtle.rsi/meta.json create mode 100644 Resources/Textures/Interface/Alerts/deflecting.rsi/deflecting0.png rename Resources/Textures/{Objects/Fun/whistle.rsi => Interface/Alerts/deflecting.rsi}/meta.json (64%) create mode 100644 Resources/Textures/Interface/Ashen/item_status_left.png create mode 100644 Resources/Textures/Interface/Ashen/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Ashen/item_status_right.png create mode 100644 Resources/Textures/Interface/Ashen/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Ashen/template_small.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_left.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_right.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Default/item_status_left.png create mode 100644 Resources/Textures/Interface/Default/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Default/item_status_right.png create mode 100644 Resources/Textures/Interface/Default/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_left.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_right.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Minimalist/template_small.png create mode 100644 Resources/Textures/Interface/Nano/help.png delete mode 100644 Resources/Textures/Interface/Nano/item_status_left.svg delete mode 100644 Resources/Textures/Interface/Nano/item_status_left.svg.96dpi.png delete mode 100644 Resources/Textures/Interface/Nano/item_status_middle.svg delete mode 100644 Resources/Textures/Interface/Nano/item_status_middle.svg.96dpi.png delete mode 100644 Resources/Textures/Interface/Nano/item_status_right.svg delete mode 100644 Resources/Textures/Interface/Nano/item_status_right.svg.96dpi.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_left.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_right.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Retro/item_status_left.png create mode 100644 Resources/Textures/Interface/Retro/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Retro/item_status_right.png create mode 100644 Resources/Textures/Interface/Retro/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Retro/template_small.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_left.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_right.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_right_highlight.png create mode 100644 Resources/Textures/LobbyScreens/justaweekaway.webp create mode 100644 Resources/Textures/LobbyScreens/justaweekaway.yml create mode 100644 Resources/Textures/Mobs/Customization/human_hair.rsi/spookylong.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/frills_neckfull.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_primary.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_secondary.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icebucket.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icebucket.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jigger.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jigger.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-7.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/icon_empty.png delete mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar-gold.rsi/lit-equipped-MASK-vox.png create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar-gold.rsi/unlit-equipped-MASK-vox.png create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar.rsi/lit-equipped-MASK-vox.png create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar.rsi/unlit-equipped-MASK-vox.png rename Resources/Textures/Objects/Consumable/TrashDrinks/{goldschlagerbottle_empty.rsi => gildlagerbottle_empty.rsi}/icon.png (100%) rename Resources/Textures/Objects/Consumable/TrashDrinks/{goldschlagerbottle_empty.rsi => gildlagerbottle_empty.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer_high_charge.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer_low_charge.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer_medium_charge.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-off.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-on.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie.png create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/equipped-NECK.png create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/meta.json create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/sec-equipped-NECK.png rename Resources/Textures/Objects/Fun/{whistle.rsi/securityWhistle.png => whistles.rsi/sec.png} (100%) rename Resources/Textures/{Clothing/Neck/Misc/whistles.rsi/equipped-NECK.png => Objects/Fun/whistles.rsi/trench-equipped-NECK.png} (100%) rename Resources/Textures/{Clothing/Neck/Misc/whistles.rsi/icon.png => Objects/Fun/whistles.rsi/trench.png} (100%) create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/whistle.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/icon.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/meta.json create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/paired.png create mode 100644 Resources/Textures/Objects/Misc/utensils.rsi/bar_spoon-inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/utensils.rsi/bar_spoon-inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/utensils.rsi/bar_spoon.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/charging-equipped-BACKPACK.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/charging-unlit.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/charging.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/icon.png create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-bomb.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/syndicateborgbomb.png create mode 100644 Resources/Textures/Objects/Tanks/emergency.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_clown.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_double.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_double_red.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_extended.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_red.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_yellow.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/plasma.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/db-inhand-left.png => db_shotgun_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/db-inhand-right.png => db_shotgun_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/enforcer-inhand-left.png => enforcer_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/enforcer-inhand-right.png => enforcer_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/improvised-inhand-left.png => improvised_shotgun_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/improvised-inhand-right.png => improvised_shotgun_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi/wielded-inhand-right.png delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/inhands_64x.rsi/meta.json rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/pump-inhand-left.png => pump_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/pump-inhand-right.png => pump_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/sawn-inhand-left.png => sawn_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/sawn-inhand-right.png => sawn_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Shaders/displacement.swsl create mode 100644 Resources/Textures/Structures/Machines/artifact_crusher.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/building.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/panel.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/unlit.png rename Resources/Textures/{Clothing/Head/Bandanas/botany.rsi/equipped-HELMET-hamster.png => Structures/Machines/fax_machine.rsi/inserting_hamster.png} (68%) create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mothroach.png create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mouse.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Bend-inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Bend-inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Fourway-inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Fourway-inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/TJunction-inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/TJunction-inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/storageBend.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/storageStraight.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/storageTJunction.png rename Resources/Textures/Structures/Storage/glassbox.rsi/{glassbox-empty-open.png => base.png} (100%) rename Resources/Textures/Structures/Storage/glassbox.rsi/{glass-4.png => glass-broken.png} (100%) delete mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/glassbox-filled-closed.png delete mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/glassbox-filled-open.png delete mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/glassbox.png create mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/icon.png create mode 100644 Resources/Textures/Tiles/Misc/floortrap.rsi/floortrap.png create mode 100644 Resources/Textures/Tiles/Misc/floortrap.rsi/floortrapspawn.png rename Resources/Textures/{Clothing/Neck/Misc/whistles.rsi => Tiles/Misc/floortrap.rsi}/meta.json (51%) create mode 100644 Resources/Textures/Tips/tippy.rsi/down.png create mode 100644 Resources/Textures/Tips/tippy.rsi/left.png create mode 100644 Resources/Textures/Tips/tippy.rsi/meta.json create mode 100644 Resources/Textures/Tips/tippy.rsi/right.png create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map.png diff --git a/.editorconfig b/.editorconfig index f01530bcb1..3e44d1a281 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,6 +12,7 @@ tab_width = 4 #end_of_line = crlf insert_final_newline = true trim_trailing_whitespace = true +max_line_length = 120 #### .NET Coding Conventions #### diff --git a/Content.Benchmarks/MapLoadBenchmark.cs b/Content.Benchmarks/MapLoadBenchmark.cs index ce95e9a158..261e164f17 100644 --- a/Content.Benchmarks/MapLoadBenchmark.cs +++ b/Content.Benchmarks/MapLoadBenchmark.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -46,7 +46,7 @@ public class MapLoadBenchmark PoolManager.Shutdown(); } - public static readonly string[] MapsSource = { "Empty", "Box", "Bagel", "Dev", "CentComm", "Atlas", "Core", "TestTeg", "Saltern", "Packed", "Omega", "Cluster", "Reach", "Origin", "Meta", "Marathon", "Europa", "MeteorArena", "Fland", "Barratry" }; + public static readonly string[] MapsSource = { "Empty", "Box", "Bagel", "Dev", "CentComm", "Atlas", "Core", "TestTeg", "Saltern", "Packed", "Omega", "Cluster", "Reach", "Origin", "Meta", "Marathon", "Europa", "MeteorArena", "Fland", "Barratry", "Oasis" }; [ParamsSource(nameof(MapsSource))] public string Map; diff --git a/Content.Client/Access/IdCardSystem.cs b/Content.Client/Access/IdCardSystem.cs index fcf2bf57de..e0c02976f7 100644 --- a/Content.Client/Access/IdCardSystem.cs +++ b/Content.Client/Access/IdCardSystem.cs @@ -2,6 +2,4 @@ namespace Content.Client.Access; -public sealed class IdCardSystem : SharedIdCardSystem -{ -} +public sealed class IdCardSystem : SharedIdCardSystem; diff --git a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs index 73f18aec8d..c3fac8cb92 100644 --- a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs +++ b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs @@ -40,9 +40,9 @@ namespace Content.Client.Access.UI SendMessage(new AgentIDCardJobChangedMessage(newJob)); } - public void OnJobIconChanged(string newJobIcon) + public void OnJobIconChanged(string newJobIconId) { - SendMessage(new AgentIDCardJobIconChangedMessage(newJobIcon)); + SendMessage(new AgentIDCardJobIconChangedMessage(newJobIconId)); } /// @@ -57,7 +57,7 @@ namespace Content.Client.Access.UI _window.SetCurrentName(cast.CurrentName); _window.SetCurrentJob(cast.CurrentJob); - _window.SetAllowedIcons(cast.Icons); + _window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId); } protected override void Dispose(bool disposing) diff --git a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs index beca0c41ba..9a38c0c485 100644 --- a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs +++ b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs @@ -38,7 +38,7 @@ namespace Content.Client.Access.UI JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text); } - public void SetAllowedIcons(HashSet icons) + public void SetAllowedIcons(HashSet icons, string currentJobIconId) { IconGrid.DisposeAllChildren(); @@ -79,6 +79,10 @@ namespace Content.Client.Access.UI jobIconButton.AddChild(jobIconTexture); jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIcon.ID); IconGrid.AddChild(jobIconButton); + + if (jobIconId.Equals(currentJobIconId)) + jobIconButton.Pressed = true; + i++; } } diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index 5ff003452a..aff6c1ff7b 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -247,7 +247,10 @@ namespace Content.Client.Actions if (action.ClientExclusive) { if (instantAction.Event != null) + { instantAction.Event.Performer = user; + instantAction.Event.Action = actionId; + } PerformAction(user, actions, actionId, instantAction, instantAction.Event, GameTiming.CurTime); } diff --git a/Content.Client/Administration/Components/HeadstandComponent.cs b/Content.Client/Administration/Components/HeadstandComponent.cs index d95e74576b..a4e3bfc5aa 100644 --- a/Content.Client/Administration/Components/HeadstandComponent.cs +++ b/Content.Client/Administration/Components/HeadstandComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Client.Administration.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class HeadstandComponent : SharedHeadstandComponent { diff --git a/Content.Client/Administration/Components/KillSignComponent.cs b/Content.Client/Administration/Components/KillSignComponent.cs index 1cf47b93ff..91c44ef3f2 100644 --- a/Content.Client/Administration/Components/KillSignComponent.cs +++ b/Content.Client/Administration/Components/KillSignComponent.cs @@ -3,6 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Client.Administration.Components; -[NetworkedComponent, RegisterComponent] -public sealed partial class KillSignComponent : SharedKillSignComponent -{ } +[RegisterComponent] +public sealed partial class KillSignComponent : SharedKillSignComponent; diff --git a/Content.Client/Administration/Managers/ClientAdminManager.cs b/Content.Client/Administration/Managers/ClientAdminManager.cs index fdd62fb6a2..0f740c8104 100644 --- a/Content.Client/Administration/Managers/ClientAdminManager.cs +++ b/Content.Client/Administration/Managers/ClientAdminManager.cs @@ -126,12 +126,15 @@ namespace Content.Client.Administration.Managers public AdminData? GetAdminData(EntityUid uid, bool includeDeAdmin = false) { - return uid == _player.LocalEntity ? _adminData : null; + if (uid == _player.LocalEntity && (_adminData?.Active ?? includeDeAdmin)) + return _adminData; + + return null; } public AdminData? GetAdminData(ICommonSession session, bool includeDeAdmin = false) { - if (_player.LocalUser == session.UserId) + if (_player.LocalUser == session.UserId && (_adminData?.Active ?? includeDeAdmin)) return _adminData; return null; diff --git a/Content.Client/Administration/Systems/AdminFrozenSystem.cs b/Content.Client/Administration/Systems/AdminFrozenSystem.cs new file mode 100644 index 0000000000..885585f985 --- /dev/null +++ b/Content.Client/Administration/Systems/AdminFrozenSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Administration; + +namespace Content.Client.Administration.Systems; + +public sealed class AdminFrozenSystem : SharedAdminFrozenSystem +{ +} diff --git a/Content.Client/Administration/Systems/AdminVerbSystem.cs b/Content.Client/Administration/Systems/AdminVerbSystem.cs index 1a75df7308..b93e13fbdb 100644 --- a/Content.Client/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Client/Administration/Systems/AdminVerbSystem.cs @@ -1,3 +1,6 @@ +using Content.Shared.Administration; +using Content.Shared.Administration.Managers; +using Content.Shared.Mind.Components; using Content.Shared.Verbs; using Robust.Client.Console; using Robust.Shared.Utility; @@ -11,10 +14,12 @@ namespace Content.Client.Administration.Systems { [Dependency] private readonly IClientConGroupController _clientConGroupController = default!; [Dependency] private readonly IClientConsoleHost _clientConsoleHost = default!; + [Dependency] private readonly ISharedAdminManager _admin = default!; public override void Initialize() { SubscribeLocalEvent>(AddAdminVerbs); + } private void AddAdminVerbs(GetVerbsEvent args) @@ -33,6 +38,24 @@ namespace Content.Client.Administration.Systems }; args.Verbs.Add(verb); } + + if (!_admin.IsAdmin(args.User)) + return; + + if (_admin.HasAdminFlag(args.User, AdminFlags.Admin)) + args.ExtraCategories.Add(VerbCategory.Admin); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Fun) && HasComp(args.Target)) + args.ExtraCategories.Add(VerbCategory.Antag); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Debug)) + args.ExtraCategories.Add(VerbCategory.Debug); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Fun)) + args.ExtraCategories.Add(VerbCategory.Smite); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Admin)) + args.ExtraCategories.Add(VerbCategory.Tricks); } } } diff --git a/Content.Client/Administration/UI/SpawnExplosion/SpawnExplosionWindow.xaml.cs b/Content.Client/Administration/UI/SpawnExplosion/SpawnExplosionWindow.xaml.cs index 5f187cad79..b0d8a946ec 100644 --- a/Content.Client/Administration/UI/SpawnExplosion/SpawnExplosionWindow.xaml.cs +++ b/Content.Client/Administration/UI/SpawnExplosion/SpawnExplosionWindow.xaml.cs @@ -3,6 +3,7 @@ using Content.Shared.Explosion; using JetBrains.Annotations; using Robust.Client.AutoGenerated; using Robust.Client.Console; +using Robust.Client.GameObjects; using Robust.Client.Player; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; @@ -22,7 +23,7 @@ public sealed partial class SpawnExplosionWindow : DefaultWindow [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entMan = default!; - + private readonly SharedTransformSystem _transform = default!; private readonly SpawnExplosionEui _eui; private List _mapData = new(); @@ -37,6 +38,7 @@ public sealed partial class SpawnExplosionWindow : DefaultWindow { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + _transform = _entMan.System(); _eui = eui; ExplosionOption.OnItemSelected += ExplosionSelected; @@ -104,7 +106,7 @@ public sealed partial class SpawnExplosionWindow : DefaultWindow _pausePreview = true; MapOptions.Select(_mapData.IndexOf(transform.MapID)); - (MapX.Value, MapY.Value) = transform.MapPosition.Position; + (MapX.Value, MapY.Value) = _transform.GetMapCoordinates(_playerManager.LocalEntity!.Value, xform: transform).Position; _pausePreview = false; UpdatePreview(); diff --git a/Content.Client/Animations/TrackUserComponent.cs b/Content.Client/Animations/TrackUserComponent.cs new file mode 100644 index 0000000000..374c187398 --- /dev/null +++ b/Content.Client/Animations/TrackUserComponent.cs @@ -0,0 +1,17 @@ +using System.Numerics; + +namespace Content.Client.Animations; + +/// +/// Entities with this component tracks the user's world position every frame. +/// +[RegisterComponent] +public sealed partial class TrackUserComponent : Component +{ + public EntityUid? User; + + /// + /// Offset in the direction of the entity's rotation. + /// + public Vector2 Offset = Vector2.Zero; +} diff --git a/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs b/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs index f33d765c74..96abc40584 100644 --- a/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs +++ b/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs @@ -9,7 +9,6 @@ namespace Content.Client.Audio.Jukebox; public sealed class JukeboxBoundUserInterface : BoundUserInterface { - [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; [ViewVariables] diff --git a/Content.Client/Audio/Jukebox/JukeboxSystem.cs b/Content.Client/Audio/Jukebox/JukeboxSystem.cs index cd9261a046..6250e7898a 100644 --- a/Content.Client/Audio/Jukebox/JukeboxSystem.cs +++ b/Content.Client/Audio/Jukebox/JukeboxSystem.cs @@ -11,6 +11,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; public override void Initialize() { @@ -37,11 +38,8 @@ public sealed class JukeboxSystem : SharedJukeboxSystem while (query.MoveNext(out var uid, out var jukebox, out var ui)) { - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { + if (!_uiSystem.TryGetOpenUi((uid, ui), JukeboxUiKey.Key, out var bui)) continue; - } if (obj.Removed?.TryGetValue(typeof(JukeboxPrototype), out var removed) ?? false) { @@ -67,15 +65,9 @@ public sealed class JukeboxSystem : SharedJukeboxSystem private void OnJukeboxAfterState(Entity ent, ref AfterAutoHandleStateEvent args) { - if (!TryComp(ent, out UserInterfaceComponent? ui)) + if (!_uiSystem.TryGetOpenUi(ent.Owner, JukeboxUiKey.Key, out var bui)) return; - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { - return; - } - bui.Reload(); } diff --git a/Content.Client/Changelog/ChangelogWindow.xaml.cs b/Content.Client/Changelog/ChangelogWindow.xaml.cs index e5f492900c..9b7fd75436 100644 --- a/Content.Client/Changelog/ChangelogWindow.xaml.cs +++ b/Content.Client/Changelog/ChangelogWindow.xaml.cs @@ -87,14 +87,12 @@ namespace Content.Client.Changelog if (!tab.AdminOnly || isAdmin) { Tabs.SetTabVisible(i, true); - tab.Visible = true; visibleTabs++; firstVisible ??= i; } else { Tabs.SetTabVisible(i, false); - tab.Visible = false; } } diff --git a/Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs b/Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs new file mode 100644 index 0000000000..58c5a05894 --- /dev/null +++ b/Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs @@ -0,0 +1,22 @@ +using Content.Client.Chemistry.EntitySystems; +using Content.Client.Chemistry.UI; + +namespace Content.Client.Chemistry.Components; + +/// +/// Exposes a solution container's contents via a basic item status control. +/// +/// +/// Shows the solution volume, max volume, and transfer amount. +/// +/// +/// +[RegisterComponent] +public sealed partial class SolutionItemStatusComponent : Component +{ + /// + /// The ID of the solution that will be shown on the item status control. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string Solution = "default"; +} diff --git a/Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs b/Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs new file mode 100644 index 0000000000..76aab516a7 --- /dev/null +++ b/Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs @@ -0,0 +1,22 @@ +using Content.Client.Chemistry.Components; +using Content.Client.Chemistry.UI; +using Content.Client.Items; +using Content.Shared.Chemistry.EntitySystems; + +namespace Content.Client.Chemistry.EntitySystems; + +/// +/// Wires up item status logic for . +/// +/// +public sealed class SolutionItemStatusSystem : EntitySystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; + + public override void Initialize() + { + base.Initialize(); + Subs.ItemStatus( + entity => new SolutionStatusControl(entity, EntityManager, _solutionContainerSystem)); + } +} diff --git a/Content.Client/Chemistry/UI/InjectorStatusControl.cs b/Content.Client/Chemistry/UI/InjectorStatusControl.cs index ba1f97cd1e..f9b0d90e20 100644 --- a/Content.Client/Chemistry/UI/InjectorStatusControl.cs +++ b/Content.Client/Chemistry/UI/InjectorStatusControl.cs @@ -32,7 +32,7 @@ public sealed class InjectorStatusControl : Control { base.FrameUpdate(args); - if (!_solutionContainers.TryGetSolution(_parent.Owner, InjectorComponent.SolutionName, out _, out var solution)) + if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.SolutionName, out _, out var solution)) return; // only updates the UI if any of the details are different than they previously were diff --git a/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs b/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs index fce57a6ec5..99e5a3d395 100644 --- a/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs +++ b/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs @@ -1,3 +1,4 @@ +using Content.Client.Guidebook.Components; using Content.Shared.Chemistry; using Content.Shared.Containers.ItemSlots; using JetBrains.Annotations; @@ -34,6 +35,7 @@ namespace Content.Client.Chemistry.UI _window = new() { Title = EntMan.GetComponent(Owner).EntityName, + HelpGuidebookIds = EntMan.GetComponent(Owner).Guides }; _window.OpenCentered(); diff --git a/Content.Client/Chemistry/UI/SolutionStatusControl.cs b/Content.Client/Chemistry/UI/SolutionStatusControl.cs new file mode 100644 index 0000000000..1a33ffb0e1 --- /dev/null +++ b/Content.Client/Chemistry/UI/SolutionStatusControl.cs @@ -0,0 +1,59 @@ +using Content.Client.Chemistry.Components; +using Content.Client.Chemistry.EntitySystems; +using Content.Client.Items.UI; +using Content.Client.Message; +using Content.Client.Stylesheets; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.FixedPoint; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.Chemistry.UI; + +/// +/// Displays basic solution information for . +/// +/// +public sealed class SolutionStatusControl : PollingItemStatusControl +{ + private readonly Entity _parent; + private readonly IEntityManager _entityManager; + private readonly SharedSolutionContainerSystem _solutionContainers; + private readonly RichTextLabel _label; + + public SolutionStatusControl( + Entity parent, + IEntityManager entityManager, + SharedSolutionContainerSystem solutionContainers) + { + _parent = parent; + _entityManager = entityManager; + _solutionContainers = solutionContainers; + _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; + AddChild(_label); + } + + protected override Data PollData() + { + if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.Solution, out _, out var solution)) + return default; + + FixedPoint2? transferAmount = null; + if (_entityManager.TryGetComponent(_parent.Owner, out SolutionTransferComponent? transfer)) + transferAmount = transfer.TransferAmount; + + return new Data(solution.Volume, solution.MaxVolume, transferAmount); + } + + protected override void Update(in Data data) + { + var markup = Loc.GetString("solution-status-volume", + ("currentVolume", data.Volume), + ("maxVolume", data.MaxVolume)); + if (data.TransferVolume is { } transferVolume) + markup += "\n" + Loc.GetString("solution-status-transfer", ("volume", transferVolume)); + _label.SetMarkup(markup); + } + + public readonly record struct Data(FixedPoint2 Volume, FixedPoint2 MaxVolume, FixedPoint2? TransferVolume); +} diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index b74b13a175..dcf6645daa 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -13,6 +13,7 @@ using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.TypeSerializers.Implementations; using Robust.Shared.Utility; using static Robust.Client.GameObjects.SpriteComponent; @@ -53,6 +54,7 @@ public sealed class ClientClothingSystem : ClothingSystem }; [Dependency] private readonly IResourceCache _cache = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -296,6 +298,7 @@ public sealed class ClientClothingSystem : ClothingSystem // temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a // bookmark to determine where in the list of layers we should insert the clothing layers. bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index); + var displacementData = inventory.Displacements.GetValueOrDefault(slot); // add the new layers foreach (var (key, layerData) in ev.Layers) @@ -340,6 +343,28 @@ public sealed class ClientClothingSystem : ClothingSystem sprite.LayerSetData(index, layerData); layer.Offset += slotDef.Offset; + + if (displacementData != null) + { + if (displacementData.ShaderOverride != null) + sprite.LayerSetShader(index, displacementData.ShaderOverride); + + var displacementKey = $"{key}-displacement"; + if (!revealedLayers.Add(displacementKey)) + { + Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}."); + continue; + } + + var displacementLayer = _serialization.CreateCopy(displacementData.Layer, notNullableOverride: true); + displacementLayer.CopyToShaderParameters!.LayerKey = key; + + // Add before main layer for this item. + sprite.AddLayer(displacementLayer, index); + sprite.LayerMapSet(displacementKey, index); + + revealedLayers.Add(displacementKey); + } } RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true); @@ -389,4 +414,4 @@ public sealed class ClientClothingSystem : ClothingSystem sprite.LayerSetVisible(layer, true); } -} \ No newline at end of file +} diff --git a/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs index 2a34376f6a..4bf9d4c3e1 100644 --- a/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs +++ b/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs @@ -2,6 +2,4 @@ using Content.Shared.CriminalRecords.Systems; namespace Content.Client.CriminalRecords.Systems; -public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleSystem -{ -} +public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleSystem; diff --git a/Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs b/Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs new file mode 100644 index 0000000000..c895a00c88 --- /dev/null +++ b/Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.CriminalRecords.Systems; + +namespace Content.Client.CriminalRecords.Systems; + +public sealed class CriminalRecordsHackerSystem : SharedCriminalRecordsHackerSystem; diff --git a/Content.Client/CriminalRecords/Systems/CriminalRecordsSystem.cs b/Content.Client/CriminalRecords/Systems/CriminalRecordsSystem.cs new file mode 100644 index 0000000000..c0b98d7ce3 --- /dev/null +++ b/Content.Client/CriminalRecords/Systems/CriminalRecordsSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.CriminalRecords.Systems; + +namespace Content.Client.CriminalRecords.Systems; + +public sealed class CriminalRecordsSystem : SharedCriminalRecordsSystem; diff --git a/Content.Client/Decals/ToggleDecalCommand.cs b/Content.Client/Decals/ToggleDecalCommand.cs index 9f0851f080..025ed1299d 100644 --- a/Content.Client/Decals/ToggleDecalCommand.cs +++ b/Content.Client/Decals/ToggleDecalCommand.cs @@ -5,11 +5,13 @@ namespace Content.Client.Decals; public sealed class ToggleDecalCommand : IConsoleCommand { + [Dependency] private readonly IEntityManager _e = default!; + public string Command => "toggledecals"; public string Description => "Toggles decaloverlay"; public string Help => $"{Command}"; public void Execute(IConsoleShell shell, string argStr, string[] args) { - EntitySystem.Get().ToggleOverlay(); + _e.System().ToggleOverlay(); } } diff --git a/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs b/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs index 1be1751080..21b816515a 100644 --- a/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs +++ b/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs @@ -16,6 +16,7 @@ namespace Content.Client.Decals.UI; public sealed partial class DecalPlacerWindow : DefaultWindow { [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IEntityManager _e = default!; private readonly DecalPlacementSystem _decalPlacementSystem; @@ -39,7 +40,7 @@ public sealed partial class DecalPlacerWindow : DefaultWindow RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); - _decalPlacementSystem = EntitySystem.Get(); + _decalPlacementSystem = _e.System(); // This needs to be done in C# so we can have custom stuff passed in the constructor // and thus have a proper step size diff --git a/Content.Client/DeviceNetwork/JammerSystem.cs b/Content.Client/DeviceNetwork/JammerSystem.cs new file mode 100644 index 0000000000..c7dbf8c8fe --- /dev/null +++ b/Content.Client/DeviceNetwork/JammerSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Radio.EntitySystems; + +namespace Content.Client.DeviceNetwork; + +public sealed class JammerSystem : SharedJammerSystem +{ + +} diff --git a/Content.Client/Disposal/Systems/DisposalUnitSystem.cs b/Content.Client/Disposal/Systems/DisposalUnitSystem.cs index b9e4a38660..2fe56fcce9 100644 --- a/Content.Client/Disposal/Systems/DisposalUnitSystem.cs +++ b/Content.Client/Disposal/Systems/DisposalUnitSystem.cs @@ -153,7 +153,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem } } else if (state == VisualState.OverlayCharging) - sprite.LayerSetState(DisposalUnitVisualLayers.OverlayFlush, new RSI.StateId("disposal-charging")); + sprite.LayerSetState(DisposalUnitVisualLayers.OverlayFlush, chargingState); else _animationSystem.Stop(uid, AnimationKey); diff --git a/Content.Client/DoAfter/DoAfterOverlay.cs b/Content.Client/DoAfter/DoAfterOverlay.cs index dddcb0eb93..e9e500d3d7 100644 --- a/Content.Client/DoAfter/DoAfterOverlay.cs +++ b/Content.Client/DoAfter/DoAfterOverlay.cs @@ -23,6 +23,7 @@ public sealed class DoAfterOverlay : Overlay private readonly SharedContainerSystem _container; private readonly Texture _barTexture; + private readonly ShaderInstance _unshadedShader; /// /// Flash time for cancelled DoAfters @@ -35,7 +36,7 @@ public sealed class DoAfterOverlay : Overlay public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV; - public DoAfterOverlay(IEntityManager entManager, IGameTiming timing, IPlayerManager player) + public DoAfterOverlay(IEntityManager entManager, IPrototypeManager protoManager, IGameTiming timing, IPlayerManager player) { _entManager = entManager; _timing = timing; @@ -46,6 +47,8 @@ public sealed class DoAfterOverlay : Overlay _progressColor = _entManager.System(); var sprite = new SpriteSpecifier.Rsi(new ResPath("/Textures/Interface/Misc/progress_bar.rsi"), "icon"); _barTexture = _entManager.EntitySysManager.GetEntitySystem().Frame0(sprite); + + _unshadedShader = protoManager.Index("unshaded").Instance(); } protected override void Draw(in OverlayDrawArgs args) @@ -80,6 +83,13 @@ public sealed class DoAfterOverlay : Overlay if (!bounds.Contains(worldPosition)) continue; + // shades the do-after bar if the do-after bar belongs to other players + // does not shade do-afters belonging to the local player + if (uid != localEnt) + handle.UseShader(null); + else + handle.UseShader(_unshadedShader); + // If the entity is paused, we will draw the do-after as it was when the entity got paused. var meta = metaQuery.GetComponent(uid); var time = meta.EntityPaused diff --git a/Content.Client/DoAfter/DoAfterSystem.cs b/Content.Client/DoAfter/DoAfterSystem.cs index 867a46f171..b00904a1fe 100644 --- a/Content.Client/DoAfter/DoAfterSystem.cs +++ b/Content.Client/DoAfter/DoAfterSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.DoAfter; using Content.Shared.Hands.Components; using Robust.Client.Graphics; using Robust.Client.Player; +using Robust.Shared.Prototypes; namespace Content.Client.DoAfter; @@ -14,12 +15,13 @@ public sealed class DoAfterSystem : SharedDoAfterSystem { [Dependency] private readonly IOverlayManager _overlay = default!; [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; public override void Initialize() { base.Initialize(); - _overlay.AddOverlay(new DoAfterOverlay(EntityManager, GameTiming, _player)); + _overlay.AddOverlay(new DoAfterOverlay(EntityManager, _prototype, GameTiming, _player)); } public override void Shutdown() diff --git a/Content.Client/Extinguisher/FireExtinguisherComponent.cs b/Content.Client/Extinguisher/FireExtinguisherComponent.cs index 126c172924..324b05a93d 100644 --- a/Content.Client/Extinguisher/FireExtinguisherComponent.cs +++ b/Content.Client/Extinguisher/FireExtinguisherComponent.cs @@ -3,7 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Client.Extinguisher; -[NetworkedComponent, RegisterComponent] -public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent -{ -} +[RegisterComponent] +public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent; diff --git a/Content.Client/Eye/EyeLerpingSystem.cs b/Content.Client/Eye/EyeLerpingSystem.cs index 78e1b851fc..ac32299dca 100644 --- a/Content.Client/Eye/EyeLerpingSystem.cs +++ b/Content.Client/Eye/EyeLerpingSystem.cs @@ -86,7 +86,7 @@ public sealed class EyeLerpingSystem : EntitySystem private void HandleMapChange(EntityUid uid, LerpingEyeComponent component, ref EntParentChangedMessage args) { // Is this actually a map change? If yes, stop any lerps - if (args.OldMapId != args.Transform.MapID) + if (args.OldMapId != args.Transform.MapUid) component.LastRotation = GetRotation(uid, args.Transform); } diff --git a/Content.Client/Fax/System/FaxVisualsSystem.cs b/Content.Client/Fax/System/FaxVisualsSystem.cs new file mode 100644 index 0000000000..892aec1d95 --- /dev/null +++ b/Content.Client/Fax/System/FaxVisualsSystem.cs @@ -0,0 +1,48 @@ +using Robust.Client.GameObjects; +using Content.Shared.Fax.Components; +using Content.Shared.Fax; +using Robust.Client.Animations; + +namespace Content.Client.Fax.System; + +/// +/// Visualizer for the fax machine which displays the correct sprite based on the inserted entity. +/// +public sealed class FaxVisualsSystem : EntitySystem +{ + [Dependency] private readonly AnimationPlayerSystem _player = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChanged); + } + + private void OnAppearanceChanged(EntityUid uid, FaxMachineComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (_appearance.TryGetData(uid, FaxMachineVisuals.VisualState, out FaxMachineVisualState visuals) && visuals == FaxMachineVisualState.Inserting) + { + _player.Play(uid, new Animation() + { + Length = TimeSpan.FromSeconds(2.4), + AnimationTracks = + { + new AnimationTrackSpriteFlick() + { + LayerKey = FaxMachineVisuals.VisualState, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame(component.InsertingState, 0f), + new AnimationTrackSpriteFlick.KeyFrame("icon", 2.4f), + } + } + } + }, "faxecute"); + } + } +} diff --git a/Content.Client/Fax/UI/FaxBoundUi.cs b/Content.Client/Fax/UI/FaxBoundUi.cs index 9b57595d7b..a95066a3b5 100644 --- a/Content.Client/Fax/UI/FaxBoundUi.cs +++ b/Content.Client/Fax/UI/FaxBoundUi.cs @@ -40,7 +40,7 @@ public sealed class FaxBoundUi : BoundUserInterface { if (_dialogIsOpen) return; - + _dialogIsOpen = true; var filters = new FileDialogFilters(new FileDialogFilters.Group("txt")); await using var file = await _fileDialogManager.OpenFile(filters); @@ -52,8 +52,27 @@ public sealed class FaxBoundUi : BoundUserInterface } using var reader = new StreamReader(file); + + var firstLine = await reader.ReadLineAsync(); + string? label = null; var content = await reader.ReadToEndAsync(); - SendMessage(new FaxFileMessage(content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)], _window.OfficePaper)); + + if (firstLine is { }) + { + if (firstLine.StartsWith('#')) + { + label = firstLine[1..].Trim(); + } + else + { + content = firstLine + "\n" + content; + } + } + + SendMessage(new FaxFileMessage( + label?[..Math.Min(label.Length, FaxFileMessageValidation.MaxLabelSize)], + content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)], + _window.OfficePaper)); } private void OnSendButtonPressed() diff --git a/Content.Client/GPS/UI/HandheldGpsStatusControl.cs b/Content.Client/GPS/UI/HandheldGpsStatusControl.cs index de6a1031ba..7dcf3f29c5 100644 --- a/Content.Client/GPS/UI/HandheldGpsStatusControl.cs +++ b/Content.Client/GPS/UI/HandheldGpsStatusControl.cs @@ -1,6 +1,7 @@ using Content.Client.GPS.Components; using Content.Client.Message; using Content.Client.Stylesheets; +using Robust.Client.GameObjects; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.Timing; @@ -13,11 +14,13 @@ public sealed class HandheldGpsStatusControl : Control private readonly RichTextLabel _label; private float _updateDif; private readonly IEntityManager _entMan; + private readonly SharedTransformSystem _transform; public HandheldGpsStatusControl(Entity parent) { _parent = parent; _entMan = IoCManager.Resolve(); + _transform = _entMan.System(); _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; AddChild(_label); UpdateGpsDetails(); @@ -41,7 +44,7 @@ public sealed class HandheldGpsStatusControl : Control var posText = "Error"; if (_entMan.TryGetComponent(_parent, out TransformComponent? transComp)) { - var pos = transComp.MapPosition; + var pos = _transform.GetMapCoordinates(_parent.Owner, xform: transComp); var x = (int) pos.X; var y = (int) pos.Y; posText = $"({x}, {y})"; diff --git a/Content.Client/GameTicking/Commands/ShowManifestCommand.cs b/Content.Client/GameTicking/Commands/ShowManifestCommand.cs index 3595910cdb..d3f77c8f59 100644 --- a/Content.Client/GameTicking/Commands/ShowManifestCommand.cs +++ b/Content.Client/GameTicking/Commands/ShowManifestCommand.cs @@ -17,14 +17,6 @@ namespace Content.Client.GameTicking.Commands public void Execute(IConsoleShell shell, string argStr, string[] args) { - var ticker = _entitySystem.GetEntitySystem(); - var window = ticker._window; - - if (!ticker.IsGameStarted && window != null) - { - window.OpenCentered(); - return; - } shell.WriteLine("You can't open manifest right now"); } } diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs index 7f2064000e..309db2eb4e 100644 --- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs +++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs @@ -1,3 +1,4 @@ +using Content.Client.Administration.Managers; using Content.Client.Gameplay; using Content.Client.Lobby; using Content.Client.RoundEnd; @@ -6,7 +7,7 @@ using Content.Shared.GameWindow; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Client.State; -using Robust.Shared.Utility; +using Robust.Client.UserInterface; namespace Content.Client.GameTicking.Managers { @@ -14,17 +15,14 @@ namespace Content.Client.GameTicking.Managers public sealed class ClientGameTicker : SharedGameTicker { [Dependency] private readonly IStateManager _stateManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IClientAdminManager _admin = default!; + [Dependency] private readonly IClyde _clyde = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; - [ViewVariables] private bool _initialized; private Dictionary> _jobsAvailable = new(); private Dictionary _stationNames = new(); - /// - /// The current round-end window. Could be used to support re-opening the window after closing it. - /// - public RoundEndSummaryWindow? _window; - [ViewVariables] public bool AreWeReady { get; private set; } [ViewVariables] public bool IsGameStarted { get; private set; } [ViewVariables] public string? RestartSound { get; private set; } @@ -44,8 +42,6 @@ namespace Content.Client.GameTicking.Managers public override void Initialize() { - DebugTools.Assert(!_initialized); - SubscribeNetworkEvent(JoinLobby); SubscribeNetworkEvent(JoinGame); SubscribeNetworkEvent(ConnectionStatus); @@ -53,14 +49,33 @@ namespace Content.Client.GameTicking.Managers SubscribeNetworkEvent(LobbyInfo); SubscribeNetworkEvent(LobbyCountdown); SubscribeNetworkEvent(RoundEnd); - SubscribeNetworkEvent(msg => - { - IoCManager.Resolve().RequestWindowAttention(); - }); + SubscribeNetworkEvent(OnAttentionRequest); SubscribeNetworkEvent(LateJoinStatus); SubscribeNetworkEvent(UpdateJobsAvailable); - _initialized = true; + _admin.AdminStatusUpdated += OnAdminUpdated; + OnAdminUpdated(); + } + + public override void Shutdown() + { + _admin.AdminStatusUpdated -= OnAdminUpdated; + base.Shutdown(); + } + + private void OnAdminUpdated() + { + // Hide some map/grid related logs from clients. This is to try prevent some easy metagaming by just + // reading the console. E.g., logs like this one could leak the nuke station/grid: + // > Grid NT-Arrivals 1101 (122/n25896) changed parent. Old parent: map 10 (121/n25895). New parent: FTL (123/n26470) +#if !DEBUG + _map.Log.Level = _admin.IsAdmin() ? LogLevel.Info : LogLevel.Warning; +#endif + } + + private void OnAttentionRequest(RequestWindowAttentionEvent ev) + { + _clyde.RequestWindowAttention(); } private void LateJoinStatus(TickerLateJoinStatusEvent message) @@ -132,12 +147,7 @@ namespace Content.Client.GameTicking.Managers // Force an update in the event of this song being the same as the last. RestartSound = message.RestartSound; - // Don't open duplicate windows (mainly for replays). - if (_window?.RoundId == message.RoundId) - return; - - //This is not ideal at all, but I don't see an immediately better fit anywhere else. - _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, _entityManager); + _userInterfaceManager.GetUIController().OpenRoundEndSummaryWindow(message); } } } diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs index e2b09386df..537494933b 100644 --- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs @@ -4,6 +4,7 @@ using Content.Client.Chemistry.EntitySystems; using Content.Client.Guidebook.Richtext; using Content.Client.Message; using Content.Client.UserInterface.ControlExtensions; +using Content.Shared.Body.Prototypes; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using JetBrains.Annotations; @@ -128,7 +129,7 @@ public sealed partial class GuideReagentEmbed : BoxContainer, IDocumentTag, ISea var groupLabel = new RichTextLabel(); groupLabel.SetMarkup(Loc.GetString("guidebook-reagent-effects-metabolism-group-rate", - ("group", group), ("rate", effect.MetabolismRate))); + ("group", _prototype.Index(group).LocalizedName), ("rate", effect.MetabolismRate))); var descriptionLabel = new RichTextLabel { Margin = new Thickness(25, 0, 10, 0) diff --git a/Content.Client/Guidebook/GuideEntry.cs b/Content.Client/Guidebook/GuideEntry.cs index b3c004267d..b7b3b3309e 100644 --- a/Content.Client/Guidebook/GuideEntry.cs +++ b/Content.Client/Guidebook/GuideEntry.cs @@ -42,7 +42,7 @@ public class GuideEntry } [Prototype("guideEntry")] -public sealed class GuideEntryPrototype : GuideEntry, IPrototype +public sealed partial class GuideEntryPrototype : GuideEntry, IPrototype { public string ID => Id; } diff --git a/Content.Client/Guidebook/GuidebookSystem.cs b/Content.Client/Guidebook/GuidebookSystem.cs index cb13d4ca6e..0aa2c85142 100644 --- a/Content.Client/Guidebook/GuidebookSystem.cs +++ b/Content.Client/Guidebook/GuidebookSystem.cs @@ -80,6 +80,11 @@ public sealed class GuidebookSystem : EntitySystem }); } + public void OpenHelp(List guides) + { + OnGuidebookOpen?.Invoke(guides, null, null, true, guides[0]); + } + private void OnInteract(EntityUid uid, GuideHelpComponent component, ActivateInWorldEvent args) { if (!_timing.IsFirstTimePredicted) diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index 0cb3ad144d..fcf6d4551f 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -139,7 +139,7 @@ namespace Content.Client.HealthAnalyzer.UI var groupTitleText = $"{Loc.GetString( "health-analyzer-window-damage-group-text", - ("damageGroup", Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId)), + ("damageGroup", _prototypes.Index(damageGroupId).LocalizedName), ("amount", damageAmount) )}"; @@ -170,7 +170,7 @@ namespace Content.Client.HealthAnalyzer.UI var damageString = Loc.GetString( "health-analyzer-window-damage-type-text", - ("damageType", Loc.GetString("health-analyzer-window-damage-type-" + type)), + ("damageType", _prototypes.Index(type).LocalizedName), ("amount", typeAmount) ); diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index 506f374bde..c66271f206 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -109,9 +109,12 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem /// public override void LoadProfile( EntityUid uid, - HumanoidCharacterProfile profile, + HumanoidCharacterProfile? profile, HumanoidAppearanceComponent? humanoid = null) { + if (profile == null) + return; + if (!Resolve(uid, ref humanoid)) { return; diff --git a/Content.Client/Implants/UI/ImplanterStatusControl.cs b/Content.Client/Implants/UI/ImplanterStatusControl.cs index f3f0cdea7d..e2ffabd17d 100644 --- a/Content.Client/Implants/UI/ImplanterStatusControl.cs +++ b/Content.Client/Implants/UI/ImplanterStatusControl.cs @@ -1,5 +1,6 @@ using Content.Client.Message; using Content.Client.Stylesheets; +using Content.Client.UserInterface.Controls; using Content.Shared.Implants.Components; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; @@ -17,7 +18,7 @@ public sealed class ImplanterStatusControl : Control _parent = parent; _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; _label.MaxWidth = 350; - AddChild(_label); + AddChild(new ClipControl { Children = { _label } }); Update(); } @@ -42,17 +43,12 @@ public sealed class ImplanterStatusControl : Control _ => Loc.GetString("injector-invalid-injector-toggle-mode") }; - var (implantName, implantDescription) = _parent.ImplanterSlot.HasItem switch - { - false => (Loc.GetString("implanter-empty-text"), ""), - true => (_parent.ImplantData.Item1, _parent.ImplantData.Item2), - }; - + var implantName = _parent.ImplanterSlot.HasItem + ? _parent.ImplantData.Item1 + : Loc.GetString("implanter-empty-text"); _label.SetMarkup(Loc.GetString("implanter-label", ("implantName", implantName), - ("implantDescription", implantDescription), - ("modeString", modeStringLocalized), - ("lineBreak", "\n"))); + ("modeString", modeStringLocalized))); } } diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 6756208a1a..fadd34433e 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -38,6 +38,7 @@ namespace Content.Client.Input common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); common.AddFunction(ContentKeyFunctions.InspectEntity); + common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow); // Not in engine, because engine cannot check for sanbox/admin status before starting placement. common.AddFunction(ContentKeyFunctions.EditorCopyObject); diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index 7b98513a92..87cea4e3d2 100644 --- a/Content.Client/Inventory/ClientInventorySystem.cs +++ b/Content.Client/Inventory/ClientInventorySystem.cs @@ -199,7 +199,7 @@ namespace Content.Client.Inventory public void UIInventoryStorageActivate(string slot) { - EntityManager.EntityNetManager?.SendSystemNetworkMessage(new OpenSlotStorageNetworkMessage(slot)); + EntityManager.RaisePredictiveEvent(new OpenSlotStorageNetworkMessage(slot)); } public void UIInventoryExamine(string slot, EntityUid uid) @@ -251,6 +251,7 @@ namespace Content.Client.Inventory public string SlotGroup => SlotDef.SlotGroup; public string SlotDisplayName => SlotDef.DisplayName; public string TextureName => "Slots/" + SlotDef.TextureName; + public string FullTextureName => SlotDef.FullTextureName; public SlotData(SlotDefinition slotDef, ContainerSlot? container = null, bool highlighted = false, bool blocked = false) diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index 2f47cb0d25..47e7d4cf80 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -219,7 +219,7 @@ namespace Content.Client.Inventory if (entity == null) { - button.SpriteView.SetEntity(null); + button.SetEntity(null); return; } @@ -231,7 +231,7 @@ namespace Content.Client.Inventory else return; - button.SpriteView.SetEntity(viewEnt); + button.SetEntity(viewEnt); } } } diff --git a/Content.Client/Items/UI/PollingItemStatusControl.cs b/Content.Client/Items/UI/PollingItemStatusControl.cs new file mode 100644 index 0000000000..39cffb06f6 --- /dev/null +++ b/Content.Client/Items/UI/PollingItemStatusControl.cs @@ -0,0 +1,28 @@ +using Robust.Client.UserInterface; +using Robust.Shared.Timing; + +namespace Content.Client.Items.UI; + +/// +/// A base for item status controls that poll data every frame. Avoids UI updates if data didn't change. +/// +/// The full status control data that is polled every frame. +public abstract class PollingItemStatusControl : Control where TData : struct, IEquatable +{ + private TData _lastData; + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + + var newData = PollData(); + if (newData.Equals(_lastData)) + return; + + _lastData = newData; + Update(newData); + } + + protected abstract TData PollData(); + protected abstract void Update(in TData data); +} diff --git a/Content.Client/Labels/EntitySystems/HandLabelerSystem.cs b/Content.Client/Labels/EntitySystems/HandLabelerSystem.cs new file mode 100644 index 0000000000..e956014b2e --- /dev/null +++ b/Content.Client/Labels/EntitySystems/HandLabelerSystem.cs @@ -0,0 +1,18 @@ +using Content.Client.Labels.UI; +using Content.Shared.Labels; +using Content.Shared.Labels.Components; +using Content.Shared.Labels.EntitySystems; + +namespace Content.Client.Labels.EntitySystems; + +public sealed class HandLabelerSystem : SharedHandLabelerSystem +{ + protected override void UpdateUI(Entity ent) + { + if (UserInterfaceSystem.TryGetOpenUi(ent.Owner, HandLabelerUiKey.Key, out var bui) + && bui is HandLabelerBoundUserInterface cBui) + { + cBui.Reload(); + } + } +} diff --git a/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs b/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs index d393c43f93..555f1ff09e 100644 --- a/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs +++ b/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs @@ -1,4 +1,5 @@ using Content.Shared.Labels; +using Content.Shared.Labels.Components; using Robust.Client.GameObjects; namespace Content.Client.Labels.UI @@ -8,11 +9,14 @@ namespace Content.Client.Labels.UI /// public sealed class HandLabelerBoundUserInterface : BoundUserInterface { + [Dependency] private readonly IEntityManager _entManager = default!; + [ViewVariables] private HandLabelerWindow? _window; public HandLabelerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { + IoCManager.InjectDependencies(this); } protected override void Open() @@ -27,24 +31,25 @@ namespace Content.Client.Labels.UI _window.OnClose += Close; _window.OnLabelChanged += OnLabelChanged; + Reload(); } private void OnLabelChanged(string newLabel) { - SendMessage(new HandLabelerLabelChangedMessage(newLabel)); - } - - /// - /// Update the UI state based on server-sent info - /// - /// - protected override void UpdateState(BoundUserInterfaceState state) - { - base.UpdateState(state); - if (_window == null || state is not HandLabelerBoundUserInterfaceState cast) + // Focus moment + if (_entManager.TryGetComponent(Owner, out HandLabelerComponent? labeler) && + labeler.AssignedLabel.Equals(newLabel)) return; - _window.SetCurrentLabel(cast.CurrentLabel); + SendPredictedMessage(new HandLabelerLabelChangedMessage(newLabel)); + } + + public void Reload() + { + if (_window == null || !_entManager.TryGetComponent(Owner, out HandLabelerComponent? component)) + return; + + _window.SetCurrentLabel(component.AssignedLabel); } protected override void Dispose(bool disposing) diff --git a/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs b/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs index 7706c31f85..6482cdc1cc 100644 --- a/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs +++ b/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs @@ -9,17 +9,40 @@ namespace Content.Client.Labels.UI { public event Action? OnLabelChanged; + /// + /// Is the user currently entering text into the control? + /// + private bool _focused; + // TODO LineEdit Make this a bool on the LineEdit control + + private string _label = string.Empty; + public HandLabelerWindow() { RobustXamlLoader.Load(this); - LabelLineEdit.OnTextEntered += e => OnLabelChanged?.Invoke(e.Text); - LabelLineEdit.OnFocusExit += e => OnLabelChanged?.Invoke(e.Text); + LabelLineEdit.OnTextEntered += e => + { + _label = e.Text; + OnLabelChanged?.Invoke(_label); + }; + + LabelLineEdit.OnFocusEnter += _ => _focused = true; + LabelLineEdit.OnFocusExit += _ => + { + _focused = false; + LabelLineEdit.Text = _label; + }; } public void SetCurrentLabel(string label) { - LabelLineEdit.Text = label; + if (label == _label) + return; + + _label = label; + if (!_focused) + LabelLineEdit.Text = label; } } } diff --git a/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs b/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs index a2a7fb2531..8077406730 100644 --- a/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs +++ b/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs @@ -52,7 +52,7 @@ public sealed class ExpendableLightSystem : VisualizerSystem "clearnetworklinkoverlays"; public string Description => "Clear all network link overlays."; public string Help => Command; public void Execute(IConsoleShell shell, string argStr, string[] args) { - IoCManager.Resolve().System().ClearAllOverlays(); + _e.System().ClearAllOverlays(); } } diff --git a/Content.Client/NodeContainer/NodeVisCommand.cs b/Content.Client/NodeContainer/NodeVisCommand.cs index c6a95fce5b..249c0d9427 100644 --- a/Content.Client/NodeContainer/NodeVisCommand.cs +++ b/Content.Client/NodeContainer/NodeVisCommand.cs @@ -8,6 +8,8 @@ namespace Content.Client.NodeContainer { public sealed class NodeVisCommand : IConsoleCommand { + [Dependency] private readonly IEntityManager _e = default!; + public string Command => "nodevis"; public string Description => "Toggles node group visualization"; public string Help => ""; @@ -21,20 +23,22 @@ namespace Content.Client.NodeContainer return; } - var sys = EntitySystem.Get(); + var sys = _e.System(); sys.SetVisEnabled(!sys.VisEnabled); } } public sealed class NodeVisFilterCommand : IConsoleCommand { + [Dependency] private readonly IEntityManager _e = default!; + public string Command => "nodevisfilter"; public string Description => "Toggles showing a specific group on nodevis"; public string Help => "Usage: nodevis [filter]\nOmit filter to list currently masked-off"; public void Execute(IConsoleShell shell, string argStr, string[] args) { - var sys = EntitySystem.Get(); + var sys = _e.System(); if (args.Length == 0) { diff --git a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml index 11d35edd6a..0bbbda9d16 100644 --- a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml +++ b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml @@ -36,6 +36,9 @@ + diff --git a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs index 06451d93e2..050d879de4 100644 --- a/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs @@ -69,6 +69,12 @@ namespace Content.Client.Options.UI.Tabs UpdateApplyButton(); }; + ViewportVerticalFitCheckBox.OnToggled += _ => + { + UpdateViewportScale(); + UpdateApplyButton(); + }; + IntegerScalingCheckBox.OnToggled += OnCheckBoxToggled; ViewportLowResCheckBox.OnToggled += OnCheckBoxToggled; ParallaxLowQualityCheckBox.OnToggled += OnCheckBoxToggled; @@ -84,6 +90,7 @@ namespace Content.Client.Options.UI.Tabs ViewportScaleSlider.Value = _cfg.GetCVar(CCVars.ViewportFixedScaleFactor); ViewportStretchCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportStretch); IntegerScalingCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportSnapToleranceMargin) != 0; + ViewportVerticalFitCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportVerticalFit); ViewportLowResCheckBox.Pressed = !_cfg.GetCVar(CCVars.ViewportScaleRender); ParallaxLowQualityCheckBox.Pressed = _cfg.GetCVar(CCVars.ParallaxLowQuality); FpsCounterCheckBox.Pressed = _cfg.GetCVar(CCVars.HudFpsCounterVisible); @@ -119,6 +126,7 @@ namespace Content.Client.Options.UI.Tabs _cfg.SetCVar(CCVars.ViewportFixedScaleFactor, (int) ViewportScaleSlider.Value); _cfg.SetCVar(CCVars.ViewportSnapToleranceMargin, IntegerScalingCheckBox.Pressed ? CCVars.ViewportSnapToleranceMargin.DefaultValue : 0); + _cfg.SetCVar(CCVars.ViewportVerticalFit, ViewportVerticalFitCheckBox.Pressed); _cfg.SetCVar(CCVars.ViewportScaleRender, !ViewportLowResCheckBox.Pressed); _cfg.SetCVar(CCVars.ParallaxLowQuality, ParallaxLowQualityCheckBox.Pressed); _cfg.SetCVar(CCVars.HudFpsCounterVisible, FpsCounterCheckBox.Pressed); @@ -151,6 +159,7 @@ namespace Content.Client.Options.UI.Tabs var isVPStretchSame = ViewportStretchCheckBox.Pressed == _cfg.GetCVar(CCVars.ViewportStretch); var isVPScaleSame = (int) ViewportScaleSlider.Value == _cfg.GetCVar(CCVars.ViewportFixedScaleFactor); var isIntegerScalingSame = IntegerScalingCheckBox.Pressed == (_cfg.GetCVar(CCVars.ViewportSnapToleranceMargin) != 0); + var isVPVerticalFitSame = ViewportVerticalFitCheckBox.Pressed == _cfg.GetCVar(CCVars.ViewportVerticalFit); var isVPResSame = ViewportLowResCheckBox.Pressed == !_cfg.GetCVar(CCVars.ViewportScaleRender); var isPLQSame = ParallaxLowQualityCheckBox.Pressed == _cfg.GetCVar(CCVars.ParallaxLowQuality); var isFpsCounterVisibleSame = FpsCounterCheckBox.Pressed == _cfg.GetCVar(CCVars.HudFpsCounterVisible); @@ -166,6 +175,7 @@ namespace Content.Client.Options.UI.Tabs isVPStretchSame && isVPScaleSame && isIntegerScalingSame && + isVPVerticalFitSame && isVPResSame && isPLQSame && isFpsCounterVisibleSame && @@ -252,6 +262,8 @@ namespace Content.Client.Options.UI.Tabs { ViewportScaleBox.Visible = !ViewportStretchCheckBox.Pressed; IntegerScalingCheckBox.Visible = ViewportStretchCheckBox.Pressed; + ViewportVerticalFitCheckBox.Visible = ViewportStretchCheckBox.Pressed; + ViewportWidthSlider.Visible = ViewportWidthSliderDisplay.Visible = !ViewportStretchCheckBox.Pressed || ViewportStretchCheckBox.Pressed && !ViewportVerticalFitCheckBox.Pressed; ViewportScaleText.Text = Loc.GetString("ui-options-vp-scale", ("scale", ViewportScaleSlider.Value)); } diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 9c7b3c256d..94bce345a5 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -234,6 +234,7 @@ namespace Content.Client.Options.UI.Tabs AddButton(ContentKeyFunctions.OpenInventoryMenu); AddButton(ContentKeyFunctions.OpenAHelp); AddButton(ContentKeyFunctions.OpenActionsMenu); + AddButton(ContentKeyFunctions.ToggleRoundEndSummaryWindow); AddButton(ContentKeyFunctions.OpenEntitySpawnWindow); AddButton(ContentKeyFunctions.OpenSandboxWindow); AddButton(ContentKeyFunctions.OpenTileSpawnWindow); diff --git a/Content.Client/Overlays/ShowCriminalRecordIconsSystem.cs b/Content.Client/Overlays/ShowCriminalRecordIconsSystem.cs new file mode 100644 index 0000000000..8f23cd510c --- /dev/null +++ b/Content.Client/Overlays/ShowCriminalRecordIconsSystem.cs @@ -0,0 +1,28 @@ +using Content.Shared.Overlays; +using Content.Shared.Security.Components; +using Content.Shared.StatusIcon; +using Content.Shared.StatusIcon.Components; +using Robust.Shared.Prototypes; + +namespace Content.Client.Overlays; + +public sealed class ShowCriminalRecordIconsSystem : EquipmentHudSystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetStatusIconsEvent); + } + + private void OnGetStatusIconsEvent(EntityUid uid, CriminalRecordComponent component, ref GetStatusIconsEvent ev) + { + if (!IsActive || ev.InContainer) + return; + + if (_prototype.TryIndex(component.StatusIcon.Id, out var iconPrototype)) + ev.StatusIcons.Add(iconPrototype); + } +} diff --git a/Content.Client/Overlays/ShowHungerIconsSystem.cs b/Content.Client/Overlays/ShowHungerIconsSystem.cs index 58551b30c2..b1c0f3a1a0 100644 --- a/Content.Client/Overlays/ShowHungerIconsSystem.cs +++ b/Content.Client/Overlays/ShowHungerIconsSystem.cs @@ -1,14 +1,13 @@ +using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Nutrition.Components; using Content.Shared.Overlays; -using Content.Shared.StatusIcon; using Content.Shared.StatusIcon.Components; -using Robust.Shared.Prototypes; namespace Content.Client.Overlays; public sealed class ShowHungerIconsSystem : EquipmentHudSystem { - [Dependency] private readonly IPrototypeManager _prototypeMan = default!; + [Dependency] private readonly HungerSystem _hunger = default!; public override void Initialize() { @@ -17,42 +16,12 @@ public sealed class ShowHungerIconsSystem : EquipmentHudSystem(OnGetStatusIconsEvent); } - private void OnGetStatusIconsEvent(EntityUid uid, HungerComponent hungerComponent, ref GetStatusIconsEvent args) + private void OnGetStatusIconsEvent(EntityUid uid, HungerComponent component, ref GetStatusIconsEvent ev) { - if (!IsActive || args.InContainer) + if (!IsActive || ev.InContainer) return; - var hungerIcons = DecideHungerIcon(uid, hungerComponent); - - args.StatusIcons.AddRange(hungerIcons); - } - - private IReadOnlyList DecideHungerIcon(EntityUid uid, HungerComponent hungerComponent) - { - var result = new List(); - - switch (hungerComponent.CurrentThreshold) - { - case HungerThreshold.Overfed: - if (_prototypeMan.TryIndex("HungerIconOverfed", out var overfed)) - { - result.Add(overfed); - } - break; - case HungerThreshold.Peckish: - if (_prototypeMan.TryIndex("HungerIconPeckish", out var peckish)) - { - result.Add(peckish); - } - break; - case HungerThreshold.Starving: - if (_prototypeMan.TryIndex("HungerIconStarving", out var starving)) - { - result.Add(starving); - } - break; - } - - return result; + if (_hunger.TryGetStatusIconPrototype(component, out var iconPrototype)) + ev.StatusIcons.Add(iconPrototype); } } diff --git a/Content.Client/Overlays/ShowJobIconsSystem.cs b/Content.Client/Overlays/ShowJobIconsSystem.cs new file mode 100644 index 0000000000..e24b99f3e8 --- /dev/null +++ b/Content.Client/Overlays/ShowJobIconsSystem.cs @@ -0,0 +1,60 @@ +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; +using Content.Shared.Overlays; +using Content.Shared.PDA; +using Content.Shared.StatusIcon; +using Content.Shared.StatusIcon.Components; +using Robust.Shared.Prototypes; + +namespace Content.Client.Overlays; + +public sealed class ShowJobIconsSystem : EquipmentHudSystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly AccessReaderSystem _accessReader = default!; + + [ValidatePrototypeId] + private const string JobIconForNoId = "JobIconNoId"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetStatusIconsEvent); + } + + private void OnGetStatusIconsEvent(EntityUid uid, StatusIconComponent _, ref GetStatusIconsEvent ev) + { + if (!IsActive || ev.InContainer) + return; + + var iconId = JobIconForNoId; + + if (_accessReader.FindAccessItemsInventory(uid, out var items)) + { + foreach (var item in items) + { + // ID Card + if (TryComp(item, out var id)) + { + iconId = id.JobIcon; + break; + } + + // PDA + if (TryComp(item, out var pda) + && pda.ContainedId != null + && TryComp(pda.ContainedId, out id)) + { + iconId = id.JobIcon; + break; + } + } + } + + if (_prototype.TryIndex(iconId, out var iconPrototype)) + ev.StatusIcons.Add(iconPrototype); + else + Log.Error($"Invalid job icon prototype: {iconPrototype}"); + } +} diff --git a/Content.Client/Overlays/ShowMindShieldIconsSystem.cs b/Content.Client/Overlays/ShowMindShieldIconsSystem.cs new file mode 100644 index 0000000000..8bf39b875f --- /dev/null +++ b/Content.Client/Overlays/ShowMindShieldIconsSystem.cs @@ -0,0 +1,28 @@ +using Content.Shared.Mindshield.Components; +using Content.Shared.Overlays; +using Content.Shared.StatusIcon; +using Content.Shared.StatusIcon.Components; +using Robust.Shared.Prototypes; + +namespace Content.Client.Overlays; + +public sealed class ShowMindShieldIconsSystem : EquipmentHudSystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetStatusIconsEvent); + } + + private void OnGetStatusIconsEvent(EntityUid uid, MindShieldComponent component, ref GetStatusIconsEvent ev) + { + if (!IsActive || ev.InContainer) + return; + + if (_prototype.TryIndex(component.MindShieldStatusIcon.Id, out var iconPrototype)) + ev.StatusIcons.Add(iconPrototype); + } +} diff --git a/Content.Client/Overlays/ShowSecurityIconsSystem.cs b/Content.Client/Overlays/ShowSecurityIconsSystem.cs index e997065405..e69de29bb2 100644 --- a/Content.Client/Overlays/ShowSecurityIconsSystem.cs +++ b/Content.Client/Overlays/ShowSecurityIconsSystem.cs @@ -1,91 +0,0 @@ -using Content.Shared.Access.Components; -using Content.Shared.Access.Systems; -using Content.Shared.Mindshield.Components; -using Content.Shared.Overlays; -using Content.Shared.PDA; -using Content.Shared.Security.Components; -using Content.Shared.StatusIcon; -using Content.Shared.StatusIcon.Components; -using Robust.Shared.Prototypes; - -namespace Content.Client.Overlays; - -public sealed class ShowSecurityIconsSystem : EquipmentHudSystem -{ - [Dependency] private readonly IPrototypeManager _prototypeMan = default!; - [Dependency] private readonly AccessReaderSystem _accessReader = default!; - - [ValidatePrototypeId] - private const string JobIconForNoId = "JobIconNoId"; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnGetStatusIconsEvent); - } - - private void OnGetStatusIconsEvent(EntityUid uid, StatusIconComponent _, ref GetStatusIconsEvent @event) - { - if (!IsActive || @event.InContainer) - { - return; - } - - var securityIcons = DecideSecurityIcon(uid); - - @event.StatusIcons.AddRange(securityIcons); - } - - private IReadOnlyList DecideSecurityIcon(EntityUid uid) - { - var result = new List(); - - var jobIconToGet = JobIconForNoId; - if (_accessReader.FindAccessItemsInventory(uid, out var items)) - { - foreach (var item in items) - { - // ID Card - if (TryComp(item, out IdCardComponent? id)) - { - jobIconToGet = id.JobIcon; - break; - } - - // PDA - if (TryComp(item, out PdaComponent? pda) - && pda.ContainedId != null - && TryComp(pda.ContainedId, out id)) - { - jobIconToGet = id.JobIcon; - break; - } - } - } - - if (_prototypeMan.TryIndex(jobIconToGet, out var jobIcon)) - result.Add(jobIcon); - else - // WD EDIT START - { - Log.Error($"Invalid job icon prototype: {jobIconToGet}"); - result.Add(_prototypeMan.Index(JobIconForNoId)); - } - // WD EDIT END - - if (TryComp(uid, out var comp)) - { - if (_prototypeMan.TryIndex(comp.MindShieldStatusIcon.Id, out var icon)) - result.Add(icon); - } - - if (TryComp(uid, out var record)) - { - if(_prototypeMan.TryIndex(record.StatusIcon.Id, out var criminalIcon)) - result.Add(criminalIcon); - } - - return result; - } -} diff --git a/Content.Client/Overlays/ShowSyndicateIconsSystem.cs b/Content.Client/Overlays/ShowSyndicateIconsSystem.cs index a640726685..660ef198e1 100644 --- a/Content.Client/Overlays/ShowSyndicateIconsSystem.cs +++ b/Content.Client/Overlays/ShowSyndicateIconsSystem.cs @@ -1,10 +1,11 @@ using Content.Shared.Overlays; -using Content.Shared.StatusIcon.Components; using Content.Shared.NukeOps; using Content.Shared.StatusIcon; +using Content.Shared.StatusIcon.Components; using Robust.Shared.Prototypes; namespace Content.Client.Overlays; + public sealed class ShowSyndicateIconsSystem : EquipmentHudSystem { [Dependency] private readonly IPrototypeManager _prototype = default!; @@ -16,28 +17,13 @@ public sealed class ShowSyndicateIconsSystem : EquipmentHudSystem(OnGetStatusIconsEvent); } - private void OnGetStatusIconsEvent(EntityUid uid, NukeOperativeComponent nukeOperativeComponent, ref GetStatusIconsEvent args) + private void OnGetStatusIconsEvent(EntityUid uid, NukeOperativeComponent component, ref GetStatusIconsEvent ev) { - if (!IsActive || args.InContainer) - { + if (!IsActive || ev.InContainer) return; - } - var syndicateIcons = SyndicateIcon(uid, nukeOperativeComponent); - - args.StatusIcons.AddRange(syndicateIcons); - } - - private IReadOnlyList SyndicateIcon(EntityUid uid, NukeOperativeComponent nukeOperativeComponent) - { - var result = new List(); - - if (_prototype.TryIndex(nukeOperativeComponent.SyndStatusIcon, out var syndicateicon)) - { - result.Add(syndicateicon); - } - - return result; + if (_prototype.TryIndex(component.SyndStatusIcon, out var iconPrototype)) + ev.StatusIcons.Add(iconPrototype); } } diff --git a/Content.Client/Overlays/ShowThirstIconsSystem.cs b/Content.Client/Overlays/ShowThirstIconsSystem.cs index f9d6d0ab25..b08aa4340b 100644 --- a/Content.Client/Overlays/ShowThirstIconsSystem.cs +++ b/Content.Client/Overlays/ShowThirstIconsSystem.cs @@ -1,14 +1,13 @@ +using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Nutrition.Components; using Content.Shared.Overlays; -using Content.Shared.StatusIcon; using Content.Shared.StatusIcon.Components; -using Robust.Shared.Prototypes; namespace Content.Client.Overlays; public sealed class ShowThirstIconsSystem : EquipmentHudSystem { - [Dependency] private readonly IPrototypeManager _prototypeMan = default!; + [Dependency] private readonly ThirstSystem _thirst = default!; public override void Initialize() { @@ -17,42 +16,12 @@ public sealed class ShowThirstIconsSystem : EquipmentHudSystem(OnGetStatusIconsEvent); } - private void OnGetStatusIconsEvent(EntityUid uid, ThirstComponent thirstComponent, ref GetStatusIconsEvent args) + private void OnGetStatusIconsEvent(EntityUid uid, ThirstComponent component, ref GetStatusIconsEvent ev) { - if (!IsActive || args.InContainer) + if (!IsActive || ev.InContainer) return; - var thirstIcons = DecideThirstIcon(uid, thirstComponent); - - args.StatusIcons.AddRange(thirstIcons); - } - - private IReadOnlyList DecideThirstIcon(EntityUid uid, ThirstComponent thirstComponent) - { - var result = new List(); - - switch (thirstComponent.CurrentThirstThreshold) - { - case ThirstThreshold.OverHydrated: - if (_prototypeMan.TryIndex("ThirstIconOverhydrated", out var overhydrated)) - { - result.Add(overhydrated); - } - break; - case ThirstThreshold.Thirsty: - if (_prototypeMan.TryIndex("ThirstIconThirsty", out var thirsty)) - { - result.Add(thirsty); - } - break; - case ThirstThreshold.Parched: - if (_prototypeMan.TryIndex("ThirstIconParched", out var parched)) - { - result.Add(parched); - } - break; - } - - return result; + if (_thirst.TryGetStatusIconPrototype(component, out var iconPrototype)) + ev.StatusIcons.Add(iconPrototype!); } } diff --git a/Content.Client/PDA/PdaBoundUserInterface.cs b/Content.Client/PDA/PdaBoundUserInterface.cs index ef9d6e8b9b..07352b512b 100644 --- a/Content.Client/PDA/PdaBoundUserInterface.cs +++ b/Content.Client/PDA/PdaBoundUserInterface.cs @@ -21,7 +21,6 @@ namespace Content.Client.PDA protected override void Open() { base.Open(); - SendMessage(new PdaRequestUpdateInterfaceMessage()); _menu = new PdaMenu(); _menu.OpenCenteredLeft(); _menu.OnClose += Close; @@ -32,17 +31,17 @@ namespace Content.Client.PDA _menu.EjectIdButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId)); }; _menu.EjectPenButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId)); }; _menu.EjectPaiButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId)); }; _menu.ActivateMusicButton.OnPressed += _ => diff --git a/Content.Client/Paper/PaperComponent.cs b/Content.Client/Paper/PaperComponent.cs index d197cd3721..1dc827bf7e 100644 --- a/Content.Client/Paper/PaperComponent.cs +++ b/Content.Client/Paper/PaperComponent.cs @@ -1,9 +1,6 @@ using Content.Shared.Paper; -using Robust.Shared.GameStates; namespace Content.Client.Paper; -[NetworkedComponent, RegisterComponent] -public sealed partial class PaperComponent : SharedPaperComponent -{ -} +[RegisterComponent] +public sealed partial class PaperComponent : SharedPaperComponent; diff --git a/Content.Client/Pinpointer/NavMapSystem.cs b/Content.Client/Pinpointer/NavMapSystem.cs index 868bf1fbc4..e33bc5d329 100644 --- a/Content.Client/Pinpointer/NavMapSystem.cs +++ b/Content.Client/Pinpointer/NavMapSystem.cs @@ -24,14 +24,7 @@ public sealed partial class NavMapSystem : SharedNavMapSystem if (!state.AllChunks!.Contains(index)) component.Chunks.Remove(index); } - - foreach (var beacon in component.Beacons) - { - if (!state.AllBeacons!.Contains(beacon)) - component.Beacons.Remove(beacon); - } } - else { foreach (var index in component.Chunks.Keys) @@ -39,25 +32,19 @@ public sealed partial class NavMapSystem : SharedNavMapSystem if (!state.Chunks.ContainsKey(index)) component.Chunks.Remove(index); } - - foreach (var beacon in component.Beacons) - { - if (!state.Beacons.Contains(beacon)) - component.Beacons.Remove(beacon); - } } - foreach (var ((category, origin), chunk) in state.Chunks) + foreach (var (origin, chunk) in state.Chunks) { var newChunk = new NavMapChunk(origin); - - foreach (var (atmosDirection, value) in chunk) - newChunk.TileData[atmosDirection] = value; - - component.Chunks[(category, origin)] = newChunk; + Array.Copy(chunk, newChunk.TileData, chunk.Length); + component.Chunks[origin] = newChunk; } - foreach (var beacon in state.Beacons) - component.Beacons.Add(beacon); + component.Beacons.Clear(); + foreach (var (nuid, beacon) in state.Beacons) + { + component.Beacons[nuid] = beacon; + } } } diff --git a/Content.Client/Pinpointer/UI/NavMapControl.cs b/Content.Client/Pinpointer/UI/NavMapControl.cs index 3309e7c8df..f4d2f8e2fb 100644 --- a/Content.Client/Pinpointer/UI/NavMapControl.cs +++ b/Content.Client/Pinpointer/UI/NavMapControl.cs @@ -18,6 +18,7 @@ using System.Numerics; using JetBrains.Annotations; using Content.Shared.Atmos; using System.Linq; +using Robust.Shared.Utility; namespace Content.Client.Pinpointer.UI; @@ -71,10 +72,10 @@ public partial class NavMapControl : MapGridControl protected float BackgroundOpacity = 0.9f; private int _targetFontsize = 8; - protected Dictionary<(int, Vector2i), (int, Vector2i)> HorizLinesLookup = new(); - protected Dictionary<(int, Vector2i), (int, Vector2i)> HorizLinesLookupReversed = new(); - protected Dictionary<(int, Vector2i), (int, Vector2i)> VertLinesLookup = new(); - protected Dictionary<(int, Vector2i), (int, Vector2i)> VertLinesLookupReversed = new(); + private Dictionary _horizLines = new(); + private Dictionary _horizLinesReversed = new(); + private Dictionary _vertLines = new(); + private Dictionary _vertLinesReversed = new(); // Components private NavMapComponent? _navMap; @@ -376,7 +377,7 @@ public partial class NavMapControl : MapGridControl var fontSize = (int) Math.Round(1 / WorldRange * DefaultDisplayedRange * UIScale * _targetFontsize, 0); var font = new VectorFont(_cache.GetResource("/Fonts/NotoSans/NotoSans-Bold.ttf"), fontSize); - foreach (var beacon in _navMap.Beacons) + foreach (var beacon in _navMap.Beacons.Values) { var position = beacon.Position - offset; position = ScalePosition(position with { Y = -position.Y }); @@ -485,113 +486,106 @@ public partial class NavMapControl : MapGridControl return; // We'll use the following dictionaries to combine collinear wall lines - HorizLinesLookup.Clear(); - HorizLinesLookupReversed.Clear(); - VertLinesLookup.Clear(); - VertLinesLookupReversed.Clear(); + _horizLines.Clear(); + _horizLinesReversed.Clear(); + _vertLines.Clear(); + _vertLinesReversed.Clear(); - foreach ((var (category, chunkOrigin), var chunk) in _navMap.Chunks) + const int southMask = (int) AtmosDirection.South << (int) NavMapChunkType.Wall; + const int eastMask = (int) AtmosDirection.East << (int) NavMapChunkType.Wall; + const int westMask = (int) AtmosDirection.West << (int) NavMapChunkType.Wall; + const int northMask = (int) AtmosDirection.North << (int) NavMapChunkType.Wall; + + foreach (var (chunkOrigin, chunk) in _navMap.Chunks) { - if (category != NavMapChunkType.Wall) - continue; - - for (var i = 0; i < SharedNavMapSystem.ChunkSize * SharedNavMapSystem.ChunkSize; i++) + for (var i = 0; i < SharedNavMapSystem.ArraySize; i++) { - var value = (ushort) Math.Pow(2, i); - var mask = _navMapSystem.GetCombinedEdgesForChunk(chunk.TileData) & value; - - if (mask == 0x0) + var tileData = chunk.TileData[i] & SharedNavMapSystem.WallMask; + if (tileData == 0) continue; - var relativeTile = SharedNavMapSystem.GetTile(mask); + tileData >>= (int) NavMapChunkType.Wall; + + var relativeTile = SharedNavMapSystem.GetTileFromIndex(i); var tile = (chunk.Origin * SharedNavMapSystem.ChunkSize + relativeTile) * _grid.TileSize; - if (!_navMapSystem.AllTileEdgesAreOccupied(chunk.TileData, relativeTile)) + if (tileData != SharedNavMapSystem.AllDirMask) { - AddRectForThinWall(chunk.TileData, tile); + AddRectForThinWall(tileData, tile); continue; } tile = tile with { Y = -tile.Y }; - NavMapChunk? neighborChunk; - bool neighbor; // North edge - if (relativeTile.Y == SharedNavMapSystem.ChunkSize - 1) - { - neighbor = _navMap.Chunks.TryGetValue((NavMapChunkType.Wall, chunkOrigin + new Vector2i(0, 1)), out neighborChunk) && - (neighborChunk.TileData[AtmosDirection.South] & - SharedNavMapSystem.GetFlag(new Vector2i(relativeTile.X, 0))) != 0x0; - } - else - { - var flag = SharedNavMapSystem.GetFlag(relativeTile + new Vector2i(0, 1)); - neighbor = (chunk.TileData[AtmosDirection.South] & flag) != 0x0; - } + var neighborData = 0; + if (relativeTile.Y != SharedNavMapSystem.ChunkSize - 1) + neighborData = chunk.TileData[i+1]; + else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Up, out neighborChunk)) + neighborData = neighborChunk.TileData[i + 1 - SharedNavMapSystem.ChunkSize]; - if (!neighbor) - AddOrUpdateNavMapLine(tile + new Vector2i(0, -_grid.TileSize), tile + new Vector2i(_grid.TileSize, -_grid.TileSize), HorizLinesLookup, HorizLinesLookupReversed); + if ((neighborData & southMask) == 0) + { + AddOrUpdateNavMapLine(tile + new Vector2i(0, -_grid.TileSize), + tile + new Vector2i(_grid.TileSize, -_grid.TileSize), _horizLines, + _horizLinesReversed); + } // East edge - if (relativeTile.X == SharedNavMapSystem.ChunkSize - 1) - { - neighbor = _navMap.Chunks.TryGetValue((NavMapChunkType.Wall, chunkOrigin + new Vector2i(1, 0)), out neighborChunk) && - (neighborChunk.TileData[AtmosDirection.West] & - SharedNavMapSystem.GetFlag(new Vector2i(0, relativeTile.Y))) != 0x0; - } - else - { - var flag = SharedNavMapSystem.GetFlag(relativeTile + new Vector2i(1, 0)); - neighbor = (chunk.TileData[AtmosDirection.West] & flag) != 0x0; - } + neighborData = 0; + if (relativeTile.X != SharedNavMapSystem.ChunkSize - 1) + neighborData = chunk.TileData[i+SharedNavMapSystem.ChunkSize]; + else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Right, out neighborChunk)) + neighborData = neighborChunk.TileData[i + SharedNavMapSystem.ChunkSize - SharedNavMapSystem.ArraySize]; - if (!neighbor) - AddOrUpdateNavMapLine(tile + new Vector2i(_grid.TileSize, -_grid.TileSize), tile + new Vector2i(_grid.TileSize, 0), VertLinesLookup, VertLinesLookupReversed); + if ((neighborData & westMask) == 0) + { + AddOrUpdateNavMapLine(tile + new Vector2i(_grid.TileSize, -_grid.TileSize), + tile + new Vector2i(_grid.TileSize, 0), _vertLines, _vertLinesReversed); + } // South edge - if (relativeTile.Y == 0) - { - neighbor = _navMap.Chunks.TryGetValue((NavMapChunkType.Wall, chunkOrigin + new Vector2i(0, -1)), out neighborChunk) && - (neighborChunk.TileData[AtmosDirection.North] & - SharedNavMapSystem.GetFlag(new Vector2i(relativeTile.X, SharedNavMapSystem.ChunkSize - 1))) != 0x0; - } - else - { - var flag = SharedNavMapSystem.GetFlag(relativeTile + new Vector2i(0, -1)); - neighbor = (chunk.TileData[AtmosDirection.North] & flag) != 0x0; - } + neighborData = 0; + if (relativeTile.Y != 0) + neighborData = chunk.TileData[i-1]; + else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Down, out neighborChunk)) + neighborData = neighborChunk.TileData[i - 1 + SharedNavMapSystem.ChunkSize]; - if (!neighbor) - AddOrUpdateNavMapLine(tile, tile + new Vector2i(_grid.TileSize, 0), HorizLinesLookup, HorizLinesLookupReversed); + if ((neighborData & northMask) == 0) + { + AddOrUpdateNavMapLine(tile, tile + new Vector2i(_grid.TileSize, 0), _horizLines, + _horizLinesReversed); + } // West edge - if (relativeTile.X == 0) - { - neighbor = _navMap.Chunks.TryGetValue((NavMapChunkType.Wall, chunkOrigin + new Vector2i(-1, 0)), out neighborChunk) && - (neighborChunk.TileData[AtmosDirection.East] & - SharedNavMapSystem.GetFlag(new Vector2i(SharedNavMapSystem.ChunkSize - 1, relativeTile.Y))) != 0x0; - } - else - { - var flag = SharedNavMapSystem.GetFlag(relativeTile + new Vector2i(-1, 0)); - neighbor = (chunk.TileData[AtmosDirection.East] & flag) != 0x0; - } + neighborData = 0; + if (relativeTile.X != 0) + neighborData = chunk.TileData[i-SharedNavMapSystem.ChunkSize]; + else if (_navMap.Chunks.TryGetValue(chunkOrigin + Vector2i.Left, out neighborChunk)) + neighborData = neighborChunk.TileData[i - SharedNavMapSystem.ChunkSize + SharedNavMapSystem.ArraySize]; - if (!neighbor) - AddOrUpdateNavMapLine(tile + new Vector2i(0, -_grid.TileSize), tile, VertLinesLookup, VertLinesLookupReversed); + if ((neighborData & eastMask) == 0) + { + AddOrUpdateNavMapLine(tile + new Vector2i(0, -_grid.TileSize), tile, _vertLines, + _vertLinesReversed); + } // Add a diagonal line for interiors. Unless there are a lot of double walls, there is no point combining these TileLines.Add((tile + new Vector2(0, -_grid.TileSize), tile + new Vector2(_grid.TileSize, 0))); } } - // Record the combined lines - foreach (var (origin, terminal) in HorizLinesLookup) - TileLines.Add((origin.Item2, terminal.Item2)); + // Record the combined lines + foreach (var (origin, terminal) in _horizLines) + { + TileLines.Add((origin, terminal)); + } - foreach (var (origin, terminal) in VertLinesLookup) - TileLines.Add((origin.Item2, terminal.Item2)); + foreach (var (origin, terminal) in _vertLines) + { + TileLines.Add((origin, terminal)); + } } private void UpdateNavMapAirlocks() @@ -599,26 +593,23 @@ public partial class NavMapControl : MapGridControl if (_navMap == null || _grid == null) return; - foreach (var ((category, _), chunk) in _navMap.Chunks) + foreach (var chunk in _navMap.Chunks.Values) { - if (category != NavMapChunkType.Airlock) - continue; - - for (var i = 0; i < SharedNavMapSystem.ChunkSize * SharedNavMapSystem.ChunkSize; i++) + for (var i = 0; i < SharedNavMapSystem.ArraySize; i++) { - var value = (int) Math.Pow(2, i); - var mask = _navMapSystem.GetCombinedEdgesForChunk(chunk.TileData) & value; - - if (mask == 0x0) + var tileData = chunk.TileData[i] & SharedNavMapSystem.AirlockMask; + if (tileData == 0) continue; - var relative = SharedNavMapSystem.GetTile(mask); + tileData >>= (int) NavMapChunkType.Airlock; + + var relative = SharedNavMapSystem.GetTileFromIndex(i); var tile = (chunk.Origin * SharedNavMapSystem.ChunkSize + relative) * _grid.TileSize; // If the edges of an airlock tile are not all occupied, draw a thin airlock for each edge - if (!_navMapSystem.AllTileEdgesAreOccupied(chunk.TileData, relative)) + if (tileData != SharedNavMapSystem.AllDirMask) { - AddRectForThinAirlock(chunk.TileData, tile); + AddRectForThinAirlock(tileData, tile); continue; } @@ -632,108 +623,90 @@ public partial class NavMapControl : MapGridControl } } - private void AddRectForThinWall(Dictionary tileData, Vector2i tile) + private void AddRectForThinWall(int tileData, Vector2i tile) { - if (_navMapSystem == null || _grid == null) - return; + var leftTop = new Vector2(-0.5f, 0.5f - ThinWallThickness); + var rightBottom = new Vector2(0.5f, 0.5f); - var leftTop = new Vector2(-0.5f, -0.5f + ThinWallThickness); - var rightBottom = new Vector2(0.5f, -0.5f); - - foreach (var (direction, mask) in tileData) + for (var i = 0; i < SharedNavMapSystem.Directions; i++) { - var relative = SharedMapSystem.GetChunkRelative(tile, SharedNavMapSystem.ChunkSize); - var flag = (ushort) SharedNavMapSystem.GetFlag(relative); - - if ((mask & flag) == 0) + var dirMask = 1 << i; + if ((tileData & dirMask) == 0) continue; var tilePosition = new Vector2(tile.X + 0.5f, -tile.Y - 0.5f); - var angle = new Angle(0); - - switch (direction) - { - case AtmosDirection.East: angle = new Angle(MathF.PI * 0.5f); break; - case AtmosDirection.South: angle = new Angle(MathF.PI); break; - case AtmosDirection.West: angle = new Angle(MathF.PI * -0.5f); break; - } + // TODO NAVMAP + // Consider using faster rotation operations, given that these are always 90 degree increments + var angle = -((AtmosDirection) dirMask).ToAngle(); TileRects.Add((angle.RotateVec(leftTop) + tilePosition, angle.RotateVec(rightBottom) + tilePosition)); } } - private void AddRectForThinAirlock(Dictionary tileData, Vector2i tile) + private void AddRectForThinAirlock(int tileData, Vector2i tile) { - if (_navMapSystem == null || _grid == null) - return; + var leftTop = new Vector2(-0.5f + FullWallInstep, 0.5f - FullWallInstep - ThinDoorThickness); + var rightBottom = new Vector2(0.5f - FullWallInstep, 0.5f - FullWallInstep); + var centreTop = new Vector2(0f, 0.5f - FullWallInstep - ThinDoorThickness); + var centreBottom = new Vector2(0f, 0.5f - FullWallInstep); - var leftTop = new Vector2(-0.5f + FullWallInstep, -0.5f + FullWallInstep + ThinDoorThickness); - var rightBottom = new Vector2(0.5f - FullWallInstep, -0.5f + FullWallInstep); - var centreTop = new Vector2(0f, -0.5f + FullWallInstep + ThinDoorThickness); - var centreBottom = new Vector2(0f, -0.5f + FullWallInstep); - - foreach (var (direction, mask) in tileData) + for (var i = 0; i < SharedNavMapSystem.Directions; i++) { - var relative = SharedMapSystem.GetChunkRelative(tile, SharedNavMapSystem.ChunkSize); - var flag = (ushort) SharedNavMapSystem.GetFlag(relative); - - if ((mask & flag) == 0) + var dirMask = 1 << i; + if ((tileData & dirMask) == 0) continue; var tilePosition = new Vector2(tile.X + 0.5f, -tile.Y - 0.5f); - var angle = new Angle(0); - - switch (direction) - { - case AtmosDirection.East: angle = new Angle(MathF.PI * 0.5f);break; - case AtmosDirection.South: angle = new Angle(MathF.PI); break; - case AtmosDirection.West: angle = new Angle(MathF.PI * -0.5f); break; - } - + var angle = -((AtmosDirection) dirMask).ToAngle(); TileRects.Add((angle.RotateVec(leftTop) + tilePosition, angle.RotateVec(rightBottom) + tilePosition)); TileLines.Add((angle.RotateVec(centreTop) + tilePosition, angle.RotateVec(centreBottom) + tilePosition)); } } - protected void AddOrUpdateNavMapLine - (Vector2i origin, + protected void AddOrUpdateNavMapLine( + Vector2i origin, Vector2i terminus, - Dictionary<(int, Vector2i), (int, Vector2i)> lookup, - Dictionary<(int, Vector2i), (int, Vector2i)> lookupReversed, - int index = 0) + Dictionary lookup, + Dictionary lookupReversed) { - (int, Vector2i) foundTermiusTuple; - (int, Vector2i) foundOriginTuple; + Vector2i foundTermius; + Vector2i foundOrigin; - if (lookup.TryGetValue((index, terminus), out foundTermiusTuple) && - lookupReversed.TryGetValue((index, origin), out foundOriginTuple)) + // Does our new line end at the beginning of an existing line? + if (lookup.Remove(terminus, out foundTermius)) { - lookup[foundOriginTuple] = foundTermiusTuple; - lookupReversed[foundTermiusTuple] = foundOriginTuple; + DebugTools.Assert(lookupReversed[foundTermius] == terminus); - lookup.Remove((index, terminus)); - lookupReversed.Remove((index, origin)); + // Does our new line start at the end of an existing line? + if (lookupReversed.Remove(origin, out foundOrigin)) + { + // Our new line just connects two existing lines + DebugTools.Assert(lookup[foundOrigin] == origin); + lookup[foundOrigin] = foundTermius; + lookupReversed[foundTermius] = foundOrigin; + } + else + { + // Our new line precedes an existing line, extending it further to the left + lookup[origin] = foundTermius; + lookupReversed[foundTermius] = origin; + } + return; } - else if (lookup.TryGetValue((index, terminus), out foundTermiusTuple)) + // Does our new line start at the end of an existing line? + if (lookupReversed.Remove(origin, out foundOrigin)) { - lookup[(index, origin)] = foundTermiusTuple; - lookup.Remove((index, terminus)); - lookupReversed[foundTermiusTuple] = (index, origin); + // Our new line just extends an existing line further to the right + DebugTools.Assert(lookup[foundOrigin] == origin); + lookup[foundOrigin] = terminus; + lookupReversed[terminus] = foundOrigin; + return; } - else if (lookupReversed.TryGetValue((index, origin), out foundOriginTuple)) - { - lookupReversed[(index, terminus)] = foundOriginTuple; - lookupReversed.Remove(foundOriginTuple); - lookup[foundOriginTuple] = (index, terminus); - } - - else - { - lookup.Add((index, origin), (index, terminus)); - lookupReversed.Add((index, terminus), (index, origin)); - } + // Completely disconnected line segment. + lookup.Add(origin, terminus); + lookupReversed.Add(terminus, origin); } protected Vector2 GetOffset() diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index 0b18820897..6e77e913d1 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -199,6 +199,15 @@ namespace Content.Client.Popups PopupEntity(message, uid, type); } + public override void PopupClient(string? message, EntityUid? recipient, PopupType type = PopupType.Small) + { + if (recipient == null) + return; + + if (_timing.IsFirstTimePredicted) + PopupCursor(message, recipient.Value, type); + } + public override void PopupClient(string? message, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small) { if (recipient == null) @@ -208,6 +217,15 @@ namespace Content.Client.Popups PopupEntity(message, uid, recipient.Value, type); } + public override void PopupClient(string? message, EntityCoordinates coordinates, EntityUid? recipient, PopupType type = PopupType.Small) + { + if (recipient == null) + return; + + if (_timing.IsFirstTimePredicted) + PopupCoordinates(message, coordinates, recipient.Value, type); + } + public override void PopupEntity(string? message, EntityUid uid, PopupType type = PopupType.Small) { if (TryComp(uid, out TransformComponent? transform)) diff --git a/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs new file mode 100644 index 0000000000..60ed8d87b9 --- /dev/null +++ b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Power.Components; +using Content.Shared.UserInterface; +using Content.Shared.Wires; + +namespace Content.Client.Power; + +public sealed class ActivatableUIRequiresPowerSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnActivate); + } + + private void OnActivate(EntityUid uid, ActivatableUIRequiresPowerComponent component, ActivatableUIOpenAttemptEvent args) + { + // Client can't predict the power properly at the moment so rely upon the server to do it. + args.Cancel(); + } +} diff --git a/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs b/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs index 3d94318be8..d5057416cf 100644 --- a/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs +++ b/Content.Client/Power/PowerMonitoringConsoleNavMapControl.cs @@ -5,6 +5,7 @@ using Robust.Client.Graphics; using Robust.Shared.Collections; using Robust.Shared.Map.Components; using System.Numerics; +using static Content.Shared.Power.SharedPowerMonitoringConsoleSystem; namespace Content.Client.Power; @@ -26,6 +27,11 @@ public sealed partial class PowerMonitoringConsoleNavMapControl : NavMapControl public List PowerCableNetwork = new(); public List FocusCableNetwork = new(); + private Dictionary[] _horizLines = [new(), new(), new()]; + private Dictionary[] _horizLinesReversed = [new(), new(), new()]; + private Dictionary[] _vertLines = [new(), new(), new()]; + private Dictionary[] _vertLinesReversed = [new(), new(), new()]; + private MapGridComponent? _grid; public PowerMonitoringConsoleNavMapControl() : base() @@ -182,28 +188,32 @@ public sealed partial class PowerMonitoringConsoleNavMapControl : NavMapControl if (chunks == null) return decodedOutput; - // We'll use the following dictionaries to combine collinear power cable lines - HorizLinesLookup.Clear(); - HorizLinesLookupReversed.Clear(); - VertLinesLookup.Clear(); - VertLinesLookupReversed.Clear(); + Array.ForEach(_horizLines, x=> x.Clear()); + Array.ForEach(_horizLinesReversed, x=> x.Clear()); + Array.ForEach(_vertLines, x=> x.Clear()); + Array.ForEach(_vertLinesReversed, x=> x.Clear()); - foreach ((var chunkOrigin, var chunk) in chunks) + foreach (var (chunkOrigin, chunk) in chunks) { - for (int cableIdx = 0; cableIdx < chunk.PowerCableData.Length; cableIdx++) + for (var cableIdx = 0; cableIdx < 3; cableIdx++) { + var horizLines = _horizLines[cableIdx]; + var horizLinesReversed = _horizLinesReversed[cableIdx]; + var vertLines = _vertLines[cableIdx]; + var vertLinesReversed = _vertLinesReversed[cableIdx]; + var chunkMask = chunk.PowerCableData[cableIdx]; - for (var chunkIdx = 0; chunkIdx < SharedNavMapSystem.ChunkSize * SharedNavMapSystem.ChunkSize; chunkIdx++) + for (var chunkIdx = 0; chunkIdx < ChunkSize * ChunkSize; chunkIdx++) { - var value = (int) Math.Pow(2, chunkIdx); + var value = 1 << chunkIdx; var mask = chunkMask & value; if (mask == 0x0) continue; - var relativeTile = SharedNavMapSystem.GetTile(mask); - var tile = (chunk.Origin * SharedNavMapSystem.ChunkSize + relativeTile) * _grid.TileSize; + var relativeTile = GetTileFromIndex(chunkIdx); + var tile = (chunk.Origin * ChunkSize + relativeTile) * _grid.TileSize; tile = tile with { Y = -tile.Y }; PowerCableChunk neighborChunk; @@ -212,39 +222,39 @@ public sealed partial class PowerMonitoringConsoleNavMapControl : NavMapControl // Note: we only check the north and east neighbors // East - if (relativeTile.X == SharedNavMapSystem.ChunkSize - 1) + if (relativeTile.X == ChunkSize - 1) { neighbor = chunks.TryGetValue(chunkOrigin + new Vector2i(1, 0), out neighborChunk) && - (neighborChunk.PowerCableData[cableIdx] & SharedNavMapSystem.GetFlag(new Vector2i(0, relativeTile.Y))) != 0x0; + (neighborChunk.PowerCableData[cableIdx] & GetFlag(new Vector2i(0, relativeTile.Y))) != 0x0; } else { - var flag = SharedNavMapSystem.GetFlag(relativeTile + new Vector2i(1, 0)); + var flag = GetFlag(relativeTile + new Vector2i(1, 0)); neighbor = (chunkMask & flag) != 0x0; } if (neighbor) { // Add points - AddOrUpdateNavMapLine(tile, tile + new Vector2i(_grid.TileSize, 0), HorizLinesLookup, HorizLinesLookupReversed, cableIdx); + AddOrUpdateNavMapLine(tile, tile + new Vector2i(_grid.TileSize, 0), horizLines, horizLinesReversed); } // North - if (relativeTile.Y == SharedNavMapSystem.ChunkSize - 1) + if (relativeTile.Y == ChunkSize - 1) { neighbor = chunks.TryGetValue(chunkOrigin + new Vector2i(0, 1), out neighborChunk) && - (neighborChunk.PowerCableData[cableIdx] & SharedNavMapSystem.GetFlag(new Vector2i(relativeTile.X, 0))) != 0x0; + (neighborChunk.PowerCableData[cableIdx] & GetFlag(new Vector2i(relativeTile.X, 0))) != 0x0; } else { - var flag = SharedNavMapSystem.GetFlag(relativeTile + new Vector2i(0, 1)); + var flag = GetFlag(relativeTile + new Vector2i(0, 1)); neighbor = (chunkMask & flag) != 0x0; } if (neighbor) { // Add points - AddOrUpdateNavMapLine(tile + new Vector2i(0, -_grid.TileSize), tile, VertLinesLookup, VertLinesLookupReversed, cableIdx); + AddOrUpdateNavMapLine(tile + new Vector2i(0, -_grid.TileSize), tile, vertLines, vertLinesReversed); } } @@ -253,11 +263,25 @@ public sealed partial class PowerMonitoringConsoleNavMapControl : NavMapControl var gridOffset = new Vector2(_grid.TileSize * 0.5f, -_grid.TileSize * 0.5f); - foreach (var (origin, terminal) in HorizLinesLookup) - decodedOutput.Add(new PowerMonitoringConsoleLine(origin.Item2 + gridOffset, terminal.Item2 + gridOffset, (PowerMonitoringConsoleLineGroup) origin.Item1)); + for (var index = 0; index < _horizLines.Length; index++) + { + var horizLines = _horizLines[index]; + foreach (var (origin, terminal) in horizLines) + { + decodedOutput.Add(new PowerMonitoringConsoleLine(origin + gridOffset, terminal + gridOffset, + (PowerMonitoringConsoleLineGroup) index)); + } + } - foreach (var (origin, terminal) in VertLinesLookup) - decodedOutput.Add(new PowerMonitoringConsoleLine(origin.Item2 + gridOffset, terminal.Item2 + gridOffset, (PowerMonitoringConsoleLineGroup) origin.Item1)); + for (var index = 0; index < _vertLines.Length; index++) + { + var vertLines = _vertLines[index]; + foreach (var (origin, terminal) in vertLines) + { + decodedOutput.Add(new PowerMonitoringConsoleLine(origin + gridOffset, terminal + gridOffset, + (PowerMonitoringConsoleLineGroup) index)); + } + } return decodedOutput; } diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 75254d8d3e..beae9f0696 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -785,7 +785,6 @@ namespace Content.Client.Preferences.UI CharacterSlot = _preferencesManager.Preferences.SelectedCharacterIndex; UpdateAntagRequirements(); - UpdateRoleRequirements(); UpdateControls(); ShowClothes.Pressed = true; } diff --git a/Content.Client/RCD/AlignRCDConstruction.cs b/Content.Client/RCD/AlignRCDConstruction.cs index da7b22c91a..d5425425a7 100644 --- a/Content.Client/RCD/AlignRCDConstruction.cs +++ b/Content.Client/RCD/AlignRCDConstruction.cs @@ -16,9 +16,9 @@ public sealed class AlignRCDConstruction : PlacementMode { [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly SharedMapSystem _mapSystem = default!; - [Dependency] private readonly RCDSystem _rcdSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + private readonly SharedMapSystem _mapSystem; + private readonly RCDSystem _rcdSystem; + private readonly SharedTransformSystem _transformSystem; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IStateManager _stateManager = default!; @@ -32,12 +32,7 @@ public sealed class AlignRCDConstruction : PlacementMode /// public AlignRCDConstruction(PlacementManager pMan) : base(pMan) { - var dependencies = IoCManager.Instance!; - _entityManager = dependencies.Resolve(); - _mapManager = dependencies.Resolve(); - _playerManager = dependencies.Resolve(); - _stateManager = dependencies.Resolve(); - + IoCManager.InjectDependencies(this); _mapSystem = _entityManager.System(); _rcdSystem = _entityManager.System(); _transformSystem = _entityManager.System(); diff --git a/Content.Client/RCD/RCDMenu.xaml.cs b/Content.Client/RCD/RCDMenu.xaml.cs index 689c904384..16ea754e99 100644 --- a/Content.Client/RCD/RCDMenu.xaml.cs +++ b/Content.Client/RCD/RCDMenu.xaml.cs @@ -12,8 +12,6 @@ using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; using System.Numerics; using Robust.Client.Graphics; -using Robust.Shared.Graphics.RSI; -using Robust.Shared.Serialization.Manager.Exceptions; using Robust.Shared.Utility; namespace Content.Client.RCD; @@ -69,7 +67,7 @@ public sealed partial class RCDMenu : RadialMenu tooltip = Loc.GetString(entProto.Name); } - tooltip = char.ToUpper(tooltip[0]) + tooltip.Remove(0, 1); + tooltip = OopsConcat(char.ToUpper(tooltip[0]).ToString(), tooltip.Remove(0, 1)); var button = new RCDMenuButton() { @@ -119,6 +117,12 @@ public sealed partial class RCDMenu : RadialMenu SendRCDSystemMessageAction += bui.SendRCDSystemMessage; } + private static string OopsConcat(string a, string b) + { + // This exists to prevent Roslyn being clever and compiling something that fails sandbox checks. + return a + b; + } + private void SetupCategories(RadialContainer main, RCDComponent rcd) { foreach (var categoryId in rcd.CategoryPrototypes) diff --git a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs index 9012767ef3..8d5607af2d 100644 --- a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs @@ -1,9 +1,11 @@ using System.Numerics; using Content.Shared.Radiation.Components; +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Shared.Enums; using Robust.Shared.Graphics; using Robust.Shared.Map; +using Robust.Shared.Physics; using Robust.Shared.Prototypes; using Robust.Shared.Timing; @@ -14,6 +16,7 @@ namespace Content.Client.Radiation.Overlays [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; + private TransformSystem? _transform; private const float MaxDist = 15.0f; @@ -72,6 +75,8 @@ namespace Content.Client.Radiation.Overlays //Queries all pulses on the map and either adds or removes them from the list of rendered pulses based on whether they should be drawn (in range? on the same z-level/map? pulse entity still exists?) private void RadiationQuery(IEye? currentEye) { + _transform ??= _entityManager.System(); + if (currentEye == null) { _pulses.Clear(); @@ -91,7 +96,7 @@ namespace Content.Client.Radiation.Overlays ( _baseShader.Duplicate(), new RadiationShaderInstance( - _entityManager.GetComponent(pulseEntity).MapPosition, + _transform.GetMapCoordinates(pulseEntity), pulse.VisualRange, pulse.StartTime, pulse.VisualDuration @@ -109,7 +114,7 @@ namespace Content.Client.Radiation.Overlays _entityManager.TryGetComponent(pulseEntity, out RadiationPulseComponent? pulse)) { var shaderInstance = _pulses[pulseEntity]; - shaderInstance.instance.CurrentMapCoords = _entityManager.GetComponent(pulseEntity).MapPosition; + shaderInstance.instance.CurrentMapCoords = _transform.GetMapCoordinates(pulseEntity); shaderInstance.instance.Range = pulse.VisualRange; } else { _pulses[pulseEntity].shd.Dispose(); diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs index 2ee7e30ec9..d00e319eed 100644 --- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs +++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs @@ -195,9 +195,16 @@ public sealed partial class ReplaySpectatorSystem if (uid != _player.LocalEntity) return; - if (args.Transform.MapUid != null || args.OldMapId == MapId.Nullspace) + if (args.Transform.MapUid != null || args.OldMapId == null) return; + if (_spectatorData != null) + { + // Currently scrubbing/setting the replay tick + // the observer will get respawned once the state was applied + return; + } + // The entity being spectated from was moved to null-space. // This was probably because they were spectating some entity in a client-side replay that left PVS range. // Simple respawn the ghost. diff --git a/Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs b/Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs new file mode 100644 index 0000000000..0219c965cd --- /dev/null +++ b/Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Robotics.Systems; + +namespace Content.Client.Robotics.Systems; + +public sealed class RoboticsConsoleSystem : SharedRoboticsConsoleSystem +{ +} diff --git a/Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs b/Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs new file mode 100644 index 0000000000..6185979eee --- /dev/null +++ b/Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs @@ -0,0 +1,50 @@ +using Content.Shared.Robotics; +using Robust.Client.GameObjects; + +namespace Content.Client.Robotics.UI; + +public sealed class RoboticsConsoleBoundUserInterface : BoundUserInterface +{ + [ViewVariables] + public RoboticsConsoleWindow _window = default!; + + public RoboticsConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _window = new RoboticsConsoleWindow(Owner); + _window.OnDisablePressed += address => + { + SendMessage(new RoboticsConsoleDisableMessage(address)); + }; + _window.OnDestroyPressed += address => + { + SendMessage(new RoboticsConsoleDestroyMessage(address)); + }; + _window.OnClose += Close; + + _window.OpenCentered(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (state is not RoboticsConsoleState cast) + return; + + _window?.UpdateState(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + _window?.Dispose(); + } +} diff --git a/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml b/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml new file mode 100644 index 0000000000..a3b3978790 --- /dev/null +++ b/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml @@ -0,0 +1,40 @@ + + + + + + + + + +