Compare commits

...

165 Commits

Author SHA1 Message Date
monolith8319 d718a07a04 Automated Changelog (#3975) 2026-06-18 19:33:35 +00:00
Mrrpip 3471b3e487 Viper Group Stuff... And Stuff. (#3975) 2026-06-18 21:32:53 +02:00
monolith8319 5c7871e797 Automated Changelog (#4018) 2026-06-18 17:52:18 +00:00
GOLDMASK990 bc9cfe8da6 USSP Minor Faction Update (#4018)
Co-authored-by: Mrrpip <parkerpip@gmail.com>
2026-06-18 19:51:44 +02:00
monolith8319 a165f950bc Automated Changelog (#4102) 2026-06-17 18:06:07 +00:00
deltarune2103 d0f25e6f07 Borgs Are Now Able to Strip People and Provide Faster Surgery (#4102) 2026-06-17 20:05:21 +02:00
zanytwahetra 64f2534eed Re-Buffing 90mm Fangs (#4090)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
2026-06-17 17:54:19 +02:00
monolith8319 9013ca9f0b Automated Changelog (#4107) 2026-06-16 07:43:53 +00:00
Squishy c5e1700f99 Fix Radar Blips Cutting Out on Higher UI Scaling (#4107) 2026-06-16 07:43:24 +00:00
monolith8319 b171a4fbc9 Automated Changelog (#4099) 2026-06-14 02:02:25 +00:00
kasature90 3257d944ef Change Iroh Sfx From Stereo to Mono (#4099)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-06-13 22:01:52 -04:00
Khaomi 500566b61c Proper macOS Build Guide (#4100) 2026-06-12 12:09:00 -04:00
avtom d6051ea127 YAML Cleanup (#4088) 2026-06-12 12:07:29 -04:00
monolith8319 87613108ea Automated Changelog (#4095) 2026-06-12 16:06:52 +00:00
monolith8319 0b60f292b8 Automated Changelog (#4098) 2026-06-12 16:06:21 +00:00
Kayla Solace c79780b527 Fixed Various Typos (#4095) 2026-06-12 12:06:06 -04:00
Harrow b25addb9a7 Ports Advanced Engineering Goggles From Delta-V (#4098)
Co-authored-by: Theo <rebe83a@gmail.com>
2026-06-12 12:05:42 -04:00
monolith8319 b4ef1dfdbf Automated Changelog (#4097) 2026-06-11 09:35:31 +00:00
Harrow f3b1cfb220 Adds the Jaguar to the T0 Tsfmc Voucher (#4097) 2026-06-11 11:34:50 +02:00
monolith8319 a07f9775c2 Automated Changelog (#4053) 2026-06-08 12:05:38 +00:00
lordsej 0fc0163543 Vim Fun (#4053) 2026-06-08 15:05:07 +03:00
monolith8319 2d3b59df47 Automated Changelog (#3839) 2026-06-08 10:47:45 +00:00
thetuerk 28e7ac5235 The Great Artifact Inflation (#3839) 2026-06-08 13:47:15 +03:00
monolith8319 015fcb9f09 Automated Changelog (#4050) 2026-06-08 09:43:10 +00:00
kasature90 3069fe92f9 A Space G36, or Whatever (#4050)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-06-08 05:42:19 -04:00
monolith8319 fe38679d54 Automated Changelog (#4078) 2026-06-08 09:34:28 +00:00
monolith8319 ed7ed8e6d2 Automated Changelog (#4080) 2026-06-08 09:33:53 +00:00
MisterMecky 011b3a47e4 Add Construction Bag to Engi-Vend Inventory (#4078) 2026-06-08 12:33:52 +03:00
The-Aisen cc877cf2ca Small Rosetta Fixes (#4080)
Co-authored-by: NazrinNya <137837419+NazrinNya@users.noreply.github.com>
2026-06-08 12:33:22 +03:00
monolith8319 1ed84474ff Automated Changelog (#4079) 2026-06-07 15:24:16 +00:00
monolith8319 40bab4b761 Automated Changelog (#4092) 2026-06-07 15:23:49 +00:00
Maples e636d8c46c Awesome Non-Mald PR About Rads (#4079)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-06-07 11:23:45 -04:00
tonotom1 7de9ec981e Defrontierize Asteroid Piloting (#4092) 2026-06-07 11:23:18 -04:00
Catshley 075e329553 Vrikaash Release Hotfixes (#4054)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
2026-06-04 21:29:59 +02:00
monolith8319 c8465100e8 Automated Changelog (#4081) 2026-06-02 18:53:54 +00:00
Catshley 1aa55ff84a Derelict Drillsite Buff (#4081) 2026-06-02 20:53:19 +02:00
monolith8319 aabfb52906 Automated Changelog (#4014) 2026-06-01 16:38:08 +00:00
10KE 2f71f3687a More Vox Clothing Sprites + Ports (#4014)
Co-authored-by: Still <git@stillconfusing.net>
Co-authored-by: MissKay1994 <15877268+MissKay1994@users.noreply.github.com>
Co-authored-by: Kittygyat <202250949+Kittygyat@users.noreply.github.com>
2026-06-01 12:37:27 -04:00
monolith8319 230080422a Automated Changelog (#3884) 2026-05-30 10:33:33 +00:00
The-Aisen 77b58424e1 New Ship: NOV-Rosetta (#3884)
Co-authored-by: Corrupt
2026-05-30 12:33:04 +02:00
monolith8319 e1c1dd2261 Automated Changelog (#4077) 2026-05-30 06:00:36 +00:00
Ilya246 c7edd396ba Legalize Nuclear Bombs (#4077) 2026-05-30 06:00:06 +00:00
monolith8319 d47cc5d930 Automated Changelog (#4076) 2026-05-29 21:16:10 +00:00
NazrinNya 69a20da90e Fuck You Actually (#4076)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-05-29 21:15:36 +00:00
Ilya246 8d680ac2f2 Even More Ship Htn Fixes (#4075) 2026-05-29 18:27:05 +00:00
Ilya246 641c863a2b Ship Ai Hotfixes (#4072) 2026-05-29 10:39:11 +00:00
monolith8319 76d84a85b7 Automated Changelog (#4069) 2026-05-27 21:41:01 +00:00
Saint 8c43a95cf0 PR #3949 Revert/Fix - Chimera Biomass (#4069) 2026-05-27 17:36:25 -04:00
10KE 5931354263 Fix Typo in Rules Xml (#4070) 2026-05-27 17:35:56 -04:00
monolith8319 3f327526b6 Automated Changelog (#4063) 2026-05-27 13:59:57 +00:00
Ilya246 d85f02e4e7 Missile Rebalance (#4063) 2026-05-27 13:59:20 +00:00
SRV 9da3fd8c4b Fix Cortical Borers Burning to Death when Inside Host that Is in Superheated Environment. (#4037)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-05-27 13:49:22 +00:00
monolith8319 440a6f160f Automated Changelog (#4064) 2026-05-26 20:00:40 +00:00
Ilya246 3e373e82d7 More Ship HTN Upgrades (#4064) 2026-05-26 20:00:08 +00:00
kasature90 38bd45f966 Took Too Long (#4062)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-26 10:48:08 -04:00
EspeciallyStrange 1bb7795d60 Makes the Fucking TSF Beret Like 2 Pixel Taller (#4046) 2026-05-26 10:32:25 -04:00
monolith8319 cbd90f6855 Automated Changelog (#4056) 2026-05-26 14:26:44 +00:00
10KE a803051523 Rule Slop Ordained By Supreme Leader (#4056) 2026-05-26 10:26:11 -04:00
monolith8319 be513ce2a9 Automated Changelog (#4051) 2026-05-25 02:49:34 +00:00
Maples 670898ddd9 Man Nmald Pr (#4051)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-05-24 22:49:02 -04:00
monolith8319 dcafcb547e Automated Changelog (#4049) 2026-05-24 17:54:12 +00:00
Ilya246 a75a27b456 Mom Can We Have Upstream Merge (#4049)
Co-authored-by: Moony <moony@hellomouse.net>
Co-authored-by: J <billsmith116@gmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com>
Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: TemporalOroboros <TemporalOroboros@gmail.com>
Co-authored-by: Lordbrandon12 <107556696+Lordbrandon12@users.noreply.github.com>
Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com>
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com>
Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: paige404 <59348003+paige404@users.noreply.github.com>
Co-authored-by: ElectroJr <leonsfriedrich@gmail.com>
Co-authored-by: M4rchy-S <89603088+M4rchy-S@users.noreply.github.com>
Co-authored-by: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com>
Co-authored-by: Connor Huffine <chuffine@gmail.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: Schrödinger <132720404+Schrodinger71@users.noreply.github.com>
Co-authored-by: Samuka-C <47865393+Samuka-C@users.noreply.github.com>
Co-authored-by: Milon <milonpl.git@proton.me>
Co-authored-by: ScarKy0 <scarky0@onet.eu>
Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com>
Co-authored-by: psykana <36602558+psykana@users.noreply.github.com>
Co-authored-by: thetuerk <46725294+ThanosDeGraf@users.noreply.github.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com>
Co-authored-by: YotaXP <yotaxp+git@gmail.com>
Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
Co-authored-by: JesterX666 <32009105+JesterX666@users.noreply.github.com>
Co-authored-by: mtrs163 <153596133+mtrs163@users.noreply.github.com>
Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>
2026-05-24 17:53:41 +00:00
monolith8319 65eab87965 Automated Changelog (#4041) 2026-05-24 05:20:54 +00:00
NazrinNya 32d0afa079 Make All EMP Shipguns Unanchorable AKA I Hate Fun (#4041)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-05-24 01:20:23 -04:00
monolith8319 77b9a759fe Automated Changelog (#3985) 2026-05-23 13:32:06 +00:00
Svarshik ec27df2225 PDV Garm - T1 Ship [Replaces Hourglass] (#3985)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
2026-05-23 15:31:38 +02:00
monolith8319 72312bf22c Automated Changelog (#4047) 2026-05-23 10:38:29 +00:00
kasature90 c90d4e731a MERGE THE MISSILE NOW! (#4047)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-23 10:38:00 +00:00
monolith8319 ff47af5c1e Automated Changelog (#3974) 2026-05-23 09:19:45 +00:00
Ilya246 66aa852711 New T2-3 (#3974) 2026-05-23 09:19:15 +00:00
tonotom1 10d45c5715 Stop Debug Crash On Lathe Menu (#4040) 2026-05-22 11:46:49 +00:00
monolith8319 480e69cf77 Automated Changelog (#4038) 2026-05-22 11:08:35 +00:00
kasature90 d68b46c652 Shipyard UI Description Boxes Things Whatever (#4038)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-22 07:08:02 -04:00
Redrover1760 54c398461a Improves Sloppy Code (#3844)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-05-22 10:19:50 +00:00
monolith8319 170a9b2a0e Automated Changelog (#3999) 2026-05-22 10:10:00 +00:00
router 30740c5a5e Ban Mikusss From Contributing to IPC Code (#3999) 2026-05-22 10:09:28 +00:00
monolith8319 a610832902 Automated Changelog (#4031) 2026-05-21 22:08:06 +00:00
kasature90 310de452e3 Some Minor Gunslop (#4031)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-21 18:07:36 -04:00
Ghost581 7bf4fa695c Viper Group Initiate Hardsuit (#4022) 2026-05-21 18:06:42 -04:00
monolith8319 e9a33a1541 Automated Changelog (#4035) 2026-05-21 21:53:10 +00:00
kasature90 9f6ffe9f56 I WOULD NEVER MAKE A RESKINNED SMART FRIDGE (#4035)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-21 17:52:39 -04:00
monolith8319 1867851425 Automated Changelog (#4004) 2026-05-21 17:44:51 +00:00
Catshley 58fe863f59 Vrikaash (#4004) 2026-05-21 19:44:17 +02:00
monolith8319 e7cfdde0aa Automated Changelog (#4017) 2026-05-21 02:58:36 +00:00
Maples 739f77a745 UltraMegaUberSuperDupercalifragilisticexpialidocious Mald PR (#4017)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-05-20 22:58:07 -04:00
monolith8319 6cbcdc0f56 Automated Changelog (#4016) 2026-05-21 02:56:50 +00:00
10KE 7144e3f900 Vox Diet + Organ Mechanics Slop [PORT] (#4016)
Co-authored-by: MissKay1994 <15877268+MissKay1994@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: Qerd <73325910+BigfootBravo@users.noreply.github.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: Dogbone10 <falcolom1@outlook.com>
2026-05-20 22:56:18 -04:00
monolith8319 5b0426d9c1 Automated Changelog (#4020) 2026-05-21 02:49:54 +00:00
LassiH 7f5f6854f6 Adds Copper and Lithium to Scrap Processor (#4020) 2026-05-20 22:49:25 -04:00
monolith8319 7ede21df72 Automated Changelog (#4025) 2026-05-21 02:49:09 +00:00
EspeciallyStrange 7f52d6fa56 Add the TSF Blue Beret and Utility Cover to Medic & Engineer (#4025) 2026-05-20 22:48:38 -04:00
Greenwall-Exe c7d5789ca9 Balor Gunnery Overload Fix + Lighting (#4026) 2026-05-20 22:48:06 -04:00
monolith8319 a2fab7eedd Automated Changelog (#4034) 2026-05-21 02:46:09 +00:00
SRV 0203506cdd Deathrattle Modified to Track Critical State From Death (#4034)
Co-authored-by: kasature90 <kasature.asakim@gmail.com>
2026-05-20 22:45:41 -04:00
monolith8319 5c2563fb29 Automated Changelog (#4023) 2026-05-19 16:44:14 +00:00
Ilya246 c16f892fcf loadouts hotfix (#4023) 2026-05-19 16:43:41 +00:00
monolith8319 12055d5359 Automated Changelog (#4021) 2026-05-19 16:22:19 +00:00
Ilya246 47d92fd030 Change Tax Into Savings (#4021) 2026-05-19 16:21:40 +00:00
monolith8319 2617d0b067 Automated Changelog (#3989) 2026-05-19 10:02:48 +00:00
kasature90 99e5972f26 Weapon Attachments (#3989)
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-19 06:02:15 -04:00
monolith8319 bba5b22f5e Automated Changelog (#3896) 2026-05-19 00:10:46 +00:00
kasature90 96fbd3466c Precision GL For TSFMC (#3896)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-18 20:10:16 -04:00
monolith8319 06c1900a3e Automated Changelog (#4013) 2026-05-18 10:20:39 +00:00
EspeciallyStrange 1d6a55a438 TSF + PDV "Sidearm" Option (#4013) 2026-05-18 06:20:07 -04:00
monolith8319 2acf1cf685 Automated Changelog (#4009) 2026-05-18 07:33:54 +00:00
Corrupt cf486b342a TSF Ocelot Update/New Ship: TSF Jaguar (#4009) 2026-05-18 09:33:22 +02:00
monolith8319 abb7b442e8 Automated Changelog (#4010) 2026-05-16 21:55:26 +00:00
kasature90 14194373ae Tax Shipyard Sales (#4010)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-16 17:54:59 -04:00
monolith8319 4276c79c80 Automated Changelog (#4011) 2026-05-16 20:08:56 +00:00
Corrupt 4da3056ea6 Mining Pulser Fix (#4011) 2026-05-16 22:08:27 +02:00
monolith8319 07eec48623 Automated Changelog (#3903) 2026-05-16 15:06:37 +00:00
chuga-git 27267a080f Ship Combat Tweaks (#3903) 2026-05-16 11:06:06 -04:00
monolith8319 7f4a1ee0eb Automated Changelog (#4007) 2026-05-16 15:04:23 +00:00
Ilya246 c24b0ba1a5 Revert "[PERFORMANCE TEST MERGE] Disable Expeds (#3977)" (#4007) 2026-05-16 15:03:53 +00:00
monolith8319 87aa355771 Automated Changelog (#4006) 2026-05-16 14:55:55 +00:00
EspeciallyStrange 24a877bfd6 TSF Navy Blue Beret & Utility Cover (#4006) 2026-05-16 10:55:25 -04:00
monolith8319 a7e20a2a86 Automated Changelog (#3918) 2026-05-16 14:07:10 +00:00
Mrrpip 33f0732e5e Moves Around Company Tech Nodes and Merges Faction Tree Locations. (#3918) 2026-05-16 10:06:41 -04:00
Huaqas 5cf5cc042d Resomi Displacement Tweaks (#3993) 2026-05-16 09:30:07 -04:00
monolith8319 3a70da2123 Automated Changelog (#3981) 2026-05-16 13:29:47 +00:00
kasature90 2ab5f07911 Further UI Slop (#3981)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-16 09:29:17 -04:00
monolith8319 dcea247872 Automated Changelog (#4000) 2026-05-16 01:10:57 +00:00
Maples 64260eaf0a Removes Trap Anomalys From Asteroids (#4000)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-05-15 21:10:29 -04:00
monolith8319 27b502f496 Automated Changelog (#4001) 2026-05-16 01:09:26 +00:00
Maples 1b4b616bd6 Neptune Fix Thruster (#4001)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-05-15 21:08:52 -04:00
Greenwall-Exe 0e996b9083 Adds Latejoin Spawns to Balor (#3987) 2026-05-15 21:08:24 -04:00
monolith8319 9acdba9493 Automated Changelog (#3996) 2026-05-16 01:05:03 +00:00
GOLDMASK990 c96a1ddee6 USSP Language Implanter Fix (#3996) 2026-05-15 21:04:31 -04:00
monolith8319 4c542d0418 Automated Changelog (#3998) 2026-05-16 01:04:15 +00:00
Corrupt 62571de2f1 E-Shipgun Rebalance/Tweaks (#3998) 2026-05-15 21:03:44 -04:00
monolith8319 f7f5493a5c Automated Changelog (#3956) 2026-05-16 01:00:09 +00:00
kasature90 aaf8ffccaa The IRS (#3956)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-15 20:59:38 -04:00
monolith8319 5715f370ad Automated Changelog (#3937) 2026-05-14 13:26:01 +00:00
kasature90 262b04386e Lets Go, Big Dungeon POI (#3937)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-14 15:25:21 +02:00
monolith8319 85620c1471 Automated Changelog (#3983) 2026-05-12 07:26:36 +00:00
kasature90 15aeb12565 Mercury Return, Hi (#3983)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-12 09:25:58 +02:00
monolith8319 e76238b684 Automated Changelog (#3927) 2026-05-11 09:27:41 +00:00
monolith8319 01312f2df5 Automated Changelog (#3929) 2026-05-11 09:27:08 +00:00
GOLDMASK990 8fcfb3cf12 Zastavnik Helmet Fix (#3927) 2026-05-11 05:26:56 -04:00
kasature90 88d1c185d3 AP/HP/RIP for 6.8x52mm STANAG (#3929)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-11 05:26:38 -04:00
monolith8319 940827dd9a Automated Changelog (#3976) 2026-05-11 09:26:09 +00:00
Ilya246 99c262fa9a Grappling Gun Fix (#3976) 2026-05-11 05:25:31 -04:00
monolith8319 d9d6e9d804 Automated Changelog (#3972) 2026-05-11 09:25:17 +00:00
Redrover1760 3278fb57ea Fixes Crt_vhw Shader TIME Floating Point Precision Errors (#3972) 2026-05-11 05:24:46 -04:00
monolith8319 5f1334e814 Automated Changelog (#3980) 2026-05-10 21:21:15 +00:00
kasature90 b6fdbb157a Drakon Update (#3980)
Co-authored-by: starch <starchpersonal@gmail.com>
2026-05-10 17:20:44 -04:00
significant harassment 969c073e5e Research Tech Position Test Mogging (#3961)
Co-authored-by: Onezero0 <onezero0@outlook.com>
2026-05-10 14:42:55 -04:00
monolith8319 c1dbe723ff Automated Changelog (#3958) 2026-05-10 18:41:31 +00:00
Dumpster Wizard 6e7322426f Make Credits Moth-Edible (#3958)
Co-authored-by: dumpsterwizard <dumpsterwizard@dumpsterfire.dumpster1>
2026-05-10 14:41:01 -04:00
monolith8319 c078ea8281 Automated Changelog (#3978) 2026-05-10 18:40:25 +00:00
Mrrpip 4b9089e9b9 Draupnir Typo Fix. (#3978) 2026-05-10 14:39:56 -04:00
monolith8319 160ce87983 Automated Changelog (#3222) 2026-05-10 18:27:10 +00:00
Greenwall-Exe 8676fa75d6 Z-22 Presents: The New Balor (#3222)
Co-authored-by: UnicornOnLSD <149102472+UnicornOnLSD@users.noreply.github.com>
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-05-10 20:26:41 +02:00
monolith8319 f6a697a6d6 Automated Changelog (#3969) 2026-05-09 20:56:48 +00:00
Maples 0a1ac64516 Corner Plating Fix (#3969)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-05-09 16:56:17 -04:00
monolith8319 ed53bfd2b2 Automated Changelog (#3977) 2026-05-09 18:18:01 +00:00
Ilya246 70fd7b3ba0 [PERFORMANCE TEST MERGE] Disable Expeds (#3977) 2026-05-09 14:17:32 -04:00
monolith8319 302b5bb15e Automated Changelog (#3971) 2026-05-09 13:00:41 +00:00
Maples 9c2606e83b APC to RCD Electrical (#3971)
Co-authored-by: Maples <just like ping me on discord>
Co-authored-by: Maples <just like ping me (@magnomia) on discord>
2026-05-09 09:00:07 -04:00
monolith8319 2605b9e120 Automated Changelog (#3973) 2026-05-09 12:59:53 +00:00
Ilya246 888793d2a1 Revert "Draupnir Nerf (#3960)" (#3973) 2026-05-09 08:59:23 -04:00
kyres1 d04ee1e9fe Adds a New Lobby Screen (#3970) 2026-05-08 21:32:18 -07:00
monolith8319 6ca2889eb6 Automated Changelog (#3968) 2026-05-08 06:45:01 +00:00
Redrover1760 eb59c543cd Adaptive Raycasting (#3968) 2026-05-08 02:44:26 -04:00
Redrover1760 ccf80f10da Viewport Bounds Check for Shield Drawing (#3963) 2026-05-08 02:36:26 -04:00
3700 changed files with 180413 additions and 27446 deletions
+12 -2
View File
@@ -49,13 +49,23 @@ jobs:
run: dotnet build --configuration DebugOpt --no-restore /p:WarningsAsErrors=nullable /m
- name: Run Content.Tests
run: dotnet test --no-build --configuration DebugOpt Content.Tests/Content.Tests.csproj -- NUnit.ConsoleOut=0
shell: pwsh
run: dotnet test --no-build --configuration DebugOpt Content.Tests/Content.Tests.csproj -- NUnit.ConsoleOut=0 NUnit.TestOutputXml="logs" NUnit.WorkDirectory="$(pwd)/test_results"
- name: Run Content.IntegrationTests
shell: pwsh
run: |
$env:DOTNET_gcServer=1
dotnet test --no-build --configuration DebugOpt Content.IntegrationTests/Content.IntegrationTests.csproj --filter "FullyQualifiedName!~ShipyardTest" -- NUnit.ConsoleOut=0 NUnit.MapWarningTo=Failed
dotnet test --no-build --configuration DebugOpt Content.IntegrationTests/Content.IntegrationTests.csproj --filter "FullyQualifiedName!~ShipyardTest" -- NUnit.ConsoleOut=0 NUnit.MapWarningTo=Failed NUnit.TestOutputXml="logs" NUnit.WorkDirectory="$(pwd)/test_results"
- name: Archive NUnit3 test results.
if: always()
uses: actions/upload-artifact@v4
with:
name: nunit3-results-${{ matrix.os }}
path: test_results/*
retention-days: 7
compression-level: 9
ci-success:
name: Build & Test Debug
needs:
@@ -0,0 +1,174 @@
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers;
using Content.IntegrationTests;
using Content.IntegrationTests.Pair;
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Shared.Atmos.Components;
using Content.Shared.CCVar;
using Robust.Shared;
using Robust.Shared.Analyzers;
using Robust.Shared.Configuration;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Maths;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Benchmarks;
/// <summary>
/// Spawns N number of entities with a <see cref="DeltaPressureComponent"/> and
/// simulates them for a number of ticks M.
/// </summary>
[Virtual]
[GcServer(true)]
//[MemoryDiagnoser]
//[ThreadingDiagnoser]
public class DeltaPressureBenchmark
{
/// <summary>
/// Number of entities (windows, really) to spawn with a <see cref="DeltaPressureComponent"/>.
/// </summary>
[Params(1, 10, 100, 1000, 5000, 10000, 50000, 100000)]
public int EntityCount;
/// <summary>
/// Number of entities that each parallel processing job will handle.
/// </summary>
// [Params(1, 10, 100, 1000, 5000, 10000)] For testing how multithreading parameters affect performance (THESE TESTS TAKE 16+ HOURS TO RUN)
[Params(10)]
public int BatchSize;
/// <summary>
/// Number of entities to process per iteration in the DeltaPressure
/// processing loop.
/// </summary>
// [Params(100, 1000, 5000, 10000, 50000)]
[Params(1000)]
public int EntitiesPerIteration;
private readonly EntProtoId _windowProtoId = "Window";
private readonly EntProtoId _wallProtoId = "WallPlastitaniumIndestructible";
private TestPair _pair = default!;
private IEntityManager _entMan = default!;
private SharedMapSystem _map = default!;
private IRobustRandom _random = default!;
private IConfigurationManager _cvar = default!;
private ITileDefinitionManager _tileDefMan = default!;
private AtmosphereSystem _atmospereSystem = default!;
private Entity<GridAtmosphereComponent, GasTileOverlayComponent, MapGridComponent, TransformComponent>
_testEnt;
[GlobalSetup]
public async Task SetupAsync()
{
ProgramShared.PathOffset = "../../../../";
PoolManager.Startup();
_pair = await PoolManager.GetServerClient();
var server = _pair.Server;
var mapdata = await _pair.CreateTestMap();
_entMan = server.ResolveDependency<IEntityManager>();
_map = _entMan.System<SharedMapSystem>();
_random = server.ResolveDependency<IRobustRandom>();
_cvar = server.ResolveDependency<IConfigurationManager>();
_tileDefMan = server.ResolveDependency<ITileDefinitionManager>();
_atmospereSystem = _entMan.System<AtmosphereSystem>();
_random.SetSeed(69420); // Randomness needs to be deterministic for benchmarking.
_cvar.SetCVar(CCVars.DeltaPressureParallelToProcessPerIteration, EntitiesPerIteration);
_cvar.SetCVar(CCVars.DeltaPressureParallelBatchSize, BatchSize);
var plating = _tileDefMan["Plating"].TileId;
/*
Basically, we want to have a 5-wide grid of tiles.
Edges are walled, and the length of the grid is determined by N + 2.
Windows should only touch the top and bottom walls, and each other.
*/
var length = EntityCount + 2; // ensures we can spawn exactly N windows between side walls
const int height = 5;
await server.WaitPost(() =>
{
// Fill required tiles (extend grid) with plating
for (var x = 0; x < length; x++)
{
for (var y = 0; y < height; y++)
{
_map.SetTile(mapdata.Grid, mapdata.Grid, new Vector2i(x, y), new Tile(plating));
}
}
// Spawn perimeter walls and windows row in the middle (y = 2)
const int midY = height / 2;
for (var x = 0; x < length; x++)
{
for (var y = 0; y < height; y++)
{
var coords = new EntityCoordinates(mapdata.Grid, x + 0.5f, y + 0.5f);
var isPerimeter = x == 0 || x == length - 1 || y == 0 || y == height - 1;
if (isPerimeter)
{
_entMan.SpawnEntity(_wallProtoId, coords);
continue;
}
// Spawn windows only on the middle row, spanning interior (excluding side walls)
if (y == midY)
{
_entMan.SpawnEntity(_windowProtoId, coords);
}
}
}
});
// Next we run the fixgridatmos command to ensure that we have some air on our grid.
// Wait a little bit as well.
// TODO: Unhardcode command magic string when fixgridatmos is an actual command we can ref and not just
// a stamp-on in AtmosphereSystem.
await _pair.WaitCommand("fixgridatmos " + mapdata.Grid.Owner, 1);
var uid = mapdata.Grid.Owner;
_testEnt = new Entity<GridAtmosphereComponent, GasTileOverlayComponent, MapGridComponent, TransformComponent>(
uid,
_entMan.GetComponent<GridAtmosphereComponent>(uid),
_entMan.GetComponent<GasTileOverlayComponent>(uid),
_entMan.GetComponent<MapGridComponent>(uid),
_entMan.GetComponent<TransformComponent>(uid));
}
[Benchmark]
public async Task PerformFullProcess()
{
await _pair.Server.WaitPost(() =>
{
while (!_atmospereSystem.RunProcessingStage(_testEnt, AtmosphereProcessingState.DeltaPressure)) { }
});
}
[Benchmark]
public async Task PerformSingleRunProcess()
{
await _pair.Server.WaitPost(() =>
{
_atmospereSystem.RunProcessingStage(_testEnt, AtmosphereProcessingState.DeltaPressure);
});
}
[GlobalCleanup]
public async Task CleanupAsync()
{
await _pair.DisposeAsync();
PoolManager.Shutdown();
}
}
@@ -59,11 +59,11 @@ namespace Content.Benchmarks
private sealed class TestDummy
{
[Dependency] private readonly X1 _x1;
[Dependency] private readonly X2 _x2;
[Dependency] private readonly X3 _x3;
[Dependency] private readonly X4 _x4;
[Dependency] private readonly X5 _x5;
[Dependency] private X1 _x1;
[Dependency] private X2 _x2;
[Dependency] private X3 _x3;
[Dependency] private X4 _x4;
[Dependency] private X5 _x5;
}
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Content.IntegrationTests;
using Content.IntegrationTests.Pair;
using Content.Server.Maps;
using Content.Shared.Maps;
using Robust.Shared;
using Robust.Shared.Analyzers;
using Robust.Shared.EntitySerialization.Systems;
@@ -12,7 +12,7 @@ namespace Content.Client.Access.UI;
[GenerateTypedNameReferences]
public sealed partial class AccessLevelControl : GridContainer
{
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private ILogManager _logManager = default!;
private ISawmill _sawmill = default!;
@@ -8,9 +8,9 @@ using static Content.Shared.Access.Components.AccessOverriderComponent;
namespace Content.Client.Access.UI
{
public sealed class AccessOverriderBoundUserInterface : BoundUserInterface
public sealed partial class AccessOverriderBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
private readonly SharedAccessOverriderSystem _accessOverriderSystem = default!;
private AccessOverriderWindow? _window;
@@ -15,8 +15,8 @@ namespace Content.Client.Access.UI
[GenerateTypedNameReferences]
public sealed partial class AgentIDCardWindow : DefaultWindow
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private IEntitySystemManager _entitySystem = default!;
private readonly SpriteSystem _spriteSystem;
private const int JobIconColumnCount = 10;
@@ -9,9 +9,9 @@ using static Content.Shared.Access.Components.IdCardConsoleComponent;
namespace Content.Client.Access.UI
{
public sealed class IdCardConsoleBoundUserInterface : BoundUserInterface
public sealed partial class IdCardConsoleBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
private readonly SharedIdCardConsoleSystem _idCardConsoleSystem = default!;
private IdCardConsoleWindow? _window;
@@ -16,8 +16,8 @@ namespace Content.Client.Access.UI
[GenerateTypedNameReferences]
public sealed partial class IdCardConsoleWindow : DefaultWindow
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private ILogManager _logManager = default!;
private readonly ISawmill _logMill = default!;
private readonly IdCardConsoleBoundUserInterface _owner;
+5 -5
View File
@@ -18,14 +18,14 @@ using YamlDotNet.RepresentationModel;
namespace Content.Client.Actions
{
[UsedImplicitly]
public sealed class ActionsSystem : SharedActionsSystem
public sealed partial class ActionsSystem : SharedActionsSystem
{
public delegate void OnActionReplaced(EntityUid actionId);
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IResourceManager _resources = default!;
[Dependency] private readonly ISerializationManager _serialization = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private IPlayerManager _playerManager = default!;
[Dependency] private IResourceManager _resources = default!;
[Dependency] private ISerializationManager _serialization = default!;
[Dependency] private MetaDataSystem _metaData = default!;
public event Action<EntityUid>? OnActionAdded;
public event Action<EntityUid>? OnActionRemoved;
+199 -66
View File
@@ -1,9 +1,12 @@
using System.Linq;
using System.Numerics;
using Content.Client.Administration.Systems;
using Content.Client.Stylesheets;
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Content.Shared.Ghost;
using Content.Shared.Mind;
using Content.Shared._NF.Bank;
using Content.Shared.Roles;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface;
@@ -15,32 +18,74 @@ namespace Content.Client.Administration;
internal sealed class AdminNameOverlay : Overlay
{
[Dependency] private readonly IConfigurationManager _config = default!;
private readonly AdminSystem _system;
private readonly IEntityManager _entityManager;
private readonly IEyeManager _eyeManager;
private readonly EntityLookupSystem _entityLookup;
private readonly IUserInterfaceManager _userInterfaceManager;
private readonly SharedRoleSystem _roles;
private readonly Font _font;
private readonly Font _fontBold;
private AdminOverlayAntagFormat _overlayFormat;
private AdminOverlayAntagSymbolStyle _overlaySymbolStyle;
private bool _overlayPlaytime;
private bool _overlayStartingJob;
private float _ghostFadeDistance;
private float _ghostHideDistance;
private int _overlayStackMax;
private float _overlayMergeDistance;
//TODO make this adjustable via GUI
//TODO make this adjustable via GUI?
private readonly ProtoId<RoleTypePrototype>[] _filter =
["SoloAntagonist", "TeamAntagonist", "SiliconAntagonist", "FreeAgent"];
private readonly string _antagLabelClassic = Loc.GetString("admin-overlay-antag-classic");
private readonly Color _antagColorClassic = Color.OrangeRed;
public AdminNameOverlay(AdminSystem system, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, EntityLookupSystem entityLookup, IUserInterfaceManager userInterfaceManager)
public AdminNameOverlay(
AdminSystem system,
IEntityManager entityManager,
IEyeManager eyeManager,
IResourceCache resourceCache,
EntityLookupSystem entityLookup,
IUserInterfaceManager userInterfaceManager,
IConfigurationManager config,
SharedRoleSystem roles)
{
IoCManager.InjectDependencies(this);
_system = system;
_entityManager = entityManager;
_eyeManager = eyeManager;
_entityLookup = entityLookup;
_userInterfaceManager = userInterfaceManager;
_roles = roles;
ZIndex = 200;
_font = new VectorFont(resourceCache.GetResource<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10);
// Setting these to a specific ttf would break the antag symbols
_font = resourceCache.NotoStack();
_fontBold = resourceCache.NotoStack(variation: "Bold");
config.OnValueChanged(CCVars.AdminOverlayAntagFormat, (show) => { _overlayFormat = UpdateOverlayFormat(show); }, true);
config.OnValueChanged(CCVars.AdminOverlaySymbolStyle, (show) => { _overlaySymbolStyle = UpdateOverlaySymbolStyle(show); }, true);
config.OnValueChanged(CCVars.AdminOverlayPlaytime, (show) => { _overlayPlaytime = show; }, true);
config.OnValueChanged(CCVars.AdminOverlayStartingJob, (show) => { _overlayStartingJob = show; }, true);
config.OnValueChanged(CCVars.AdminOverlayGhostHideDistance, (f) => { _ghostHideDistance = f; }, true);
config.OnValueChanged(CCVars.AdminOverlayGhostFadeDistance, (f) => { _ghostFadeDistance = f; }, true);
config.OnValueChanged(CCVars.AdminOverlayStackMax, (i) => { _overlayStackMax = i; }, true);
config.OnValueChanged(CCVars.AdminOverlayMergeDistance, (f) => { _overlayMergeDistance = f; }, true);
}
private AdminOverlayAntagFormat UpdateOverlayFormat(string formatString)
{
if (!Enum.TryParse<AdminOverlayAntagFormat>(formatString, out var format))
format = AdminOverlayAntagFormat.Binary;
return format;
}
private AdminOverlayAntagSymbolStyle UpdateOverlaySymbolStyle(string symbolString)
{
if (!Enum.TryParse<AdminOverlayAntagSymbolStyle>(symbolString, out var symbolStyle))
symbolStyle = AdminOverlayAntagSymbolStyle.Off;
return symbolStyle;
}
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
@@ -48,81 +93,169 @@ internal sealed class AdminNameOverlay : Overlay
protected override void Draw(in OverlayDrawArgs args)
{
var viewport = args.WorldAABB;
var colorDisconnected = Color.White;
var uiScale = _userInterfaceManager.RootControl.UIScale;
var lineoffset = new Vector2(0f, 14f) * uiScale;
var drawnOverlays = new List<(Vector2,Vector2)>() ; // A saved list of the overlays already drawn
//TODO make this adjustable via GUI
var classic = _config.GetCVar(CCVars.AdminOverlayClassic);
var playTime = _config.GetCVar(CCVars.AdminOverlayPlaytime);
var startingJob = _config.GetCVar(CCVars.AdminOverlayStartingJob);
foreach (var playerInfo in _system.PlayerList)
// Get all player positions before drawing overlays, so they can be sorted before iteration
var sortable = new List<(PlayerInfo, Box2, EntityUid, Vector2)>();
foreach (var info in _system.PlayerList)
{
var entity = _entityManager.GetEntity(playerInfo.NetEntity);
var entity = _entityManager.GetEntity(info.NetEntity);
// Otherwise the entity can not exist yet
if (entity == null || !_entityManager.EntityExists(entity))
{
// If entity does not exist or is on a different map, skip
if (entity == null
|| !_entityManager.EntityExists(entity)
|| _entityManager.GetComponent<TransformComponent>(entity.Value).MapID != args.MapId)
continue;
}
// if not on the same map, continue
if (_entityManager.GetComponent<TransformComponent>(entity.Value).MapID != args.MapId)
{
continue;
}
var aabb = _entityLookup.GetWorldAABB(entity.Value);
// if not on screen, continue
// if not on screen, skip
if (!aabb.Intersects(in viewport))
{
continue;
}
var uiScale = _userInterfaceManager.RootControl.UIScale;
var lineoffset = new Vector2(0f, 14f) * uiScale;
var screenCoordinates = _eyeManager.WorldToScreen(aabb.Center +
new Angle(-_eyeManager.CurrentEye.Rotation).RotateVec(
aabb.TopRight - aabb.Center)) + new Vector2(1f, 7f);
// Get on-screen coordinates of player
var screenCoordinates = _eyeManager.WorldToScreen(aabb.Center).Rounded();
sortable.Add((info, aabb, entity.Value, screenCoordinates));
}
// Draw overlays for visible players, starting from the top of the screen
foreach (var info in sortable.OrderBy(s => s.Item4.Y).ToList())
{
var playerInfo = info.Item1;
var aabb = info.Item2;
var entity = info.Item3;
var screenCoordinatesCenter = info.Item4;
//the center position is kept separately, for simpler position comparison later
var centerOffset = new Vector2(28f, -18f) * uiScale;
var screenCoordinates = screenCoordinatesCenter + centerOffset;
var alpha = 1f;
//TODO make a smarter system where the starting offset can be modified by the predicted position and size of already-drawn overlays/stacks?
var currentOffset = Vector2.Zero;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.CharacterName, uiScale, playerInfo.Connected ? Color.Aquamarine : Color.White);
// Ghosts near the cursor are made transparent/invisible
// TODO would be "cheaper" if playerinfo already contained a ghost bool, this gets called every frame for every onscreen player!
if (_entityManager.HasComponent<GhostComponent>(entity))
{
// We want the map positions here, so we don't have to worry about resolution and such shenanigans
var mobPosition = aabb.Center;
var mousePosition = _eyeManager
.ScreenToMap(_userInterfaceManager.MousePositionScaled.Position * uiScale)
.Position;
var dist = Vector2.Distance(mobPosition, mousePosition);
if (dist < _ghostHideDistance)
continue;
alpha = Math.Clamp((dist - _ghostHideDistance) / (_ghostFadeDistance - _ghostHideDistance), 0f, 1f);
colorDisconnected.A = alpha;
}
// If the new overlay text block is within merge distance of any previous ones
// merge them into a stack so they don't hide each other
var stack = drawnOverlays.FindAll(x =>
Vector2.Distance(_eyeManager.ScreenToMap(x.Item1).Position, aabb.Center) <= _overlayMergeDistance);
if (stack.Count > 0)
{
screenCoordinates = stack.First().Item1 + centerOffset;
// Replacing this overlay's coordinates for the later save with the stack root's coordinates
// so that other overlays don't try to stack to these coordinates
screenCoordinatesCenter = stack.First().Item1;
var i = 1;
foreach (var s in stack)
{
// additional entries after maximum stack size is reached will be drawn over the last entry
if (i <= _overlayStackMax - 1)
currentOffset = lineoffset + s.Item2 ;
i++;
}
}
// Character name
var color = Color.Aquamarine;
color.A = alpha;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.CharacterName, uiScale, playerInfo.Connected ? color : colorDisconnected);
currentOffset += lineoffset;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.Username, uiScale, playerInfo.Connected ? Color.Yellow : Color.White);
// Username
color = Color.Yellow;
color.A = alpha;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.Username, uiScale, playerInfo.Connected ? color : colorDisconnected);
currentOffset += lineoffset;
var balance = playerInfo.Balance == int.MinValue
? "NO BALANCE"
: BankSystemExtensions.ToCurrencyString(playerInfo.Balance);
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, $"Balance: {balance}", uiScale, playerInfo.Connected ? Color.Aquamarine : Color.White);
// Playtime
if (!string.IsNullOrEmpty(playerInfo.PlaytimeString) && _overlayPlaytime)
{
color = Color.Orange;
color.A = alpha;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.PlaytimeString, uiScale, playerInfo.Connected ? color : colorDisconnected);
currentOffset += lineoffset;
}
// Job
if (!string.IsNullOrEmpty(playerInfo.StartingJob) && _overlayStartingJob)
{
color = Color.GreenYellow;
color.A = alpha;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, Loc.GetString(playerInfo.StartingJob), uiScale, playerInfo.Connected ? color : colorDisconnected);
currentOffset += lineoffset;
}
// Determine antag symbol
string? symbol;
switch (_overlaySymbolStyle)
{
case AdminOverlayAntagSymbolStyle.Specific:
symbol = playerInfo.RoleProto.Symbol;
break;
case AdminOverlayAntagSymbolStyle.Basic:
symbol = Loc.GetString("player-tab-antag-prefix");
break;
default:
case AdminOverlayAntagSymbolStyle.Off:
symbol = string.Empty;
break;
}
// Determine antag/role type name
string? text;
switch (_overlayFormat)
{
case AdminOverlayAntagFormat.Roletype:
color = playerInfo.RoleProto.Color;
symbol = _filter.Contains(playerInfo.RoleProto) ? symbol : string.Empty;
text = _filter.Contains(playerInfo.RoleProto)
? Loc.GetString(playerInfo.RoleProto.Name).ToUpper()
: string.Empty;
break;
case AdminOverlayAntagFormat.Subtype:
color = playerInfo.RoleProto.Color;
symbol = _filter.Contains(playerInfo.RoleProto) ? symbol : string.Empty;
text = _filter.Contains(playerInfo.RoleProto)
? _roles.GetRoleSubtypeLabel(playerInfo.RoleProto.Name, playerInfo.Subtype).ToUpper()
: string.Empty;
break;
default:
case AdminOverlayAntagFormat.Binary:
color = Color.OrangeRed;
symbol = playerInfo.Antag ? symbol : string.Empty;
text = playerInfo.Antag ? _antagLabelClassic : string.Empty;
break;
}
// Draw antag label
color.A = alpha;
var label = !string.IsNullOrEmpty(symbol)
? Loc.GetString("player-tab-character-name-antag-symbol", ("symbol", symbol), ("name", text))
: text;
args.ScreenHandle.DrawString(_fontBold, screenCoordinates + currentOffset, label, uiScale, color);
currentOffset += lineoffset;
if (!string.IsNullOrEmpty(playerInfo.PlaytimeString) && playTime)
{
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.PlaytimeString, uiScale, playerInfo.Connected ? Color.Orange : Color.White);
currentOffset += lineoffset;
}
if (!string.IsNullOrEmpty(playerInfo.StartingJob) && startingJob)
{
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, Loc.GetString(playerInfo.StartingJob), uiScale, playerInfo.Connected ? Color.GreenYellow : Color.White);
currentOffset += lineoffset;
}
if (classic && playerInfo.Antag)
{
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, _antagLabelClassic, uiScale, Color.OrangeRed);
currentOffset += lineoffset;
}
else if (!classic && _filter.Contains(playerInfo.RoleProto))
{
var label = Loc.GetString(playerInfo.RoleProto.Name).ToUpper();
var color = playerInfo.RoleProto.Color;
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, label, uiScale, color);
currentOffset += lineoffset;
}
//Save the coordinates and size of the text block, for stack merge check
drawnOverlays.Add((screenCoordinatesCenter, currentOffset));
}
}
}
@@ -10,14 +10,14 @@ using Robust.Shared.Utility;
namespace Content.Client.Administration.Managers
{
public sealed class ClientAdminManager : IClientAdminManager, IClientConGroupImplementation, IPostInjectInit, ISharedAdminManager
public sealed partial class ClientAdminManager : IClientAdminManager, IClientConGroupImplementation, IPostInjectInit, ISharedAdminManager
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IClientNetManager _netMgr = default!;
[Dependency] private readonly IClientConGroupController _conGroup = default!;
[Dependency] private readonly IResourceManager _res = default!;
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private readonly IUserInterfaceManager _userInterface = default!;
[Dependency] private IPlayerManager _player = default!;
[Dependency] private IClientNetManager _netMgr = default!;
[Dependency] private IClientConGroupController _conGroup = default!;
[Dependency] private IResourceManager _res = default!;
[Dependency] private ILogManager _logManager = default!;
[Dependency] private IUserInterfaceManager _userInterface = default!;
private AdminData? _adminData;
private readonly HashSet<string> _availableCommands = new();
@@ -0,0 +1,15 @@
namespace Content.Client.Administration;
public enum AdminOverlayAntagFormat
{
Binary,
Roletype,
Subtype
}
public enum AdminOverlayAntagSymbolStyle
{
Off,
Basic,
Specific
}
@@ -1,4 +1,5 @@
using Content.Client.Administration.Managers;
using Content.Shared.Roles;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface;
@@ -8,12 +9,14 @@ namespace Content.Client.Administration.Systems
{
public sealed partial class AdminSystem
{
[Dependency] private readonly IOverlayManager _overlayManager = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private readonly IClientAdminManager _adminManager = default!;
[Dependency] private readonly IEyeManager _eyeManager = default!;
[Dependency] private readonly EntityLookupSystem _entityLookup = default!;
[Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!;
[Dependency] private IOverlayManager _overlayManager = default!;
[Dependency] private IResourceCache _resourceCache = default!;
[Dependency] private IClientAdminManager _adminManager = default!;
[Dependency] private IEyeManager _eyeManager = default!;
[Dependency] private EntityLookupSystem _entityLookup = default!;
[Dependency] private IUserInterfaceManager _userInterfaceManager = default!;
[Dependency] private IConfigurationManager _configurationManager = default!;
[Dependency] private SharedRoleSystem _roles = default!;
private AdminNameOverlay _adminNameOverlay = default!;
@@ -22,7 +25,15 @@ namespace Content.Client.Administration.Systems
private void InitializeOverlay()
{
_adminNameOverlay = new AdminNameOverlay(this, EntityManager, _eyeManager, _resourceCache, _entityLookup, _userInterfaceManager);
_adminNameOverlay = new AdminNameOverlay(
this,
EntityManager,
_eyeManager,
_resourceCache,
_entityLookup,
_userInterfaceManager,
_configurationManager,
_roles);
_adminManager.AdminStatusUpdated += OnAdminStatusUpdated;
}
@@ -38,7 +49,8 @@ namespace Content.Client.Administration.Systems
public void AdminOverlayOn()
{
if (_overlayManager.HasOverlay<AdminNameOverlay>()) return;
if (_overlayManager.HasOverlay<AdminNameOverlay>())
return;
_overlayManager.AddOverlay(_adminNameOverlay);
OverlayEnabled?.Invoke();
}
@@ -10,11 +10,11 @@ namespace Content.Client.Administration.Systems
/// <summary>
/// Client-side admin verb system. These usually open some sort of UIs.
/// </summary>
sealed class AdminVerbSystem : EntitySystem
sealed partial class AdminVerbSystem : EntitySystem
{
[Dependency] private readonly IClientConGroupController _clientConGroupController = default!;
[Dependency] private readonly IClientConsoleHost _clientConsoleHost = default!;
[Dependency] private readonly ISharedAdminManager _admin = default!;
[Dependency] private IClientConGroupController _clientConGroupController = default!;
[Dependency] private IClientConsoleHost _clientConsoleHost = default!;
[Dependency] private ISharedAdminManager _admin = default!;
public override void Initialize()
{
@@ -7,9 +7,9 @@ using Robust.Shared.Timing;
namespace Content.Client.Administration.Systems
{
[UsedImplicitly]
public sealed class BwoinkSystem : SharedBwoinkSystem
public sealed partial class BwoinkSystem : SharedBwoinkSystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private IGameTiming _timing = default!;
public event EventHandler<BwoinkTextMessage>? OnBwoinkTextMessageRecieved;
private (TimeSpan Timestamp, bool Typing) _lastTypingUpdateSent;
@@ -11,7 +11,7 @@ namespace Content.Client.Administration.UI
[GenerateTypedNameReferences]
public sealed partial class AdminAnnounceWindow : DefaultWindow
{
[Dependency] private readonly ILocalizationManager _localization = default!;
[Dependency] private ILocalizationManager _localization = default!;
public AdminAnnounceWindow()
{
@@ -13,8 +13,8 @@ namespace Content.Client.Administration.UI.AdminCamera;
[GenerateTypedNameReferences]
public sealed partial class AdminCameraControl : Control
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IClientGameTiming _timing = default!;
[Dependency] private IEntityManager _entManager = default!;
[Dependency] private IClientGameTiming _timing = default!;
public event Action? OnFollow;
public event Action? OnPopoutControl;
@@ -12,7 +12,7 @@ namespace Content.Client.Administration.UI.AdminRemarks;
[GenerateTypedNameReferences]
public sealed partial class AdminRemarksWindow : FancyWindow
{
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
[Dependency] private IEntitySystemManager _entitySystem = default!;
private readonly SpriteSystem _sprites;
private readonly Dictionary<(int, NoteType), AdminNotesLine> _inputs = new();
@@ -10,9 +10,9 @@ using Robust.Client.UserInterface;
namespace Content.Client.Administration.UI.BanList;
[UsedImplicitly]
public sealed class BanListEui : BaseEui
public sealed partial class BanListEui : BaseEui
{
[Dependency] private readonly IUserInterfaceManager _ui = default!;
[Dependency] private IUserInterfaceManager _ui = default!;
private BanListIdsPopup? _popup;
@@ -36,9 +36,9 @@ public sealed partial class BanPanel : DefaultWindow
private readonly List<CheckBox> _roleCheckboxes = new();
private readonly ISawmill _banpanelSawmill;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private IGameTiming _gameTiming = default!;
[Dependency] private IConfigurationManager _cfg = default!;
[Dependency] private ILogManager _logManager = default!;
private enum TabNumbers
{
@@ -22,10 +22,10 @@ namespace Content.Client.Administration.UI.Bwoink
[GenerateTypedNameReferences]
public sealed partial class BwoinkControl : Control
{
[Dependency] private readonly IClientAdminManager _adminManager = default!;
[Dependency] private readonly IClientConsoleHost _console = default!;
[Dependency] private readonly IUserInterfaceManager _ui = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private IClientAdminManager _adminManager = default!;
[Dependency] private IClientConsoleHost _console = default!;
[Dependency] private IUserInterfaceManager _ui = default!;
[Dependency] private IConfigurationManager _cfg = default!;
public AdminAHelpUIHandler AHelpHelper = default!;
private PlayerInfo? _currentPlayer;
@@ -11,10 +11,10 @@ using static Content.Shared.Administration.Logs.AdminLogsEuiMsg;
namespace Content.Client.Administration.UI.Logs;
[UsedImplicitly]
public sealed class AdminLogsEui : BaseEui
public sealed partial class AdminLogsEui : BaseEui
{
[Dependency] private readonly IClyde _clyde = default!;
[Dependency] private readonly IUserInterfaceManager _uiManager = default!;
[Dependency] private IClyde _clyde = default!;
[Dependency] private IUserInterfaceManager _uiManager = default!;
public AdminLogsEui()
{
@@ -15,8 +15,8 @@ namespace Content.Client.Administration.UI.ManageSolutions
[GenerateTypedNameReferences]
public sealed partial class AddReagentWindow : DefaultWindow
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IClientConsoleHost _consoleHost = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private IClientConsoleHost _consoleHost = default!;
private readonly NetEntity _targetEntity;
private string _targetSolution;
@@ -17,9 +17,9 @@ namespace Content.Client.Administration.UI.ManageSolutions
[GenerateTypedNameReferences]
public sealed partial class EditSolutionsWindow : DefaultWindow
{
[Dependency] private readonly IClientConsoleHost _consoleHost = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IClientGameTiming _timing = default!;
[Dependency] private IClientConsoleHost _consoleHost = default!;
[Dependency] private IEntityManager _entityManager = default!;
[Dependency] private IClientGameTiming _timing = default!;
private NetEntity _target = NetEntity.Invalid;
private string? _selectedSolution;
@@ -15,8 +15,8 @@ namespace Content.Client.Administration.UI.Notes;
[GenerateTypedNameReferences]
public sealed partial class AdminNotesControl : Control
{
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private IEntitySystemManager _entitySystem = default!;
[Dependency] private IConfigurationManager _cfg = default!;
public event Action<int, NoteType, string, NoteSeverity?, bool, DateTime?>? NoteChanged;
public event Action<NoteType, string, NoteSeverity?, bool, DateTime?>? NewNoteEntered;
@@ -14,7 +14,7 @@ public sealed partial class AdminNotesLinePopup : Popup
public event Action<int, NoteType>? OnEditPressed;
public event Action<int, NoteType>? OnDeletePressed;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private IGameTiming _gameTiming = default!;
public AdminNotesLinePopup(SharedAdminNote note, string playerName, bool showDelete, bool showEdit)
{
@@ -14,8 +14,8 @@ namespace Content.Client.Administration.UI.Notes;
[GenerateTypedNameReferences]
public sealed partial class NoteEdit : FancyWindow
{
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IClientConsoleHost _console = default!;
[Dependency] private IGameTiming _gameTiming = default!;
[Dependency] private IClientConsoleHost _console = default!;
private enum Multipliers
{
@@ -20,11 +20,11 @@ using static Robust.Client.UserInterface.Controls.BoxContainer;
namespace Content.Client.Administration.UI
{
[UsedImplicitly]
public sealed class PermissionsEui : BaseEui
public sealed partial class PermissionsEui : BaseEui
{
private const int NoRank = -1;
[Dependency] private readonly IClientAdminManager _adminManager = default!;
[Dependency] private IClientAdminManager _adminManager = default!;
private readonly Menu _menu;
private readonly List<DefaultWindow> _subWindows = new();
@@ -9,11 +9,11 @@ using Robust.Client.UserInterface;
namespace Content.Client.Administration.UI.PlayerPanel;
[UsedImplicitly]
public sealed class PlayerPanelEui : BaseEui
public sealed partial class PlayerPanelEui : BaseEui
{
[Dependency] private readonly IClientConsoleHost _console = default!;
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IClipboardManager _clipboard = default!;
[Dependency] private IClientConsoleHost _console = default!;
[Dependency] private IClientAdminManager _admin = default!;
[Dependency] private IClipboardManager _clipboard = default!;
private PlayerPanel PlayerPanel { get; }
@@ -15,8 +15,8 @@ namespace Content.Client.Administration.UI.SetOutfit
[GenerateTypedNameReferences]
public sealed partial class SetOutfitMenu : DefaultWindow
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IClientConsoleHost _consoleHost = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private IClientConsoleHost _consoleHost = default!;
public NetEntity? TargetEntityId { get; set; }
private StartingGearPrototype? _selectedOutfit;
@@ -11,10 +11,10 @@ using Robust.Shared.Map.Components;
namespace Content.Client.Administration.UI.SpawnExplosion;
[UsedImplicitly]
public sealed class ExplosionDebugOverlay : Overlay
public sealed partial class ExplosionDebugOverlay : Overlay
{
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IEyeManager _eyeManager = default!;
[Dependency] private IEntityManager _entityManager = default!;
[Dependency] private IEyeManager _eyeManager = default!;
public Dictionary<int, List<Vector2i>>? SpaceTiles;
public Dictionary<EntityUid, Dictionary<int, List<Vector2i>>> Tiles = new();
@@ -8,10 +8,10 @@ using Robust.Shared.Map;
namespace Content.Client.Administration.UI.SpawnExplosion;
[UsedImplicitly]
public sealed class SpawnExplosionEui : BaseEui
public sealed partial class SpawnExplosionEui : BaseEui
{
[Dependency] private readonly EntityManager _entManager = default!;
[Dependency] private readonly IOverlayManager _overlayManager = default!;
[Dependency] private EntityManager _entManager = default!;
[Dependency] private IOverlayManager _overlayManager = default!;
private readonly SpawnExplosionWindow _window;
private ExplosionDebugOverlay? _debugOverlay;
@@ -18,11 +18,11 @@ namespace Content.Client.Administration.UI.SpawnExplosion;
[UsedImplicitly]
public sealed partial class SpawnExplosionWindow : DefaultWindow
{
[Dependency] private readonly IClientConsoleHost _conHost = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private IClientConsoleHost _conHost = default!;
[Dependency] private IMapManager _mapManager = default!;
[Dependency] private IPlayerManager _playerManager = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private IEntityManager _entMan = default!;
private readonly SharedTransformSystem _transform = default!;
private readonly SpawnExplosionEui _eui;
@@ -13,8 +13,8 @@ namespace Content.Client.Administration.UI.Tabs.AtmosTab
[UsedImplicitly]
public sealed partial class AddAtmosWindow : DefaultWindow
{
[Dependency] private readonly IPlayerManager _players = default!;
[Dependency] private readonly IEntityManager _entities = default!;
[Dependency] private IPlayerManager _players = default!;
[Dependency] private IEntityManager _entities = default!;
private readonly List<Entity<MapGridComponent>> _data = new();
@@ -13,9 +13,9 @@ namespace Content.Client.Administration.UI.Tabs.ObjectsTab;
[GenerateTypedNameReferences]
public sealed partial class ObjectsTab : Control
{
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IClientConsoleHost _console = default!;
[Dependency] private IClientAdminManager _admin = default!;
[Dependency] private IEntityManager _entityManager = default!;
[Dependency] private IClientConsoleHost _console = default!;
private readonly Color _altColor = Color.FromHex("#363636");
private readonly Color _defaultColor = Color.FromHex("#2F2F3B");
@@ -76,7 +76,7 @@ public sealed partial class ObjectsTab : Control
switch (selection)
{
case ObjectsTabSelection.Stations:
entities.AddRange(_entityManager.EntitySysManager.GetEntitySystem<StationSystem>().Stations);
entities.AddRange(_entityManager.EntitySysManager.GetEntitySystem<StationSystem>().GetStationNames());
break;
case ObjectsTabSelection.Grids:
{
@@ -9,7 +9,7 @@ namespace Content.Client.Administration.UI.Tabs.PanicBunkerTab;
[GenerateTypedNameReferences]
public sealed partial class PanicBunkerTab : Control
{
[Dependency] private readonly IConsoleHost _console = default!;
[Dependency] private IConsoleHost _console = default!;
private string _minAccountAge;
private string _minOverallMinutes;
@@ -2,11 +2,13 @@ using System.Linq;
using Content.Client.Administration.Systems;
using Content.Client.UserInterface.Controls;
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using static Content.Client.Administration.UI.Tabs.PlayerTab.PlayerTabHeader;
using static Robust.Client.UserInterface.Controls.BaseButton;
@@ -15,8 +17,9 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab;
[GenerateTypedNameReferences]
public sealed partial class PlayerTab : Control
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IPlayerManager _playerMan = default!;
[Dependency] private IEntityManager _entManager = default!;
[Dependency] private IConfigurationManager _config = default!;
[Dependency] private IPlayerManager _playerMan = default!;
private const string ArrowUp = "↑";
private const string ArrowDown = "↓";
@@ -29,6 +32,10 @@ public sealed partial class PlayerTab : Control
private bool _ascending = true;
private bool _showDisconnected;
private AdminPlayerTabColorOption _playerTabColorSetting;
private AdminPlayerTabRoleTypeOption _playerTabRoleSetting;
private AdminPlayerTabSymbolOption _playerTabSymbolSetting;
public event Action<GUIBoundKeyEventArgs, ListData>? OnEntryKeyBindDown;
public PlayerTab()
@@ -41,6 +48,11 @@ public sealed partial class PlayerTab : Control
_adminSystem.OverlayEnabled += OverlayEnabled;
_adminSystem.OverlayDisabled += OverlayDisabled;
_config.OnValueChanged(CCVars.AdminPlayerTabRoleSetting, RoleSettingChanged, true);
_config.OnValueChanged(CCVars.AdminPlayerTabColorSetting, ColorSettingChanged, true);
_config.OnValueChanged(CCVars.AdminPlayerTabSymbolSetting, SymbolSettingChanged, true);
OverlayButton.OnPressed += OverlayButtonPressed;
ShowDisconnectedButton.OnPressed += ShowDisconnectedPressed;
@@ -105,6 +117,30 @@ public sealed partial class PlayerTab : Control
#region ListContainer
private void RoleSettingChanged(string s)
{
if (!Enum.TryParse<AdminPlayerTabRoleTypeOption>(s, out var format))
format = AdminPlayerTabRoleTypeOption.Subtype;
_playerTabRoleSetting = format;
RefreshPlayerList(_adminSystem.PlayerList);
}
private void ColorSettingChanged(string s)
{
if (!Enum.TryParse<AdminPlayerTabColorOption>(s, out var format))
format = AdminPlayerTabColorOption.Both;
_playerTabColorSetting = format;
RefreshPlayerList(_adminSystem.PlayerList);
}
private void SymbolSettingChanged(string s)
{
if (!Enum.TryParse<AdminPlayerTabSymbolOption>(s, out var format))
format = AdminPlayerTabSymbolOption.Specific;
_playerTabSymbolSetting = format;
RefreshPlayerList(_adminSystem.PlayerList);
}
private void RefreshPlayerList(IReadOnlyList<PlayerInfo> players)
{
_players = players;
@@ -127,7 +163,12 @@ public sealed partial class PlayerTab : Control
if (data is not PlayerListData { Info: var player})
return;
var entry = new PlayerTabEntry(player, new StyleBoxFlat(button.Index % 2 == 0 ? _altColor : _defaultColor));
var entry = new PlayerTabEntry(
player,
new StyleBoxFlat(button.Index % 2 == 0 ? _altColor : _defaultColor),
_playerTabColorSetting,
_playerTabRoleSetting,
_playerTabSymbolSetting);
button.AddChild(entry);
button.ToolTip = $"{player.Username}, {player.CharacterName}, {player.IdentityName}, {player.StartingJob}";
}
@@ -195,8 +236,7 @@ public sealed partial class PlayerTab : Control
Header.Username => Compare(x.Username, y.Username),
Header.Character => Compare(x.CharacterName, y.CharacterName),
Header.Job => Compare(x.StartingJob, y.StartingJob),
Header.Antagonist => x.Antag.CompareTo(y.Antag),
Header.RoleType => Compare(x.RoleProto.Name , y.RoleProto.Name),
Header.RoleType => y.SortWeight - x.SortWeight,
Header.Playtime => TimeSpan.Compare(x.OverallPlaytime ?? default, y.OverallPlaytime ?? default),
Header.Balance => x.Balance.CompareTo(y.Balance), // Frontier
_ => 1
@@ -19,11 +19,6 @@
HorizontalExpand="True"
ClipText="True"/>
<customControls:VSeparator/>
<Label Name="AntagonistLabel"
SizeFlagsStretchRatio="1"
HorizontalExpand="True"
ClipText="True"/>
<customControls:VSeparator/>
<Label Name="RoleTypeLabel"
SizeFlagsStretchRatio="2"
HorizontalExpand="True"
@@ -1,5 +1,7 @@
using Content.Shared._NF.Bank;
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Content.Shared.Roles;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
@@ -10,25 +12,91 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab;
[GenerateTypedNameReferences]
public sealed partial class PlayerTabEntry : PanelContainer
{
public NetEntity? PlayerEntity;
[Dependency] private IEntityManager _entMan = default!;
public PlayerTabEntry(PlayerInfo player, StyleBoxFlat styleBoxFlat)
public PlayerTabEntry(
PlayerInfo player,
StyleBoxFlat styleBoxFlat,
AdminPlayerTabColorOption colorOption,
AdminPlayerTabRoleTypeOption roleSetting,
AdminPlayerTabSymbolOption symbolSetting)
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
var roles = _entMan.System<SharedRoleSystem>();
UsernameLabel.Text = player.Username;
if (!player.Connected)
UsernameLabel.StyleClasses.Add("Disabled");
JobLabel.Text = player.StartingJob;
CharacterLabel.Text = player.CharacterName;
var colorAntags = false;
var colorRoles = false;
switch (colorOption)
{
case AdminPlayerTabColorOption.Off:
break;
case AdminPlayerTabColorOption.Character:
colorAntags = true;
break;
case AdminPlayerTabColorOption.Roletype:
colorRoles = true;
break;
default:
case AdminPlayerTabColorOption.Both:
colorAntags = true;
colorRoles = true;
break;
}
var symbol = string.Empty;
switch (symbolSetting)
{
case AdminPlayerTabSymbolOption.Off:
break;
case AdminPlayerTabSymbolOption.Basic:
symbol = player.Antag ? Loc.GetString("player-tab-antag-prefix") : string.Empty;
break;
default:
case AdminPlayerTabSymbolOption.Specific:
symbol = player.Antag ? player.RoleProto.Symbol : string.Empty;
break;
}
CharacterLabel.Text = Loc.GetString("player-tab-character-name-antag-symbol", ("symbol", symbol), ("name", player.CharacterName));
if (player.Antag && colorAntags)
CharacterLabel.FontColorOverride = player.RoleProto.Color;
if (player.IdentityName != player.CharacterName)
CharacterLabel.Text += $" [{player.IdentityName}]";
AntagonistLabel.Text = Loc.GetString(player.Antag ? "player-tab-is-antag-yes" : "player-tab-is-antag-no");
RoleTypeLabel.Text = Loc.GetString(player.RoleProto.Name);
RoleTypeLabel.FontColorOverride = player.RoleProto.Color;
var roletype = RoleTypeLabel.Text = Loc.GetString(player.RoleProto.Name);
var subtype = roles.GetRoleSubtypeLabel(player.RoleProto.Name, player.Subtype);
switch (roleSetting)
{
case AdminPlayerTabRoleTypeOption.RoleTypeSubtype:
RoleTypeLabel.Text = roletype != subtype
? roletype + " - " +subtype
: roletype;
break;
case AdminPlayerTabRoleTypeOption.SubtypeRoleType:
RoleTypeLabel.Text = roletype != subtype
? subtype + " - " + roletype
: roletype;
break;
case AdminPlayerTabRoleTypeOption.RoleType:
RoleTypeLabel.Text = roletype;
break;
default:
case AdminPlayerTabRoleTypeOption.Subtype:
RoleTypeLabel.Text = subtype;
break;
}
if (colorRoles)
RoleTypeLabel.FontColorOverride = player.RoleProto.Color;
BackgroundColorPanel.PanelOverride = styleBoxFlat;
OverallPlaytimeLabel.Text = player.PlaytimeString;
PlayerEntity = player.NetEntity;
BalanceLabel.Text = BankSystemExtensions.ToCurrencyString(player.Balance); // Frontier
}
}
@@ -25,13 +25,6 @@
Text="{Loc player-tab-job}"
MouseFilter="Pass"/>
<cc:VSeparator/>
<Label Name="AntagonistLabel"
SizeFlagsStretchRatio="1"
HorizontalExpand="True"
ClipText="True"
Text="{Loc player-tab-antagonist}"
MouseFilter="Pass"/>
<cc:VSeparator/>
<Label Name="RoleTypeLabel"
SizeFlagsStretchRatio="2"
HorizontalExpand="True"
@@ -18,7 +18,6 @@ public sealed partial class PlayerTabHeader : Control
UsernameLabel.OnKeyBindDown += UsernameClicked;
CharacterLabel.OnKeyBindDown += CharacterClicked;
JobLabel.OnKeyBindDown += JobClicked;
AntagonistLabel.OnKeyBindDown += AntagonistClicked;
RoleTypeLabel.OnKeyBindDown += RoleTypeClicked;
PlaytimeLabel.OnKeyBindDown += PlaytimeClicked;
BalanceLabel.OnKeyBindDown += BalanceClicked; // Frontier
@@ -31,7 +30,6 @@ public sealed partial class PlayerTabHeader : Control
Header.Username => UsernameLabel,
Header.Character => CharacterLabel,
Header.Job => JobLabel,
Header.Antagonist => AntagonistLabel,
Header.RoleType => RoleTypeLabel,
Header.Playtime => PlaytimeLabel,
Header.Balance => BalanceLabel, // Frontier
@@ -44,7 +42,6 @@ public sealed partial class PlayerTabHeader : Control
UsernameLabel.Text = Loc.GetString("player-tab-username");
CharacterLabel.Text = Loc.GetString("player-tab-character");
JobLabel.Text = Loc.GetString("player-tab-job");
AntagonistLabel.Text = Loc.GetString("player-tab-antagonist");
RoleTypeLabel.Text = Loc.GetString("player-tab-roletype");
PlaytimeLabel.Text = Loc.GetString("player-tab-playtime");
BalanceLabel.Text = Loc.GetString("player-tab-balance"); // Frontier
@@ -76,11 +73,6 @@ public sealed partial class PlayerTabHeader : Control
HeaderClicked(args, Header.Job);
}
private void AntagonistClicked(GUIBoundKeyEventArgs args)
{
HeaderClicked(args, Header.Antagonist);
}
private void RoleTypeClicked(GUIBoundKeyEventArgs args)
{
HeaderClicked(args, Header.RoleType);
@@ -105,7 +97,6 @@ public sealed partial class PlayerTabHeader : Control
UsernameLabel.OnKeyBindDown -= UsernameClicked;
CharacterLabel.OnKeyBindDown -= CharacterClicked;
JobLabel.OnKeyBindDown -= JobClicked;
AntagonistLabel.OnKeyBindDown -= AntagonistClicked;
RoleTypeLabel.OnKeyBindDown -= RoleTypeClicked;
PlaytimeLabel.OnKeyBindDown -= PlaytimeClicked;
BalanceLabel.OnKeyBindDown -= BalanceClicked; // Frontier
@@ -117,7 +108,6 @@ public sealed partial class PlayerTabHeader : Control
Username,
Character,
Job,
Antagonist,
RoleType,
Playtime,
Balance // Frontier
@@ -0,0 +1,24 @@
namespace Content.Client.Administration.UI.Tabs.PlayerTab;
public enum AdminPlayerTabColorOption
{
Off,
Character,
Roletype,
Both
}
public enum AdminPlayerTabRoleTypeOption
{
RoleType,
Subtype,
RoleTypeSubtype,
SubtypeRoleType
}
public enum AdminPlayerTabSymbolOption
{
Off,
Basic,
Specific
}
@@ -9,7 +9,7 @@ namespace Content.Client.Administration.UI.Tabs
[GenerateTypedNameReferences]
public sealed partial class ServerTab : Control
{
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private IConfigurationManager _config = default!;
public ServerTab()
{
@@ -6,9 +6,9 @@ using Robust.Shared.Utility;
namespace Content.Client.AlertLevel;
public sealed class AlertLevelDisplaySystem : EntitySystem
public sealed partial class AlertLevelDisplaySystem : EntitySystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
+11 -3
View File
@@ -2,6 +2,7 @@ using System.Linq;
using Content.Shared.Alert;
using JetBrains.Annotations;
using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Shared.GameStates;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
@@ -9,12 +10,13 @@ using Robust.Shared.Prototypes;
namespace Content.Client.Alerts;
[UsedImplicitly]
public sealed class ClientAlertsSystem : AlertsSystem
public sealed partial class ClientAlertsSystem : AlertsSystem
{
public AlertOrderPrototype? AlertOrder { get; set; }
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private IPlayerManager _playerManager = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private IUserInterfaceManager _ui = default!;
public event EventHandler? ClearAlerts;
public event EventHandler<IReadOnlyDictionary<AlertKey, AlertState>>? SyncAlerts;
@@ -27,6 +29,12 @@ public sealed class ClientAlertsSystem : AlertsSystem
SubscribeLocalEvent<AlertsComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
SubscribeLocalEvent<AlertsComponent, ComponentHandleState>(OnHandleState);
}
protected override void HandledAlert()
{
_ui.ClickSound();
}
protected override void LoadPrototypes()
{
base.LoadPrototypes();
@@ -8,9 +8,9 @@ namespace Content.Client.Alerts;
/// <summary>
/// This handles <see cref="GenericCounterAlertComponent"/>
/// </summary>
public sealed class GenericCounterAlertSystem : EntitySystem
public sealed partial class GenericCounterAlertSystem : EntitySystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private SpriteSystem _sprite = default!;
/// <inheritdoc/>
public override void Initialize()
@@ -11,11 +11,11 @@ namespace Content.Client.Animations;
/// <summary>
/// System that handles animating an entity that a player has picked up.
/// </summary>
public sealed class EntityPickupAnimationSystem : EntitySystem
public sealed partial class EntityPickupAnimationSystem : EntitySystem
{
[Dependency] private readonly AnimationPlayerSystem _animations = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private AnimationPlayerSystem _animations = default!;
[Dependency] private MetaDataSystem _metaData = default!;
[Dependency] private TransformSystem _transform = default!;
public override void Initialize()
{
+3 -3
View File
@@ -7,10 +7,10 @@ using Robust.Shared.Timing;
namespace Content.Client.Anomaly;
public sealed class AnomalySystem : SharedAnomalySystem
public sealed partial class AnomalySystem : SharedAnomalySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly FloatingVisualizerSystem _floating = default!;
[Dependency] private IGameTiming _timing = default!;
[Dependency] private FloatingVisualizerSystem _floating = default!;
/// <inheritdoc/>
public override void Initialize()
@@ -11,7 +11,7 @@ namespace Content.Client.Anomaly.Ui;
[GenerateTypedNameReferences]
public sealed partial class AnomalyGeneratorWindow : FancyWindow
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private IGameTiming _timing = default!;
private TimeSpan _cooldownEnd = TimeSpan.Zero;
private bool _hasEnoughFuel;
@@ -10,7 +10,7 @@ namespace Content.Client.Anomaly.Ui;
[GenerateTypedNameReferences]
public sealed partial class AnomalyScannerMenu : FancyWindow
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private IGameTiming _timing = default!;
public FormattedMessage LastMessage = new();
public TimeSpan? NextPulseTime;
+5 -5
View File
@@ -23,12 +23,12 @@ namespace Content.Client.Atmos;
/// <remarks>
/// This placement mode is not on the engine because it is content specific.
/// </remarks>
public sealed class AlignAtmosPipeLayers : SnapgridCenter
public sealed partial class AlignAtmosPipeLayers : SnapgridCenter
{
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IPrototypeManager _protoManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IEyeManager _eyeManager = default!;
[Dependency] private IEntityManager _entityManager = default!;
[Dependency] private IPrototypeManager _protoManager = default!;
[Dependency] private IMapManager _mapManager = default!;
[Dependency] private IEyeManager _eyeManager = default!;
private readonly SharedMapSystem _mapSystem;
private readonly SharedTransformSystem _transformSystem;
@@ -11,7 +11,7 @@ namespace Content.Client.Atmos.Consoles;
public sealed partial class AtmosMonitoringConsoleNavMapControl : NavMapControl
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private IEntityManager _entManager = default!;
public bool ShowPipeNetwork = true;
public int? FocusNetId = null;
@@ -11,8 +11,8 @@ namespace Content.Client.Atmos.EntitySystems;
[UsedImplicitly]
public sealed partial class AtmosPipeAppearanceSystem : SharedAtmosPipeAppearanceSystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private SharedAppearanceSystem _appearance = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -14,10 +14,10 @@ namespace Content.Client.Atmos.EntitySystems;
/// </summary>
public sealed partial class AtmosPipeLayersSystem : SharedAtmosPipeLayersSystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IReflectionManager _reflection = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private SharedAppearanceSystem _appearance = default!;
[Dependency] private IReflectionManager _reflection = default!;
[Dependency] private IResourceCache _resourceCache = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -8,9 +8,9 @@ namespace Content.Client.Atmos.EntitySystems;
/// <summary>
/// This handles the display of fire effects on flammable entities.
/// </summary>
public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent>
public sealed partial class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent>
{
[Dependency] private readonly PointLightSystem _lights = default!;
[Dependency] private PointLightSystem _lights = default!;
public override void Initialize()
{
@@ -0,0 +1,29 @@
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.EntitySystems;
namespace Content.Client.Atmos.EntitySystems;
public sealed class GasTankSystem : SharedGasTankSystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasTankComponent, AfterAutoHandleStateEvent>(OnGasTankState);
}
private void OnGasTankState(Entity<GasTankComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (UI.TryGetOpenUi(ent.Owner, SharedGasTankUiKey.Key, out var bui))
{
bui.Update<GasTankBoundUserInterfaceState>();
}
}
public override void UpdateUserInterface(Entity<GasTankComponent> ent)
{
if (UI.TryGetOpenUi(ent.Owner, SharedGasTankUiKey.Key, out var bui))
{
bui.Update<GasTankBoundUserInterfaceState>();
}
}
}
@@ -11,12 +11,12 @@ using Robust.Shared.GameStates;
namespace Content.Client.Atmos.EntitySystems
{
[UsedImplicitly]
public sealed class GasTileOverlaySystem : SharedGasTileOverlaySystem
public sealed partial class GasTileOverlaySystem : SharedGasTileOverlaySystem
{
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private readonly IOverlayManager _overlayMan = default!;
[Dependency] private readonly SpriteSystem _spriteSys = default!;
[Dependency] private readonly SharedTransformSystem _xformSys = default!;
[Dependency] private IResourceCache _resourceCache = default!;
[Dependency] private IOverlayManager _overlayMan = default!;
[Dependency] private SpriteSystem _spriteSys = default!;
[Dependency] private SharedTransformSystem _xformSys = default!;
private GasTileOverlay _overlay = default!;
@@ -18,13 +18,13 @@ using DebugMessage = Content.Shared.Atmos.EntitySystems.SharedAtmosDebugOverlayS
namespace Content.Client.Atmos.Overlays;
public sealed class AtmosDebugOverlay : Overlay
public sealed partial class AtmosDebugOverlay : Overlay
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IInputManager _input = default!;
[Dependency] private readonly IUserInterfaceManager _ui = default!;
[Dependency] private readonly IResourceCache _cache = default!;
[Dependency] private IEntityManager _entManager = default!;
[Dependency] private IMapManager _mapManager = default!;
[Dependency] private IInputManager _input = default!;
[Dependency] private IUserInterfaceManager _ui = default!;
[Dependency] private IResourceCache _cache = default!;
private readonly SharedTransformSystem _transform;
private readonly AtmosDebugOverlaySystem _system;
private readonly SharedMapSystem _map;
@@ -13,13 +13,13 @@ namespace Content.Client.Atmos.Overlays;
/// <summary>
/// Renders a thermal heatmap overlay for gas tiles, used for equipment like thermal glasses.
/// /// </summary>
public sealed class GasTileDangerousTemperatureOverlay : Overlay
public sealed partial class GasTileDangerousTemperatureOverlay : Overlay
{
public override bool RequestScreenTexture { get; set; } = false;
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IClyde _clyde = default!;
[Dependency] private IEntityManager _entManager = default!;
[Dependency] private IMapManager _mapManager = default!;
[Dependency] private IClyde _clyde = default!;
private GasTileOverlaySystem? _gasTileOverlay;
private readonly SharedTransformSystem _xformSys;
@@ -0,0 +1,32 @@
using Content.Client.Atmos.UI;
using Content.Shared.Atmos.Piping.Binary.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Atmos.Piping.Unary.Systems;
using Content.Shared.NodeContainer;
namespace Content.Client.Atmos.Piping.Unary.Systems;
public sealed class GasCanisterSystem : SharedGasCanisterSystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasCanisterComponent, AfterAutoHandleStateEvent>(OnGasState);
}
private void OnGasState(Entity<GasCanisterComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (UI.TryGetOpenUi<GasCanisterBoundUserInterface>(ent.Owner, GasCanisterUiKey.Key, out var bui))
{
bui.Update<GasCanisterBoundUserInterfaceState>();
}
}
protected override void DirtyUI(EntityUid uid, GasCanisterComponent? component = null, NodeContainerComponent? nodes = null)
{
if (UI.TryGetOpenUi<GasCanisterBoundUserInterface>(uid, GasCanisterUiKey.Key, out var bui))
{
bui.Update<GasCanisterBoundUserInterfaceState>();
}
}
}
@@ -0,0 +1,29 @@
using Content.Client.Atmos.UI;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Atmos.Piping.Unary.Systems;
namespace Content.Client.Atmos.Piping.Unary.Systems;
public sealed class GasThermoMachineSystem : SharedGasThermoMachineSystem
{
[Dependency] private SharedUserInterfaceSystem _ui = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasThermoMachineComponent, AfterAutoHandleStateEvent>(OnGasAfterState);
}
private void OnGasAfterState(Entity<GasThermoMachineComponent> ent, ref AfterAutoHandleStateEvent args)
{
DirtyUI(ent.Owner, ent.Comp);
}
protected override void DirtyUI(EntityUid uid, GasThermoMachineComponent? thermoMachine, UserInterfaceComponent? ui = null)
{
if (_ui.TryGetOpenUi<GasThermomachineBoundUserInterface>(uid, ThermomachineUiKey.Key, out var bui))
{
bui.Update();
}
}
}
@@ -1,4 +1,7 @@
using Content.Shared.Atmos.Piping.Binary.Components;
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.Piping.Binary.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.IdentityManagement;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
@@ -32,22 +35,22 @@ namespace Content.Client.Atmos.UI
private void OnTankEjectPressed()
{
SendMessage(new GasCanisterHoldingTankEjectMessage());
SendPredictedMessage(new GasCanisterHoldingTankEjectMessage());
}
private void OnReleasePressureSet(float value)
{
SendMessage(new GasCanisterChangeReleasePressureMessage(value));
SendPredictedMessage(new GasCanisterChangeReleasePressureMessage(value));
}
private void OnReleaseValveOpenPressed()
{
SendMessage(new GasCanisterChangeReleaseValveMessage(true));
SendPredictedMessage(new GasCanisterChangeReleaseValveMessage(true));
}
private void OnReleaseValveClosePressed()
{
SendMessage(new GasCanisterChangeReleaseValveMessage(false));
SendPredictedMessage(new GasCanisterChangeReleaseValveMessage(false));
}
/// <summary>
@@ -57,17 +60,21 @@ namespace Content.Client.Atmos.UI
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (_window == null || state is not GasCanisterBoundUserInterfaceState cast)
if (_window == null || state is not GasCanisterBoundUserInterfaceState cast || !EntMan.TryGetComponent(Owner, out GasCanisterComponent? component))
return;
_window.SetCanisterLabel(cast.CanisterLabel);
var canisterLabel = Identity.Name(Owner, EntMan);
var tankLabel = component.GasTankSlot.Item != null ? Identity.Name(component.GasTankSlot.Item.Value, EntMan) : null;
_window.SetCanisterLabel(canisterLabel);
_window.SetCanisterPressure(cast.CanisterPressure);
_window.SetPortStatus(cast.PortStatus);
_window.SetTankLabel(cast.TankLabel);
_window.SetTankLabel(tankLabel);
_window.SetTankPressure(cast.TankPressure);
_window.SetReleasePressureRange(cast.ReleasePressureMin, cast.ReleasePressureMax);
_window.SetReleasePressure(cast.ReleasePressure);
_window.SetReleaseValve(cast.ReleaseValve);
_window.SetReleasePressureRange(component.MinReleasePressure, component.MaxReleasePressure);
_window.SetReleasePressure(component.ReleasePressure);
_window.SetReleaseValve(component.ReleaseValve);
}
protected override void Dispose(bool disposing)
@@ -14,9 +14,6 @@ namespace Content.Client.Atmos.UI;
[UsedImplicitly]
public sealed class GasPressurePumpBoundUserInterface : BoundUserInterface
{
[ViewVariables]
private const float MaxPressure = Atmospherics.MaxOutputPressure;
[ViewVariables]
private GasPressurePumpWindow? _window;
@@ -1,5 +1,8 @@
using Content.Shared.Atmos;
using Content.Client.Power.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Atmos.Piping.Unary.Systems;
using Content.Shared.Power.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
@@ -36,6 +39,8 @@ namespace Content.Client.Atmos.UI
_window.ToggleStatusButton.OnPressed += _ => OnToggleStatusButtonPressed();
_window.TemperatureSpinbox.OnValueChanged += _ => OnTemperatureChanged(_window.TemperatureSpinbox.Value);
_window.Entity = Owner;
Update();
}
private void OnToggleStatusButtonPressed()
@@ -43,7 +48,7 @@ namespace Content.Client.Atmos.UI
if (_window is null) return;
_window.SetActive(!_window.Active);
SendMessage(new GasThermomachineToggleMessage());
SendPredictedMessage(new GasThermomachineToggleMessage());
}
private void OnTemperatureChanged(float value)
@@ -60,25 +65,32 @@ namespace Content.Client.Atmos.UI
return;
}
SendMessage(new GasThermomachineChangeTemperatureMessage(actual));
SendPredictedMessage(new GasThermomachineChangeTemperatureMessage(actual));
}
/// <summary>
/// Update the UI state based on server-sent info
/// </summary>
/// <param name="state"></param>
protected override void UpdateState(BoundUserInterfaceState state)
public override void Update()
{
base.UpdateState(state);
if (_window == null || state is not GasThermomachineBoundUserInterfaceState cast)
if (_window == null || !EntMan.TryGetComponent(Owner, out GasThermoMachineComponent? thermo))
return;
_minTemp = cast.MinTemperature;
_maxTemp = cast.MaxTemperature;
_isHeater = cast.IsHeater;
var system = EntMan.System<SharedGasThermoMachineSystem>();
_minTemp = thermo.MinTemperature;
_maxTemp = thermo.MaxTemperature;
_isHeater = system.IsHeater(thermo);
_window.SetTemperature(thermo.TargetTemperature);
var receiverSys = EntMan.System<PowerReceiverSystem>();
SharedApcPowerReceiverComponent? receiver = null;
receiverSys.ResolveApc(Owner, ref receiver);
// Also set in frameupdates.
if (receiver != null)
{
_window.SetActive(!receiver.PowerDisabled);
}
_window.SetTemperature(cast.Temperature);
_window.SetActive(cast.Enabled);
_window.Title = _isHeater switch
{
false => Loc.GetString("comp-gas-thermomachine-ui-title-freezer"),
@@ -1,5 +1,6 @@
<DefaultWindow xmlns="https://spacestation14.io"
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
MinSize="300 120" Title="{Loc comp-gas-thermomachine-ui-title-freezer}">
<BoxContainer Name="VboxContainer" Orientation="Vertical" Margin="5 5 5 5" SeparationOverride="10">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
@@ -11,4 +12,4 @@
<Label Text="{Loc comp-gas-thermomachine-ui-temperature}"/>
</BoxContainer>
</BoxContainer>
</DefaultWindow>
</controls:FancyWindow>
@@ -1,19 +1,26 @@
using Content.Client.Power.Components;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Timing;
namespace Content.Client.Atmos.UI;
[GenerateTypedNameReferences]
public sealed partial class GasThermomachineWindow : DefaultWindow
public sealed partial class GasThermomachineWindow : FancyWindow
{
[Dependency] private IEntityManager _entManager = default!;
public bool Active = true;
public FloatSpinBox TemperatureSpinbox;
public EntityUid Entity;
public GasThermomachineWindow()
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
SpinboxHBox.AddChild(
@@ -27,12 +34,10 @@ public sealed partial class GasThermomachineWindow : DefaultWindow
if (active)
{
ToggleStatusButton.Text = Loc.GetString("comp-gas-thermomachine-ui-status-enabled");
ToggleStatusButton.Pressed = true;
}
else
{
ToggleStatusButton.Text = Loc.GetString("comp-gas-thermomachine-ui-status-disabled");
ToggleStatusButton.Pressed = false;
}
}
@@ -40,4 +45,14 @@ public sealed partial class GasThermomachineWindow : DefaultWindow
{
TemperatureSpinbox.Value = temperature;
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
if (_entManager.TryGetComponent(Entity, out ApcPowerReceiverComponent? receiver))
{
SetActive(!receiver.PowerDisabled);
}
}
}
@@ -2,16 +2,16 @@ using Robust.Shared.Console;
namespace Content.Client.Audio;
public sealed class AmbientOverlayCommand : IConsoleCommand
public sealed class AmbientOverlayCommand : LocalizedEntityCommands
{
public string Command => "showambient";
public string Description => "Shows all AmbientSoundComponents in the viewport";
public string Help => $"{Command}";
public void Execute(IConsoleShell shell, string argStr, string[] args)
{
var system = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<AmbientSoundSystem>();
system.OverlayEnabled ^= true;
[Dependency] private readonly AmbientSoundSystem _ambient = default!;
shell.WriteLine($"Ambient sound overlay set to {system.OverlayEnabled}");
public override string Command => "showambient";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
_ambient.OverlayEnabled ^= true;
shell.WriteLine(Loc.GetString($"cmd-showambient-status", ("status", _ambient.OverlayEnabled)));
}
}
+8 -8
View File
@@ -24,15 +24,15 @@ namespace Content.Client.Audio;
/// <summary>
/// Samples nearby <see cref="AmbientSoundComponent"/> and plays audio.
/// </summary>
public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
public sealed partial class AmbientSoundSystem : SharedAmbientSoundSystem
{
[Dependency] private readonly AmbientSoundTreeSystem _treeSys = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private AmbientSoundTreeSystem _treeSys = default!;
[Dependency] private SharedAudioSystem _audio = default!;
[Dependency] private SharedTransformSystem _xformSystem = default!;
[Dependency] private IConfigurationManager _cfg = default!;
[Dependency] private IGameTiming _gameTiming = default!;
[Dependency] private IPlayerManager _playerManager = default!;
[Dependency] private IRobustRandom _random = default!;
protected override void QueueUpdate(EntityUid uid, AmbientSoundComponent ambience)
=> _treeSys.QueueTreeUpdate(uid, ambience);
+4 -4
View File
@@ -7,11 +7,11 @@ using Robust.Shared.Configuration;
namespace Content.Client.Audio;
public sealed class AudioUIController : UIController
public sealed partial class AudioUIController : UIController
{
[Dependency] private readonly IAudioManager _audioManager = default!;
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private readonly IResourceCache _cache = default!;
[Dependency] private IAudioManager _audioManager = default!;
[Dependency] private IConfigurationManager _configManager = default!;
[Dependency] private IResourceCache _cache = default!;
private float _interfaceGain;
private IAudioSource? _clickSource;
@@ -8,10 +8,10 @@ using Robust.Shared.Player;
namespace Content.Client.Audio;
public sealed class ClientGlobalSoundSystem : SharedGlobalSoundSystem
public sealed partial class ClientGlobalSoundSystem : SharedGlobalSoundSystem
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private IConfigurationManager _cfg = default!;
[Dependency] private SharedAudioSystem _audio = default!;
// Admin music
private bool _adminAudioEnabled = true;
@@ -28,14 +28,14 @@ namespace Content.Client.Audio;
/// </summary>
public sealed partial class ContentAudioSystem
{
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IStateManager _state = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly CombatModeSystem _combatModeSystem = default!; //CLIENT ONE. WHY ARE THERE 3???
[Dependency] private IConfigurationManager _configManager = default!;
[Dependency] private IGameTiming _timing = default!;
[Dependency] private IPlayerManager _player = default!;
[Dependency] private IPrototypeManager _proto = default!;
[Dependency] private IRobustRandom _random = default!;
[Dependency] private IStateManager _state = default!;
[Dependency] private SharedAudioSystem _audio = default!;
[Dependency] private CombatModeSystem _combatModeSystem = default!; //CLIENT ONE. WHY ARE THERE 3???
//options menu ---
private static float _volumeSliderAmbient;
@@ -18,9 +18,9 @@ namespace Content.Client.Audio;
// Part of ContentAudioSystem that is responsible for lobby music playing/stopping and round-end sound-effect.
public sealed partial class ContentAudioSystem
{
[Dependency] private readonly IBaseClient _client = default!;
[Dependency] private readonly ClientGameTicker _gameTicker = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private IBaseClient _client = default!;
[Dependency] private ClientGameTicker _gameTicker = default!;
[Dependency] private IResourceCache _resourceCache = default!;
private readonly AudioParams _lobbySoundtrackParams = new(-5f, 1, 0, 0, 0, false, 0f);
private readonly AudioParams _roundEndSoundEffectParams = new(-5f, 1, 0, 0, 0, false, 0f);
@@ -6,9 +6,9 @@ using Robust.Shared.Prototypes;
namespace Content.Client.Audio.Jukebox;
public sealed class JukeboxBoundUserInterface : BoundUserInterface
public sealed partial class JukeboxBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IPrototypeManager _protoManager = default!;
[Dependency] private IPrototypeManager _protoManager = default!;
[ViewVariables]
private JukeboxMenu? _menu;
@@ -15,7 +15,7 @@ namespace Content.Client.Audio.Jukebox;
[GenerateTypedNameReferences]
public sealed partial class JukeboxMenu : FancyWindow
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private IEntityManager _entManager = default!;
private AudioSystem _audioSystem;
/// <summary>
@@ -6,13 +6,13 @@ using Robust.Shared.Prototypes;
namespace Content.Client.Audio.Jukebox;
public sealed class JukeboxSystem : SharedJukeboxSystem
public sealed partial 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!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private IPrototypeManager _protoManager = default!;
[Dependency] private AnimationPlayerSystem _animationPlayer = default!;
[Dependency] private SharedAppearanceSystem _appearanceSystem = default!;
[Dependency] private SharedUserInterfaceSystem _uiSystem = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
+5 -5
View File
@@ -6,10 +6,10 @@ using Robust.Shared.Prototypes;
namespace Content.Client.BarSign;
public sealed class BarSignSystem : VisualizerSystem<BarSignComponent>
public sealed partial class BarSignSystem : VisualizerSystem<BarSignComponent>
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private UserInterfaceSystem _ui = default!;
public override void Initialize()
{
@@ -41,12 +41,12 @@ public sealed class BarSignSystem : VisualizerSystem<BarSignComponent>
&& sign.Current != null
&& _prototypeManager.TryIndex(sign.Current, out var proto))
{
sprite.LayerSetSprite(0, proto.Icon);
SpriteSystem.LayerSetSprite((id, sprite), 0, proto.Icon);
sprite.LayerSetShader(0, "unshaded");
}
else
{
sprite.LayerSetState(0, "empty");
SpriteSystem.LayerSetRsiState((id, sprite), 0, "empty");
sprite.LayerSetShader(0, null, null);
}
}
@@ -6,9 +6,9 @@ using Robust.Shared.Prototypes;
namespace Content.Client.BarSign.Ui;
[UsedImplicitly]
public sealed class BarSignBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
public sealed partial class BarSignBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private IPrototypeManager _prototype = default!;
private BarSignMenu? _menu;
+2 -2
View File
@@ -5,9 +5,9 @@ using Robust.Client.GameObjects;
namespace Content.Client.Beam;
public sealed class BeamSystem : SharedBeamSystem
public sealed partial class BeamSystem : SharedBeamSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
+2 -2
View File
@@ -10,10 +10,10 @@ using Content.Shared.Body.Components;
namespace Content.Client.Body.Systems;
public sealed class BodySystem : SharedBodySystem
public sealed partial class BodySystem : SharedBodySystem
{
// Shitmed Change Start
[Dependency] private readonly MarkingManager _markingManager = default!;
[Dependency] private MarkingManager _markingManager = default!;
private void ApplyMarkingToPart(MarkingPrototype markingPrototype,
IReadOnlyList<Color>? colors,
@@ -0,0 +1,24 @@
using Content.Shared.Atmos.Components;
using Content.Shared.Body.Components;
using Content.Shared.Body.Systems;
namespace Content.Client.Body.Systems;
public sealed partial class InternalsSystem : SharedInternalsSystem
{
[Dependency] private SharedUserInterfaceSystem _ui = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<InternalsComponent, AfterAutoHandleStateEvent>(OnInternalsAfterState);
}
private void OnInternalsAfterState(Entity<InternalsComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (ent.Comp.GasTankEntity != null && _ui.TryGetOpenUi(ent.Comp.GasTankEntity.Value, SharedGasTankUiKey.Key, out var bui))
{
bui.Update();
}
}
}
@@ -5,9 +5,9 @@ using Robust.Shared.Utility;
namespace Content.Client.Botany;
public sealed class PlantHolderVisualizerSystem : VisualizerSystem<PlantHolderVisualsComponent>
public sealed partial class PlantHolderVisualizerSystem : VisualizerSystem<PlantHolderVisualsComponent>
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
+5 -5
View File
@@ -9,12 +9,12 @@ using Robust.Client.Graphics;
namespace Content.Client.Buckle;
internal sealed class BuckleSystem : SharedBuckleSystem
internal sealed partial class BuckleSystem : SharedBuckleSystem
{
[Dependency] private readonly RotationVisualizerSystem _rotationVisualizerSystem = default!;
[Dependency] private readonly IEyeManager _eye = default!;
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private RotationVisualizerSystem _rotationVisualizerSystem = default!;
[Dependency] private IEyeManager _eye = default!;
[Dependency] private SharedTransformSystem _xformSystem = default!;
[Dependency] private SpriteSystem _sprite = default!;
public override void Initialize()
{
+2 -2
View File
@@ -5,9 +5,9 @@ using Robust.Shared.Configuration;
namespace Content.Client.Camera;
public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
public sealed partial class CameraRecoilSystem : SharedCameraRecoilSystem
{
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private IConfigurationManager _configManager = default!;
private float _intensity;
@@ -8,11 +8,11 @@ using Robust.Client.GameObjects;
namespace Content.Client.CardboardBox;
public sealed class CardboardBoxSystem : SharedCardboardBoxSystem
public sealed partial class CardboardBoxSystem : SharedCardboardBoxSystem
{
[Dependency] private readonly EntityLookupSystem _entityLookup = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly ExamineSystemShared _examine = default!;
[Dependency] private EntityLookupSystem _entityLookup = default!;
[Dependency] private TransformSystem _transform = default!;
[Dependency] private ExamineSystemShared _examine = default!;
private EntityQuery<BodyComponent> _bodyQuery;
@@ -8,9 +8,9 @@ using Robust.Shared.Prototypes;
namespace Content.Client.Cargo.BUI;
[UsedImplicitly]
public sealed class CargoShuttleConsoleBoundUserInterface : BoundUserInterface
public sealed partial class CargoShuttleConsoleBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IPrototypeManager _protoManager = default!;
[Dependency] private IPrototypeManager _protoManager = default!;
[ViewVariables]
private CargoShuttleMenu? _menu;
@@ -9,7 +9,7 @@ namespace Content.Client.Cargo.Systems;
public sealed partial class CargoSystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private SharedAppearanceSystem _appearance = default!;
private static readonly Animation CargoTelepadBeamAnimation = new()
{
+1 -1
View File
@@ -5,7 +5,7 @@ namespace Content.Client.Cargo.Systems;
public sealed partial class CargoSystem : SharedCargoSystem
{
[Dependency] private readonly AnimationPlayerSystem _player = default!;
[Dependency] private AnimationPlayerSystem _player = default!;
public override void Initialize()
{
@@ -7,9 +7,9 @@ namespace Content.Client.Cargo.Systems;
/// <summary>
/// This handles...
/// </summary>
public sealed class ClientPriceGunSystem : SharedPriceGunSystem
public sealed partial class ClientPriceGunSystem : SharedPriceGunSystem
{
[Dependency] private readonly UseDelaySystem _useDelay = default!;
[Dependency] private UseDelaySystem _useDelay = default!;
protected override bool GetPriceOrBounty(Entity<PriceGunComponent> entity, EntityUid target, EntityUid user)
{
+1 -1
View File
@@ -14,7 +14,7 @@ namespace Content.Client.Cargo.UI;
[GenerateTypedNameReferences]
public sealed partial class BountyEntry : BoxContainer
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private IPrototypeManager _prototype = default!;
public Action? OnLabelButtonPressed;
public Action? OnSkipButtonPressed;
@@ -12,7 +12,7 @@ namespace Content.Client.Cargo.UI;
[GenerateTypedNameReferences]
public sealed partial class BountyHistoryEntry : BoxContainer
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private IPrototypeManager _prototype = default!;
public BountyHistoryEntry(CargoBountyHistoryData bounty)
{
@@ -19,8 +19,8 @@ namespace Content.Client.CartridgeLoader.Cartridges;
[GenerateTypedNameReferences]
public sealed partial class WantedListUiFragment : BoxContainer
{
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private IEntitySystemManager _entitySystem = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;
private readonly SpriteSystem _spriteSystem;
private string? _selectedTargetName;
+2 -2
View File
@@ -3,9 +3,9 @@ using Robust.Client.UserInterface.Controls;
namespace Content.Client.Changelog
{
public sealed class ChangelogButton : Button
public sealed partial class ChangelogButton : Button
{
[Dependency] private readonly ChangelogManager _changelogManager = default!;
[Dependency] private ChangelogManager _changelogManager = default!;
public ChangelogButton()
{
+4 -4
View File
@@ -13,10 +13,10 @@ namespace Content.Client.Changelog
{
public sealed partial class ChangelogManager : IPostInjectInit
{
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private readonly IResourceManager _resource = default!;
[Dependency] private readonly ISerializationManager _serialization = default!;
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private ILogManager _logManager = default!;
[Dependency] private IResourceManager _resource = default!;
[Dependency] private ISerializationManager _serialization = default!;
[Dependency] private IConfigurationManager _configManager = default!;
private const string SawmillName = "changelog";
public const string MainChangelogName = "Changelog";
@@ -17,8 +17,8 @@ namespace Content.Client.Changelog;
[GenerateTypedNameReferences]
public sealed partial class ChangelogTab : Control
{
[Dependency] private readonly ChangelogManager _changelog = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private ChangelogManager _changelog = default!;
[Dependency] private IResourceCache _resourceCache = default!;
public bool AdminOnly;
@@ -17,9 +17,8 @@ namespace Content.Client.Changelog
[GenerateTypedNameReferences]
public sealed partial class ChangelogWindow : FancyWindow
{
[Dependency] private readonly ChangelogManager _changelog = default!;
[Dependency] private readonly IClientAdminManager _adminManager = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private IClientAdminManager _adminManager = default!;
[Dependency] private ChangelogManager _changelog = default!;
public ChangelogWindow()
{
@@ -115,15 +114,15 @@ namespace Content.Client.Changelog
}
[UsedImplicitly, AnyCommand]
public sealed class ChangelogCommand : IConsoleCommand
public sealed class ChangelogCommand : LocalizedCommands
{
public string Command => "changelog";
public string Description => "Opens the changelog";
public string Help => "Usage: changelog";
[Dependency] private readonly IUserInterfaceManager _uiManager = default!;
public void Execute(IConsoleShell shell, string argStr, string[] args)
public override string Command => "changelog";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
IoCManager.Resolve<IUserInterfaceManager>().GetUIController<ChangelogUIController>().OpenWindow();
_uiManager.GetUIController<ChangelogUIController>().OpenWindow();
}
}
}
@@ -5,9 +5,9 @@ using Robust.Client.UserInterface;
namespace Content.Client.CharacterInfo;
public sealed class CharacterInfoSystem : EntitySystem
public sealed partial class CharacterInfoSystem : EntitySystem
{
[Dependency] private readonly IPlayerManager _players = default!;
[Dependency] private IPlayerManager _players = default!;
public event Action<CharacterData>? OnCharacterUpdate;
@@ -8,9 +8,9 @@ namespace Content.Client.Chasm;
/// <summary>
/// Handles the falling animation for entities that fall into a chasm.
/// </summary>
public sealed class ChasmFallingVisualsSystem : EntitySystem
public sealed partial class ChasmFallingVisualsSystem : EntitySystem
{
[Dependency] private readonly AnimationPlayerSystem _anim = default!;
[Dependency] private AnimationPlayerSystem _anim = default!;
private readonly string _chasmFallAnimationKey = "chasm_fall";
+4 -4
View File
@@ -7,11 +7,11 @@ using Robust.Shared.Utility;
namespace Content.Client.Chat.Managers;
internal sealed class ChatManager : IChatManager
internal sealed partial class ChatManager : IChatManager
{
[Dependency] private readonly IClientConsoleHost _consoleHost = default!;
[Dependency] private readonly IClientAdminManager _adminMgr = default!;
[Dependency] private readonly IEntitySystemManager _systems = default!;
[Dependency] private IClientConsoleHost _consoleHost = default!;
[Dependency] private IClientAdminManager _adminMgr = default!;
[Dependency] private IEntitySystemManager _systems = default!;
private ISawmill _sawmill = default!;
public event Action? PermissionsUpdated;
@@ -7,11 +7,11 @@ using Robust.Shared.Timing;
namespace Content.Client.Chat.TypingIndicator;
// Client-side typing system tracks user input in chat box
public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
public sealed partial class TypingIndicatorSystem : SharedTypingIndicatorSystem
{
[Dependency] private readonly IGameTiming _time = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private IGameTiming _time = default!;
[Dependency] private IPlayerManager _playerManager = default!;
[Dependency] private IConfigurationManager _cfg = default!;
private readonly TimeSpan _typingTimeout = TimeSpan.FromSeconds(2);
private TimeSpan _lastTextChange;

Some files were not shown because too many files have changed in this diff Show More