From 1e60b759cc39a820e3fe7b1fe57fecab42d78576 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 14 Oct 2024 09:10:08 -0700 Subject: [PATCH 1/4] Catch-Up Cherry Pick 2 (#944) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Picked 400 commits (and skipped many, many more) from WizDen since #540. Stopped at commit 332f54a3aebe669f6e50d26e7b047f0bdc28e0fb (Lobby Refactor). --- # TODO - [x] Pick - [x] Compile - [x] Fix runtime errors - [ ] Fix up humanoid profile editor - [ ] Test everything --- # Changelog :cl: - add: Merged 400 WizDen PRs. Happy testing! --------- Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Co-authored-by: osjarw <62134478+osjarw@users.noreply.github.com> Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com> Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: Magnus Larsen Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Co-authored-by: Kukutis96513 <146854220+Kukutis96513@users.noreply.github.com> Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com> Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com> Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com> Co-authored-by: TsjipTsjip <19798667+TsjipTsjip@users.noreply.github.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: Morb <14136326+Morb0@users.noreply.github.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: KrasnoshchekovPavel <119816022+KrasnoshchekovPavel@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: KittenColony <149278380+KittenColony@users.noreply.github.com> Co-authored-by: ShadowCommander Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: T-Stalker <43253663+DogZeroX@users.noreply.github.com> Co-authored-by: ERROR404 <100093430+ERORR404V1@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: Jezithyr Co-authored-by: Psychpsyo <60073468+Psychpsyo@users.noreply.github.com> Co-authored-by: no <165581243+pissdemon@users.noreply.github.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: Ciac32 Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: NotSoDana <75203942+NotSoDana@users.noreply.github.com> Co-authored-by: Simon <63975668+Simyon264@users.noreply.github.com> Co-authored-by: Repo <47093363+Titian3@users.noreply.github.com> Co-authored-by: Tayrtahn Co-authored-by: nao fujiwara Co-authored-by: Michael <107807667+Doc-Michael@users.noreply.github.com> Co-authored-by: Vasilis Co-authored-by: Lamrr <96937466+Lamrr@users.noreply.github.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: Jay <67732946+DuskyJay@users.noreply.github.com> Co-authored-by: Just-a-Unity-Dev <67359748+Just-a-Unity-Dev@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: Tyzemol <85772526+Tyzemol@users.noreply.github.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com> Co-authored-by: RumiTiger <154005209+RumiTiger@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Co-authored-by: Ty Ashley <42426760+TyAshley@users.noreply.github.com> Co-authored-by: exincore Co-authored-by: 0x6273 <0x40@keemail.me> Co-authored-by: Kara Co-authored-by: Ygg01 Co-authored-by: Łukasz Mędrek Co-authored-by: Hannah Giovanna Dawson Co-authored-by: TurboTracker <130304754+TurboTrackerss14@users.noreply.github.com> Co-authored-by: OnsenCapy <101037138+LGRuthes@users.noreply.github.com> Co-authored-by: pigeonpeas <147350443+pigeonpeas@users.noreply.github.com> Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Co-authored-by: Rio <110139251+Riolume@users.noreply.github.com> Co-authored-by: vorkathbruh <152932728+vorkathbruh@users.noreply.github.com> Co-authored-by: Sphiral <145869023+SphiraI@users.noreply.github.com> Co-authored-by: PrPleGoo Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Co-authored-by: username <113782077+whateverusername0@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: Джексон Миссиссиппи Co-authored-by: Brandon Li <48413902+aspiringLich@users.noreply.github.com> Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com> Co-authored-by: RiceMar1244 <138547931+RiceMar1244@users.noreply.github.com> Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Co-authored-by: youtissoum <51883137+youtissoum@users.noreply.github.com> Co-authored-by: ike709 Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: keronshb <54602815+keronshb@users.noreply.github.com> Co-authored-by: VMSolidus Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> --- .editorconfig | 8 +- .github/labeler.yml | 59 +- .github/workflows/conflict-labeler.yml | 12 +- .github/workflows/labeler-pr.yml | 7 +- Content.Client/Access/IdCardSystem.cs | 4 +- .../UI/AgentIDCardBoundUserInterface.cs | 6 +- .../Access/UI/AgentIDCardWindow.xaml.cs | 6 +- .../UI/IdCardConsoleBoundUserInterface.cs | 1 - Content.Client/Actions/ActionsSystem.cs | 3 + .../Components/HeadstandComponent.cs | 2 +- .../Components/KillSignComponent.cs | 5 +- .../Managers/ClientAdminManager.cs | 7 +- .../Administration/Systems/AdminVerbSystem.cs | 23 + .../UI/BanPanel/BanPanel.xaml.cs | 73 + .../Animations/TrackUserComponent.cs | 17 + .../Atmos/UI/GasAnalyzerWindow.xaml.cs | 20 + .../Jukebox/JukeboxBoundUserInterface.cs | 1 - Content.Client/Audio/Jukebox/JukeboxSystem.cs | 16 +- .../CardboardBox/CardboardBoxSystem.cs | 10 + Content.Client/Cargo/UI/BountyEntry.xaml.cs | 1 - .../Changelog/ChangelogWindow.xaml.cs | 2 - Content.Client/Chat/UI/EmotesMenu.xaml | 31 + Content.Client/Chat/UI/EmotesMenu.xaml.cs | 112 + .../Components/SolutionItemStatusComponent.cs | 22 + .../EntitySystems/SolutionItemStatusSystem.cs | 22 + Content.Client/Chemistry/UI/ButtonGrid.cs | 119 + .../Chemistry/UI/InjectorStatusControl.cs | 2 +- .../Chemistry/UI/ReagentCardControl.xaml | 37 + .../Chemistry/UI/ReagentCardControl.xaml.cs | 30 + .../UI/ReagentDispenserBoundUserInterface.cs | 35 +- .../Chemistry/UI/ReagentDispenserWindow.xaml | 112 +- .../UI/ReagentDispenserWindow.xaml.cs | 98 +- .../Chemistry/UI/SolutionStatusControl.cs | 59 + .../Clothing/ClientClothingSystem.cs | 25 + .../UI/CommunicationsConsoleMenu.xaml.cs | 20 + .../Systems/CriminalRecordsHackerSystem.cs | 7 + Content.Client/DeviceNetwork/JammerSystem.cs | 8 + Content.Client/DoAfter/DoAfterOverlay.cs | 12 +- Content.Client/Entry/EntryPoint.cs | 3 +- .../Extinguisher/FireExtinguisherComponent.cs | 6 +- Content.Client/Eye/EyeLerpingSystem.cs | 2 +- Content.Client/Fax/System/FaxVisualsSystem.cs | 48 + Content.Client/Fax/UI/FaxBoundUi.cs | 23 +- .../GameTicking/Managers/ClientGameTicker.cs | 52 +- .../Commands/ToggleGhostVisibilityCommand.cs | 26 + Content.Client/Ghost/GhostSystem.cs | 5 +- .../Controls/GuideReagentEmbed.xaml.cs | 3 +- Content.Client/Guidebook/GuideEntry.cs | 2 +- Content.Client/Guidebook/GuidebookSystem.cs | 5 + .../UI/HealthAnalyzerWindow.xaml.cs | 4 +- .../Implants/UI/ImplanterStatusControl.cs | 16 +- Content.Client/Input/ContentContexts.cs | 2 + .../Inventory/ClientInventorySystem.cs | 3 +- .../Inventory/StrippableBoundUserInterface.cs | 4 +- Content.Client/IoC/ClientContentIoC.cs | 5 +- .../Items/UI/PollingItemStatusControl.cs | 28 + .../Labels/EntitySystems/HandLabelerSystem.cs | 18 + .../UI/HandLabelerBoundUserInterface.cs | 23 +- .../Labels/UI/HandLabelerWindow.xaml.cs | 29 +- Content.Client/LateJoin/LateJoinGui.cs | 3 +- Content.Client/Lathe/UI/LatheMenu.xaml.cs | 21 +- Content.Client/Lathe/UI/RecipeControl.xaml | 10 +- Content.Client/Lathe/UI/RecipeControl.xaml.cs | 6 +- .../EntitySystems/ExpendableLightSystem.cs | 2 +- .../ClientPreferencesManager.cs | 2 +- .../IClientPreferencesManager.cs | 2 +- Content.Client/Lobby/LobbyState.cs | 99 +- Content.Client/Lobby/LobbyUIController.cs | 274 +- .../Lobby/UI/CharacterPickerButton.xaml | 11 + .../Lobby/UI/CharacterPickerButton.xaml.cs | 88 + .../UI/CharacterSetupGui.xaml | 4 - .../Lobby/UI/CharacterSetupGui.xaml.cs | 118 + .../UI/HighlightedContainer.xaml | 0 .../UI/HighlightedContainer.xaml.cs | 2 +- .../UI/HumanoidProfileEditor.xaml | 88 +- .../UI/HumanoidProfileEditor.xaml.cs | 1315 +- .../Lobby/UI/LoadoutPreferenceSelector.xaml | 10 + .../UI/LoadoutPreferenceSelector.xaml.cs} | 68 +- .../Lobby/UI/LobbyCharacterPanel.xaml.cs | 2 +- .../Lobby/UI/LobbyCharacterPreviewPanel.xaml | 20 + .../UI/LobbyCharacterPreviewPanel.xaml.cs | 63 + Content.Client/Lobby/UI/LobbyGui.xaml | 2 +- Content.Client/Lobby/UI/LobbyGui.xaml.cs | 22 +- .../Lobby/UI/ObserveWarningWindow.xaml.cs | 25 +- .../Lobby/UI/RequirementsSelector.xaml | 6 + .../Lobby/UI/RequirementsSelector.xaml.cs | 115 + .../Lobby/UI/TraitPreferenceSelector.xaml | 10 + .../UI/TraitPreferenceSelector.xaml.cs} | 56 +- Content.Client/Magic/MagicSystem.cs | 5 + .../MagicMirrorBoundUserInterface.cs | 3 - .../MagicMirror/MagicMirrorSystem.cs | 8 + Content.Client/Mech/Ui/MechMenu.xaml.cs | 14 +- .../MouseRotator/MouseRotatorSystem.cs | 14 +- .../NetworkConfiguratorBoundUserInterface.cs | 1 + .../Nutrition/EntitySystems/DrinkSystem.cs | 7 + .../Options/UI/Tabs/GraphicsTab.xaml | 3 + .../Options/UI/Tabs/GraphicsTab.xaml.cs | 12 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 + .../Overlays/ShowCriminalRecordIconsSystem.cs | 28 + .../Overlays/ShowHungerIconsSystem.cs | 43 +- Content.Client/Overlays/ShowJobIconsSystem.cs | 60 + .../Overlays/ShowMindShieldIconsSystem.cs | 28 + .../Overlays/ShowSecurityIconsSystem.cs | 86 - .../Overlays/ShowSyndicateIconsSystem.cs | 26 +- .../Overlays/ShowThirstIconsSystem.cs | 43 +- Content.Client/PDA/PdaBoundUserInterface.cs | 7 +- Content.Client/Paper/PaperComponent.cs | 7 +- Content.Client/Pinpointer/NavMapSystem.cs | 105 +- Content.Client/Pinpointer/UI/NavMapControl.cs | 504 +- .../Systems/ChameleonProjectorSystem.cs | 33 + Content.Client/Popups/PopupSystem.cs | 19 +- .../Power/ActivatableUIRequiresPowerSystem.cs | 21 + .../PowerMonitoringConsoleNavMapControl.cs | 208 +- .../Power/PowerMonitoringWindow.xaml.cs | 3 - .../Preferences/UI/AntagPreferenceSelector.cs | 57 - .../Preferences/UI/CharacterSetupGui.xaml.cs | 257 - .../UI/HumanoidProfileEditor.Random.cs | 22 - .../Preferences/UI/JobPrioritySelector.cs | 44 - .../Preferences/UI/RequirementsSelector.cs | 105 - Content.Client/RCD/AlignRCDConstruction.cs | 13 +- .../ReplaySpectatorSystem.Position.cs | 9 +- .../Robotics/Systems/RoboticsConsoleSystem.cs | 7 + .../UI/RoboticsConsoleBoundUserInterface.cs | 50 + .../Robotics/UI/RoboticsConsoleWindow.xaml | 40 + .../Robotics/UI/RoboticsConsoleWindow.xaml.cs | 147 + .../RoundEnd/RoundEndSummaryUIController.cs | 51 + .../RoundEnd/RoundEndSummaryWindow.cs | 1 - .../Shuttles/UI/BaseShuttleControl.xaml.cs | 2 +- Content.Client/Shuttles/UI/DockObject.xaml.cs | 4 + .../Overlays/Shaders/NearsightedOverlays.cs | 130 - .../Overlays/Systems/NearsightedSystems.cs | 64 - .../Station/StationSpawningSystem.cs | 5 +- .../StorageContainerVisualsComponent.cs | 1 + .../Storage/StorageBoundUserInterface.cs | 19 +- .../Storage/Systems/StorageSystem.cs | 4 +- Content.Client/Strip/StrippableSystem.cs | 2 +- Content.Client/Stylesheets/StyleBase.cs | 1 + Content.Client/Stylesheets/StyleNano.cs | 23 + Content.Client/Tips/TippyUI.xaml | 11 + Content.Client/Tips/TippyUI.xaml.cs | 54 + Content.Client/Tips/TippyUIController.cs | 241 + .../Tools/Components/WelderComponent.cs | 18 - Content.Client/Tools/ToolSystem.cs | 20 +- .../Tools/UI/WelderStatusControl.cs | 59 +- .../UserInterface/Controls/ClipControl.cs | 55 + .../UserInterface/Controls/FancyWindow.xaml | 1 + .../Controls/FancyWindow.xaml.cs | 27 + .../UserInterface/Controls/MainViewport.cs | 7 +- .../Controls/NeoTabContainer.xaml.cs | 4 +- .../UserInterface/Controls/SlotButton.cs | 1 + .../UserInterface/Controls/SlotControl.cs | 33 +- .../Systems/Actions/ActionUIController.cs | 112 +- .../Systems/Actions/Controls/ActionButton.cs | 43 +- .../Systems/Alerts/Controls/AlertControl.cs | 4 +- .../Systems/Alerts/Widgets/AlertsUI.xaml.cs | 3 +- .../Systems/Chat/ChatUIController.cs | 2 +- .../Systems/Emotes/EmotesUIController.cs | 125 + .../Ghost/Controls/GhostTargetWindow.xaml | 1 + .../Ghost/Controls/GhostTargetWindow.xaml.cs | 3 + .../Controls/Roles/GhostRoleEntryButtons.xaml | 2 +- .../Roles/GhostRoleEntryButtons.xaml.cs | 65 +- .../Controls/Roles/GhostRolesEntry.xaml.cs | 2 +- .../Ghost/Controls/Roles/GhostRolesEui.cs | 27 +- .../Controls/Roles/GhostRolesWindow.xaml | 4 +- .../Controls/Roles/GhostRolesWindow.xaml.cs | 4 +- .../Ghost/Controls/Roles/MakeGhostRoleEui.cs | 19 +- .../Controls/Roles/MakeGhostRoleWindow.xaml | 18 + .../Roles/MakeGhostRoleWindow.xaml.cs | 121 +- .../Systems/Ghost/GhostUIController.cs | 7 + .../Systems/Hands/Controls/HandButton.cs | 3 + .../Systems/Hands/HandsUIController.cs | 93 +- .../Systems/Hotbar/HotbarUIController.cs | 2 +- .../Systems/Hotbar/Widgets/HotbarGui.xaml | 36 +- .../Systems/Hotbar/Widgets/HotbarGui.xaml.cs | 34 +- .../Inventory/Controls/ItemStatusPanel.xaml | 33 +- .../Controls/ItemStatusPanel.xaml.cs | 90 +- .../Inventory/InventoryUIController.cs | 6 +- .../MenuBar/GameTopMenuBarUIController.cs | 4 + .../MenuBar/Widgets/GameTopMenuBar.xaml | 10 + .../Systems/Storage/StorageUIController.cs | 2 +- .../Systems/Viewport/ViewportUIController.cs | 9 +- .../Verbs/UI/VerbMenuUIController.cs | 25 +- Content.Client/Verbs/VerbSystem.cs | 16 +- Content.Client/Viewport/ScalingViewport.cs | 47 +- .../Components/WeaponArcVisualsComponent.cs | 2 + .../Melee/MeleeWeaponSystem.Effects.cs | 36 +- .../Weapons/Melee/MeleeWeaponSystem.cs | 6 + .../Weapons/Ranged/ItemStatus/BulletRender.cs | 252 + .../Ranged/Systems/GunSystem.AmmoCounter.cs | 256 +- .../Weapons/Ranged/Systems/GunSystem.cs | 65 +- .../Ui/AnalysisConsoleBoundUserInterface.cs | 10 +- .../Ui/AnalysisConsoleMenu.xaml | 48 +- .../Ui/AnalysisConsoleMenu.xaml.cs | 55 +- .../Pair/TestPair.Recycle.cs | 3 +- .../Pair/TestPair.Timing.cs | 19 +- Content.IntegrationTests/PoolManager.Cvars.cs | 2 + .../Tests/Damageable/DamageableTest.cs | 9 + .../DestructibleTestPrototypes.cs | 8 + .../Tests/DoAfter/DoAfterCancellationTests.cs | 2 - .../Tests/GameRules/FailAndStartPresetTest.cs | 152 + .../Tests/GameRules/NukeOpsTest.cs | 14 + .../Tests/GameRules/RuleMaxTimeRestartTest.cs | 9 + .../InteractionTest.EntitySpecifier.cs | 25 +- ...teractionTest.EntitySpecifierCollection.cs | 14 +- .../Interaction/InteractionTest.Helpers.cs | 16 +- .../Tests/Interaction/InteractionTest.cs | 1 - .../Tests/Lobby/CharacterCreationTest.cs | 1 - .../Tests/Mapping/MappingTests.cs | 102 + .../Tests/MaterialArbitrageTest.cs | 58 +- .../Tests/Minds/GhostRoleTests.cs | 12 +- .../Tests/Minds/GhostTests.cs | 159 + .../Tests/Minds/MindTests.EntityDeletion.cs | 17 +- .../Tests/PostMapInitTest.cs | 5 +- .../Tests/Power/PowerTest.cs | 4 +- .../Tests/Preferences/ServerDbSqliteTests.cs | 36 +- .../Tests/RoundEndTest.cs | 10 +- .../Tests/Station/EvacShuttleTest.cs | 127 + Content.IntegrationTests/Tests/StorageTest.cs | 55 +- .../Tests/Utility/EntityWhitelistTest.cs | 27 +- .../Components/IdExaminableComponent.cs | 8 - .../Access/Systems/AccessOverriderSystem.cs | 25 +- .../Access/Systems/AgentIDCardSystem.cs | 8 +- .../Access/Systems/IdCardConsoleSystem.cs | 4 +- Content.Server/Access/Systems/IdCardSystem.cs | 148 - .../Actions/ActionOnInteractSystem.cs | 34 +- .../Administration/BanList/BanListEui.cs | 35 +- .../Components/HeadstandComponent.cs | 2 +- .../Components/KillSignComponent.cs | 5 +- .../Systems/AdminVerbSystem.Smites.cs | 27 +- .../Administration/Systems/AdminVerbSystem.cs | 2 +- .../Administration/Systems/BwoinkSystem.cs | 7 +- .../EntitySystems/SpeakOnUIClosedSystem.cs | 1 + Content.Server/AlertLevel/AlertLevelSystem.cs | 10 + .../Ame/EntitySystems/AmeControllerSystem.cs | 8 +- .../Anomaly/AnomalySystem.Generator.cs | 2 +- .../Anomaly/AnomalySystem.Scanner.cs | 7 +- Content.Server/Anomaly/AnomalySystem.cs | 3 - .../Mimic/MobReplacementRuleComponent.cs | 2 +- .../Arcade/BlockGame/BlockGame.Ui.cs | 68 +- Content.Server/Arcade/BlockGame/BlockGame.cs | 6 +- .../BlockGame/BlockGameArcadeComponent.cs | 4 +- .../Arcade/BlockGame/BlockGameArcadeSystem.cs | 43 +- .../SpaceVillainArcadeSystem.cs | 12 +- .../SpaceVillainGame/SpaceVillainGame.Ui.cs | 3 +- .../Atmos/Components/BreathToolComponent.cs | 3 +- .../Atmos/Components/FlammableComponent.cs | 34 +- .../Components/GasMixtureHolderComponent.cs | 4 +- .../Components/MapAtmosphereComponent.cs | 1 + .../Consoles/AtmosAlertsComputerSystem.cs | 4 +- .../Atmos/EntitySystems/AirFilterSystem.cs | 1 - .../Atmos/EntitySystems/AirtightSystem.cs | 59 +- .../Atmos/EntitySystems/AtmosExposedSystem.cs | 1 + .../EntitySystems/AtmosphereSystem.API.cs | 2 +- .../EntitySystems/AtmosphereSystem.Gases.cs | 1 + .../AtmosphereSystem.GridAtmosphere.cs | 1 + .../EntitySystems/AtmosphereSystem.Hotspot.cs | 1 + .../EntitySystems/AtmosphereSystem.Map.cs | 1 + .../Atmos/EntitySystems/FlammableSystem.cs | 82 +- .../Atmos/EntitySystems/GasAnalyzerSystem.cs | 41 +- .../Atmos/EntitySystems/GasTankSystem.cs | 5 +- Content.Server/Atmos/IGasMixtureHolder.cs | 4 +- Content.Server/Atmos/IGasReactionEffect.cs | 3 +- .../Monitor/Components/AirAlarmComponent.cs | 2 - .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 27 +- .../Binary/Components/GasPortComponent.cs | 2 + .../EntitySystems/GasPressurePumpSystem.cs | 10 +- .../EntitySystems/GasVolumePumpSystem.cs | 10 +- .../Trinary/EntitySystems/GasFilterSystem.cs | 49 +- .../Trinary/EntitySystems/GasMixerSystem.cs | 46 +- .../Unary/EntitySystems/GasCanisterSystem.cs | 30 +- .../EntitySystems/GasThermoMachineSystem.cs | 8 +- .../Unary/EntitySystems/GasVentPumpSystem.cs | 16 +- .../Atmos/Portable/PortableScrubberSystem.cs | 7 +- .../Atmos/Portable/SpaceHeaterSystem.cs | 2 +- .../Atmos/Reactions/AmmoniaOxygenReaction.cs | 1 + .../Atmos/Reactions/FrezonCoolantReaction.cs | 1 + .../Reactions/FrezonProductionReaction.cs | 1 + .../Atmos/Reactions/GasReactionPrototype.cs | 14 +- .../Reactions/N2ODecompositionReaction.cs | 1 + .../Atmos/Reactions/PlasmaFireReaction.cs | 1 + .../Atmos/Reactions/TritiumFireReaction.cs | 1 + .../Atmos/Reactions/WaterVaporReaction.cs | 2 + Content.Server/Atmos/Rotting/RottingSystem.cs | 23 + .../TileAtmosCollectionSerializer.cs | 1 + Content.Server/Atmos/TileMixtureEnumerator.cs | 1 + Content.Server/Audio/Jukebox/JukeboxSystem.cs | 8 +- .../Bed/Cryostorage/CryostorageSystem.cs | 18 +- .../Body/Components/BloodstreamComponent.cs | 1 + .../Body/Systems/BloodstreamSystem.cs | 2 +- .../Body/Systems/InternalsSystem.cs | 17 +- Content.Server/Botany/SeedPrototype.cs | 6 +- .../Botany/Systems/PlantHolderSystem.cs | 1 + .../StationCargoOrderDatabaseComponent.cs | 16 + .../Cargo/Systems/CargoSystem.Bounty.cs | 10 +- .../Cargo/Systems/CargoSystem.Orders.cs | 69 +- .../Cargo/Systems/CargoSystem.Shuttle.cs | 20 +- .../Cargo/Systems/CargoSystem.Telepad.cs | 82 +- Content.Server/Cargo/Systems/CargoSystem.cs | 2 + Content.Server/Cargo/Systems/PricingSystem.cs | 4 +- Content.Server/Carrying/CarryingSystem.cs | 2 +- .../CartridgeLoader/CartridgeLoaderSystem.cs | 8 +- .../Chat/Commands/AdminChatCommand.cs | 2 +- .../Chat/Systems/ChatSystem.Emote.cs | 11 + .../V2/Commands/DeleteChatMessageCommand.cs | 36 + .../V2/Commands/NukeChatMessagesCommand.cs | 41 + Content.Server/Chat/V2/Messages.cs | 94 + .../Chat/V2/Repository/ChatRepository.cs | 196 + .../Components/ReagentTankComponent.cs | 23 - .../EntitySystems/SolutionContainerSystem.cs | 175 +- .../EntitySystems/ChemMasterSystem.cs | 36 +- .../EntitySystems/HypospraySystem.cs | 1 - .../Chemistry/EntitySystems/InjectorSystem.cs | 10 +- .../EntitySystems/ReactionMixerSystem.cs | 2 +- .../EntitySystems/ReagentDispenserSystem.cs | 12 +- .../TransformableContainerSystem.cs | 2 +- .../ReagentEffectConditions/OrganType.cs | 4 +- .../ReagentThreshold.cs | 4 +- .../ReagentEffectConditions/TotalHunger.cs | 35 + .../Chemistry/ReagentEffects/AdjustReagent.cs | 4 +- ...nBoodstream.cs => ChemCleanBloodstream.cs} | 0 .../Chemistry/ReagentEffects/HealthChange.cs | 4 +- .../Chemistry/ReagentEffects/ReduceRotting.cs | 31 + .../Cloning/CloningConsoleSystem.cs | 6 +- Content.Server/Clothing/MagbootsSystem.cs | 19 +- .../Systems/ChameleonClothingSystem.cs | 2 +- .../CommunicationsConsoleSystem.cs | 49 +- .../Configurable/ConfigurationSystem.cs | 9 +- .../Components/WelderRefinableComponent.cs | 32 +- .../Construction/Conditions/Locked.cs | 5 +- .../Construction/ConstructionSystem.Guided.cs | 12 + .../ConstructionSystem.Interactions.cs | 5 +- Content.Server/Construction/RefiningSystem.cs | 63 +- .../ThrowInsertContainerComponent.cs | 35 + .../Containers/ThrowInsertContainerSystem.cs | 50 + Content.Server/Content.Server.csproj | 1 - Content.Server/Crayon/CrayonSystem.cs | 15 +- .../CrewManifest/CrewManifestSystem.cs | 10 +- .../Systems/CriminalRecordsConsoleSystem.cs | 18 +- .../Systems/CriminalRecordsHackerSystem.cs | 62 + .../Systems/DamageOnToolInteractSystem.cs | 2 - Content.Server/Database/ServerDbBase.cs | 47 +- Content.Server/Database/ServerDbManager.cs | 24 +- Content.Server/Database/ServerDbPostgres.cs | 14 +- Content.Server/Database/ServerDbSqlite.cs | 20 +- Content.Server/Database/UserDbDataManager.cs | 62 +- .../SubdermalBionicSyrinxImplantSystem.cs | 13 +- .../Systems/ParadoxAnomalySystem.cs | 4 +- .../Thresholds/Behaviors/BurnBodyBehavior.cs | 10 +- .../Thresholds/Behaviors/PopupBehavior.cs | 2 +- .../Thresholds/Behaviors/SpawnGasBehavior.cs | 1 + .../Components/PowerSensorComponent.cs | 1 + .../Systems/SignalTimerSystem.cs | 13 +- .../Systems/NetworkConfiguratorSystem.cs | 70 +- .../Disposal/Mailing/MailingUnitSystem.cs | 6 +- .../Disposal/Tube/DisposalTubeSystem.cs | 15 +- .../Components/DisposalHolderComponent.cs | 1 + .../Unit/EntitySystems/DisposalUnitSystem.cs | 53 +- .../Systems/DoorElectronicsSystem.cs | 2 +- .../Components/ElectrifiedComponent.cs | 3 + .../Electrocution/ElectrocutionSystem.cs | 3 + Content.Server/Entry/IgnoredComponents.cs | 3 +- .../Components/ExplosiveComponent.cs | 7 + .../Components/RepeatingTriggerComponent.cs | 25 + .../EntitySystems/ExplosionSystem.CVars.cs | 4 +- .../ExplosionSystem.Processing.cs | 6 +- .../EntitySystems/ExplosionSystem.cs | 2 +- .../Explosion/EntitySystems/TriggerSystem.cs | 23 +- .../Extinguisher/FireExtinguisherComponent.cs | 2 +- .../ActivatableUIRequiresVisionSystem.cs | 22 +- Content.Server/Fax/AdminUI/AdminFaxEui.cs | 3 +- Content.Server/Fax/FaxConstants.cs | 1 + Content.Server/Fax/FaxSystem.cs | 88 +- Content.Server/Flash/FlashSystem.cs | 33 +- .../Fluids/EntitySystems/DrainSystem.cs | 22 +- .../EntitySystems/PuddleSystem.Spillable.cs | 23 +- .../Fluids/EntitySystems/SpraySystem.cs | 2 +- .../Components/ForensicScannerComponent.cs | 1 + .../Systems/ForensicScannerSystem.cs | 21 +- .../Forensics/Systems/ForensicsSystem.cs | 2 +- .../GameTicking/GameTicker.GamePreset.cs | 30 +- .../GameTicking/GameTicker.Player.cs | 21 +- .../GameTicking/GameTicker.RoundFlow.cs | 5 +- .../GameTicking/GameTicker.Spawning.cs | 107 +- .../Rules/Components/LoadMapRuleComponent.cs | 7 +- .../Rules/Components/NukeopsRuleComponent.cs | 4 - .../Rules/Components/TraitorRuleComponent.cs | 3 + .../Rules/GameRuleSystem.Utility.cs | 21 +- .../GameTicking/Rules/GameRuleSystem.cs | 15 +- .../GameTicking/Rules/LoadMapRuleSystem.cs | 34 +- .../Rules/MaxTimeRestartRuleSystem.cs | 2 + .../GameTicking/Rules/NukeopsRuleSystem.cs | 4 +- .../Rules/RevolutionaryRuleSystem.cs | 45 +- .../GameTicking/Rules/TraitorRuleSystem.cs | 7 +- .../GameTicking/Rules/ZombieRuleSystem.cs | 4 +- .../Gateway/Systems/GatewaySystem.cs | 8 +- Content.Server/Geras/GerasComponent.cs | 18 + Content.Server/Geras/GerasSystem.cs | 51 + Content.Server/Ghost/GhostSystem.cs | 111 +- .../Roles/Components/GhostRoleComponent.cs | 10 +- .../GhostRoleMobSpawnerComponent.cs | 16 +- .../Components/GhostRoleRaffleComponent.cs | 58 + Content.Server/Ghost/Roles/GhostRoleSystem.cs | 425 +- .../Roles/MakeRaffledGhostRoleCommand.cs | 127 + .../Roles/Raffles/GhostRoleRaffleConfig.cs | 35 + .../GhostRoleRaffleDeciderPrototype.cs | 20 + .../Roles/Raffles/IGhostRoleRaffleDecider.cs | 28 + .../Raffles/RngGhostRoleRaffleDecider.cs | 27 + .../Ghost/Roles/UI/GhostRolesEui.cs | 20 +- .../Gravity/GravityGeneratorSystem.cs | 19 +- .../GridPreloader/GridPreloaderComponent.cs | 16 + .../GridPreloader/GridPreloaderSystem.cs | 147 + Content.Server/Hands/Systems/HandsSystem.cs | 6 +- .../HumanoidAppearanceSystem.Modifier.cs | 14 +- .../IdentityManagement/IdentitySystem.cs | 2 +- .../ImmovableRod/ImmovableRodSystem.cs | 19 +- .../Instruments/InstrumentComponent.cs | 5 +- .../Instruments/InstrumentSystem.cs | 29 +- .../Interaction/InteractionSystem.cs | 27 +- .../Inventory/ServerInventorySystem.cs | 17 - .../Kitchen/EntitySystems/MicrowaveSystem.cs | 11 +- .../EntitySystems/ReagentGrinderSystem.cs | 6 +- .../Kitchen/EntitySystems/SharpSystem.cs | 7 - .../Label/Components/HandLabelerComponent.cs | 19 - .../Labels/Label/HandLabelerSystem.cs | 123 +- Content.Server/Labels/Label/LabelSystem.cs | 2 +- Content.Server/Lathe/LatheSystem.cs | 14 +- .../Components/EmergencyLightComponent.cs | 2 +- .../EntitySystems/EmergencyLightSystem.cs | 100 +- .../UnpoweredFlashlightSystem.cs | 113 - .../Light/Events/LightToggleEvent.cs | 12 - .../ActivatableUIRequiresLockSystem.cs | 1 + Content.Server/Magic/MagicSystem.cs | 394 +- .../MagicMirror/MagicMirrorSystem.cs | 44 +- Content.Server/Mapping/MappingCommand.cs | 2 +- .../MassMedia/Systems/NewsSystem.cs | 18 +- .../Mech/Components/MechAirComponent.cs | 1 + Content.Server/Mech/Systems/MechSystem.cs | 5 +- .../Medical/Components/CryoPodAirComponent.cs | 2 +- .../CrewMonitoringConsoleSystem.cs | 4 +- Content.Server/Medical/CryoPodSystem.cs | 21 +- .../Medical/HealthAnalyzerSystem.cs | 10 +- Content.Server/Medical/PenLightSystem.cs | 30 +- .../Medical/Stethoscope/StethoscopeSystem.cs | 21 +- .../Medical/SuitSensors/SuitSensorSystem.cs | 18 +- Content.Server/Mind/MindSystem.cs | 47 +- .../HTN/Preconditions/GunAmmoPrecondition.cs | 2 +- .../Preconditions/InContainerPrecondition.cs | 27 + .../Preconditions/KeyNotExistsPrecondition.cs | 12 + .../Math/KeyBoolEqualsPrecondition.cs | 23 + .../Math/KeyFloatEqualsPrecondition.cs | 18 + .../Math/KeyFloatGreaterPrecondition.cs | 17 + .../Math/KeyFloatLessPrecondition.cs | 17 + .../Operators/Combat/ContainerOperator.cs | 40 + .../Operators/Combat/EscapeOperator.cs | 140 + .../Operators/Combat/UnPullOperator.cs | 35 + .../Operators/Combat/UnbuckleOperator.cs | 34 + .../Operators/Math/AddFloatOperator.cs | 33 + .../Operators/Math/SetBoolOperator.cs | 28 + .../Operators/{ => Math}/SetFloatOperator.cs | 18 +- .../Operators/Math/SetRandomFloatOperator.cs | 34 + .../Operators/PlaySoundOperator.cs | 28 + .../Operators/SayKeyOperator.cs | 37 + Content.Server/NPC/Systems/NPCSystem.cs | 6 + .../Ninja/Systems/NinjaGlovesSystem.cs | 11 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 29 +- .../Ninja/Systems/SpiderChargeSystem.cs | 5 +- Content.Server/Nuke/NukeCodePaperSystem.cs | 2 + Content.Server/Nuke/NukeSystem.cs | 12 +- Content.Server/NukeOps/WarDeclaratorSystem.cs | 9 +- .../Components/PressurizedDrinkComponent.cs | 27 - .../Nutrition/EntitySystems/DrinkSystem.cs | 95 +- .../EntitySystems/SmokingSystem.Vape.cs | 1 + .../EntitySystems/DeepFryerSystem.Storage.cs | 7 +- .../Kitchen/EntitySystems/DeepFryerSystem.cs | 39 +- .../ReverseEngineeringSystem.cs | 4 +- .../Components/CodeConditionSystem.cs | 17 + .../SpiderChargeConditionComponent.cs | 3 - .../TerminatorTargetOverrideComponent.cs | 12 - .../Components/TerrorConditionComponent.cs | 17 - .../Objectives/Systems/CodeConditionSystem.cs | 76 + .../Systems/NinjaConditionsSystem.cs | 13 - .../Systems/TerminatorTargetOverrideSystem.cs | 41 - Content.Server/PAI/PAISystem.cs | 8 +- Content.Server/PDA/PdaSystem.cs | 27 +- Content.Server/PDA/Ringer/RingerSystem.cs | 17 +- Content.Server/Paper/PaperComponent.cs | 2 +- Content.Server/Paper/PaperSystem.cs | 22 +- Content.Server/Parallax/BiomeSystem.cs | 4 +- .../ParticleAcceleratorSystem.ControlBox.cs | 27 +- .../ParticleAcceleratorSystem.Parts.cs | 2 +- .../ParticleAcceleratorLimiterWireAction.cs | 3 +- .../ParticleAcceleratorStrengthWireAction.cs | 3 +- .../ParticleAcceleratorToggleWireAction.cs | 8 +- Content.Server/Pinpointer/NavMapSystem.cs | 448 +- Content.Server/Pinpointer/StationMapSystem.cs | 14 +- .../PlayTimeTrackingManager.cs | 2 +- .../PlayTimeTrackingSystem.cs | 17 + .../Systems/ChameleonProjectorSystem.cs | 99 + .../Polymorph/Systems/PolymorphSystem.cs | 2 +- Content.Server/Popups/PopupSystem.cs | 8 + .../ActivatableUIRequiresPowerComponent.cs | 8 - .../Power/Components/ChargerComponent.cs | 7 + .../SiliconEmitSoundOnDrainedComponent.cs | 2 + .../ActivatableUIRequiresPowerSystem.cs | 5 +- .../Power/EntitySystems/ApcSystem.cs | 16 +- .../Power/EntitySystems/ChargerSystem.cs | 25 +- .../PowerMonitoringConsoleSystem.cs | 39 +- .../Power/Generation/Teg/TegSystem.cs | 1 + .../Generator/GeneratorExhaustGasSystem.cs | 1 + .../GeneratorSignalControlComponent.cs | 1 + .../Generator/PortableGeneratorSystem.cs | 17 +- Content.Server/PowerCell/PowerCellSystem.cs | 1 + Content.Server/Prayer/PrayerSystem.cs | 2 +- .../Managers/IServerPreferencesManager.cs | 1 + .../Managers/ServerPreferencesManager.cs | 50 +- .../Radio/Components/RadioJammerComponent.cs | 20 - .../Radio/EntitySystems/JammerSystem.cs | 69 +- .../Radio/EntitySystems/RadioDeviceSystem.cs | 15 +- .../Radio/EntitySystems/RadioSystem.cs | 2 +- Content.Server/Radio/RadioEvent.cs | 4 +- .../RandomMetadata/RandomMetadataSystem.cs | 10 +- .../Repairable/RepairableComponent.cs | 15 +- Content.Server/Repairable/RepairableSystem.cs | 3 +- .../Research/Systems/ResearchSystem.Client.cs | 4 +- .../Systems/ResearchSystem.Console.cs | 11 +- .../Systems/DiskConsoleSystem.cs | 2 +- .../Resist/CanEscapeInventoryComponent.cs | 4 +- .../EntitySystems/RevenantSystem.Abilities.cs | 9 +- .../Robotics/Systems/RoboticsConsoleSystem.cs | 146 + Content.Server/Roles/RoleSystem.cs | 1 - Content.Server/RoundEnd/RoundEndSystem.cs | 14 +- .../Expeditions/SalvageExpeditionComponent.cs | 11 +- .../SalvageSystem.ExpeditionConsole.cs | 4 +- .../Salvage/SalvageSystem.Expeditions.cs | 9 + .../Salvage/SalvageSystem.Magnet.cs | 13 +- .../Salvage/SalvageSystem.Runner.cs | 19 +- .../Salvage/SpawnSalvageMissionJob.cs | 2 - .../SensorMonitoringConsoleComponent.cs | 2 +- .../SensorMonitoringConsoleSystem.UI.cs | 22 +- .../DockingSignalControlComponent.cs | 14 + .../Shuttles/Components/FTLComponent.cs | 3 + .../StationEmergencyShuttleComponent.cs | 2 +- .../Shuttles/Systems/ArrivalsSystem.cs | 15 +- .../Systems/DockingSignalControlSystem.cs | 28 + .../Systems/EmergencyShuttleSystem.Console.cs | 53 +- .../Systems/EmergencyShuttleSystem.cs | 84 +- .../Shuttles/Systems/RadarConsoleSystem.cs | 4 +- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 9 +- .../Systems/ShuttleSystem.FasterThanLight.cs | 52 +- .../Shuttles/Systems/ShuttleSystem.IFF.cs | 6 +- .../Shuttles/Systems/ShuttleSystem.cs | 2 + .../Shuttles/Systems/ThrusterSystem.cs | 10 - .../WeldingHealable/WeldingHealableSystem.cs | 11 +- .../Silicons/Borgs/BorgSystem.Transponder.cs | 107 + .../Silicons/Borgs/BorgSystem.Ui.cs | 25 +- Content.Server/Silicons/Borgs/BorgSystem.cs | 7 + .../Silicons/Laws/SiliconLawSystem.cs | 16 +- .../EntitySystems/RadiationCollectorSystem.cs | 3 +- .../PowerSolarControlConsoleSystem.cs | 6 +- .../Components/PirateAccentComponent.cs | 3 +- .../Components/ReplacementAccentComponent.cs | 6 + Content.Server/Speech/EmotesMenuSystem.cs | 30 + .../EntitySystems/AddAccentClothingSystem.cs | 28 +- .../EntitySystems/FrenchAccentSystem.cs | 15 +- .../Speech/EntitySystems/FrontalLispSystem.cs | 15 +- .../EntitySystems/LizardAccentSystem.cs | 16 +- .../EntitySystems/MobsterAccentSystem.cs | 62 +- .../Speech/EntitySystems/MothAccentSystem.cs | 9 +- .../EntitySystems/ParrotAccentSystem.cs | 4 +- .../EntitySystems/PirateAccentSystem.cs | 18 +- .../EntitySystems/ReplacementAccentSystem.cs | 15 +- .../EntitySystems/ScrambledAccentSystem.cs | 4 +- .../EntitySystems/SkeletonAccentSystem.cs | 7 +- .../EntitySystems/SouthernAccentSystem.cs | 12 +- .../Speech/EntitySystems/VocalSystem.cs | 1 + .../Components/StationBiomeComponent.cs | 22 + .../Station/Events/StationPostInitEvent.cs | 2 + .../Station/Systems/StationBiomeSystem.cs | 35 + .../Station/Systems/StationSpawningSystem.cs | 6 +- .../Station/Systems/StationSystem.cs | 29 +- .../AlertLevelInterceptionRuleComponent.cs | 15 + .../RampingStationEventSchedulerComponent.cs | 1 + .../Components/StationEventComponent.cs | 22 +- .../StationEvents/EventManagerSystem.cs | 3 + .../Events/AlertLevelInterceptionRule.cs | 23 + .../StationEvents/Events/CargoGiftsRule.cs | 5 +- .../Events/StationEventSystem.cs | 2 + .../StationGoal/StationGoalPaperSystem.cs | 1 + .../StationGoal/StationGoalPrototype.cs | 2 +- .../GeneralStationRecordConsoleSystem.cs | 6 +- .../Systems/StationRecordsSystem.cs | 2 +- .../Components/EntityStorageComponent.cs | 1 + .../EntitySystems/SpawnItemsOnUseSystem.cs | 4 +- .../EntitySystems/StorageSystem.Fill.cs | 11 + .../Storage/EntitySystems/StorageSystem.cs | 167 - .../Store/Systems/StoreSystem.Refund.cs | 2 +- .../Store/Systems/StoreSystem.Ui.cs | 27 +- Content.Server/Store/Systems/StoreSystem.cs | 9 +- Content.Server/Strip/StrippableSystem.cs | 10 +- .../SurveillanceCameraMonitorSystem.cs | 12 +- .../Systems/SurveillanceCameraRouterSystem.cs | 12 +- .../Systems/SurveillanceCameraSystem.cs | 14 +- .../Components/TerminatorComponent.cs | 19 - .../Components/TerminatorTargetComponent.cs | 16 - .../Terminator/Systems/TerminatorSystem.cs | 75 - .../ThiefUndeterminedBackpackSystem.cs | 2 +- Content.Server/Tips/TipsSystem.cs | 114 +- .../Tools/Components/WelderComponent.cs | 56 - Content.Server/Tools/ToolSystem.Welder.cs | 211 - Content.Server/Tools/ToolSystem.cs | 71 +- .../Uplink/Commands/AddUplinkCommand.cs | 1 - .../Traits/Assorted/SingerSystem.cs | 6 +- .../UserInterface/ActivatableUISystem.cs | 235 - .../UserInterface/IntrinsicUIComponent.cs | 10 +- .../UserInterface/IntrinsicUISystem.cs | 31 +- Content.Server/Vampire/BloodSuckerSystem.cs | 2 +- .../VendingMachines/VendingMachineSystem.cs | 4 +- .../VoiceMask/VoiceMaskSystem.Equip.cs | 14 +- Content.Server/VoiceMask/VoiceMaskSystem.cs | 32 +- .../Weapons/Ranged/Systems/GunSystem.cs | 10 +- Content.Server/Wires/WiresSystem.cs | 21 +- .../Prototypes/NoiseChannelPrototype.cs | 2 +- .../Components/TraversalDistorterComponent.cs | 6 +- .../Systems/ArtifactAnalyzerSystem.cs | 34 +- .../Systems/TraversalDistorterSystem.cs | 44 +- .../XenoArtifacts/ArtifactSystem.Nodes.cs | 81 +- .../XenoArtifacts/ArtifactSystem.cs | 37 +- .../Effects/Systems/GasArtifactSystem.cs | 1 + .../Effects/Systems/PortalArtifactSystem.cs | 3 +- .../Effects/Systems/ShuffleArtifactSystem.cs | 11 +- .../Systems/TemperatureArtifactSystem.cs | 1 + .../Systems/ArtifactExamineTriggerSystem.cs | 5 + .../Zombies/IncurableZombieComponent.cs | 10 +- .../Zombies/InitialInfectedExemptComponent.cs | 2 +- .../Zombies/PendingZombieComponent.cs | 8 +- .../Zombies/ZombieSystem.Transform.cs | 10 +- Content.Server/Zombies/ZombieSystem.cs | 8 +- .../Access/Components/IdCardComponent.cs | 6 + .../Components/IdCardConsoleComponent.cs | 2 - .../Components/IdExaminableComponent.cs | 6 + .../Access/SharedAgentIDCardSystem.cs | 10 +- .../Access/Systems/AccessReaderSystem.cs | 2 +- .../Access/Systems/IdExaminableSystem.cs | 16 +- .../Access/Systems/SharedIdCardSystem.cs | 158 + .../ActionBlocker/ActionBlockerSystem.cs | 10 +- Content.Shared/Actions/ActionEvents.cs | 10 +- Content.Shared/Actions/BaseActionComponent.cs | 8 +- .../Actions/Events/ActionPerformedEvent.cs | 8 + .../Events/ValidateActionEntityTargetEvent.cs | 4 + .../Events/ValidateActionWorldTargetEvent.cs | 6 + Content.Shared/Actions/SharedActionsSystem.cs | 71 +- Content.Shared/Administration/AdminFlags.cs | 10 + .../Components/SharedHeadstandComponent.cs | 5 +- .../Components/SharedKillSignComponent.cs | 5 +- Content.Shared/Alert/AlertType.cs | 1 + .../Prototypes/AnnouncerPrototype.cs | 2 +- .../Armor/AllowSuitStorageComponent.cs | 10 + Content.Shared/Atmos/AtmosDirection.cs | 17 +- .../Atmos/Components/GasAnalyzerComponent.cs | 4 +- .../Atmos/GasMixture.cs | 5 +- .../Atmos/GasMixtureStringRepresentation.cs | 16 + .../Atmos/GetFireProtectionEvent.cs | 33 + .../Atmos/Reactions/GasReactionEnums.cs | 14 + .../Audio/Jukebox/JukeboxPrototype.cs | 2 +- .../Prototypes/MetabolismGroupPrototype.cs | 8 +- .../Prototypes/MetabolizerTypePrototype.cs | 7 +- Content.Shared/CCVar/CCVars.cs | 99 +- Content.Shared/Cargo/CargoOrderData.cs | 30 +- .../Components/CargoOrderConsoleComponent.cs | 8 + .../Cargo/Components/CashComponent.cs | 2 +- .../Components/SharedCargoTelepadComponent.cs | 3 + .../Cargo/Prototypes/CargoProductPrototype.cs | 2 +- Content.Shared/Chat/EmotesEvents.cs | 11 + .../Chat/Prototypes/EmotePrototype.cs | 42 +- .../Chat/Prototypes/EmoteSoundsPrototype.cs | 5 +- .../SharedTypingIndicatorSystem.cs | 19 +- Content.Shared/Chat/V2/Repository/Types.cs | 60 + Content.Shared/Chat/V2/Types.cs | 94 + .../Chemistry/Components/InjectorComponent.cs | 3 +- .../Components/MixableSolutionComponent.cs | 13 + .../Components/ReagentTankComponent.cs | 22 + .../Chemistry/Components/Solution.cs | 8 +- .../EntitySystems/RehydratableSystem.cs | 2 +- .../EntitySystems/SharedInjectorSystem.cs | 2 +- ...redSolutionContainerSystem.Capabilities.cs | 24 +- .../SharedSolutionContainerSystem.cs | 335 +- .../EntitySystems/SolutionTransferSystem.cs | 11 +- .../Reaction/ReactionMixerComponent.cs | 3 - .../Chemistry/Reagent/ReagentPrototype.cs | 7 + .../Chemistry/SharedReagentDispenser.cs | 54 +- Content.Shared/Climbing/Systems/BonkSystem.cs | 11 +- .../Climbing/Systems/ClimbSystem.cs | 3 +- Content.Shared/Clothing/ClothingEvents.cs | 29 + .../Clothing/Components/ClothingComponent.cs | 3 + .../Components/FireProtectionComponent.cs | 17 + .../Components/HideLayerClothingComponent.cs | 24 + .../Clothing/Components/LoadoutComponent.cs | 9 +- .../Clothing/EntitySystems/ClothingSystem.cs | 106 +- .../EntitySystems/FireProtectionSystem.cs | 23 + .../Clothing/EntitySystems/MaskSystem.cs | 20 +- .../Clothing/EntitySystems/SkatesSystem.cs | 24 +- .../Prototypes/LoadoutCategoryPrototype.cs | 2 +- .../Loadouts/Prototypes/LoadoutPrototype.cs | 2 +- .../Loadouts/Systems/LoadoutSystem.cs | 5 +- .../Containers/ContainerFillComponent.cs | 1 + .../Containers/ItemSlot/ItemSlotsSystem.cs | 6 +- Content.Shared/Content.Shared.csproj | 3 - .../CriminalRecordsHackerComponent.cs | 31 + .../SharedCriminalRecordsHackerSystem.cs | 50 + .../Damage/Prototypes/DamageGroupPrototype.cs | 6 + .../Prototypes/DamageModifierSetPrototype.cs | 2 +- .../Damage/Prototypes/DamageTypePrototype.cs | 6 + .../Damage/Systems/DamageExamineSystem.cs | 5 +- .../DeviceLinking/DevicePortPrototype.cs | 4 +- .../SharedNetworkConfiguratorSystem.cs | 13 + .../Components/SharedDisposalUnitComponent.cs | 7 - Content.Shared/DoAfter/DoAfterEvent.cs | 2 +- .../DoAfter/SharedDoAfterSystem.Update.cs | 1 + Content.Shared/DoAfter/SharedDoAfterSystem.cs | 5 +- .../SharedFireExtinguisherComponent.cs | 2 + .../Blinding/Components/BlindableComponent.cs | 6 +- .../Eye/Blinding/Systems/BlindableSystem.cs | 24 +- .../Eye/Blinding/Systems/EyeClosingSystem.cs | 3 +- .../Fax/Components}/FaxMachineComponent.cs | 48 +- .../Fax/Components/FaxableObjectComponent.cs | 16 + .../Fax/Components/FaxecuteComponent.cs | 19 + Content.Shared/Fax/DamageOnFaxecuteEvent.cs | 9 + Content.Shared/Fax/SharedFax.cs | 5 +- Content.Shared/Fax/Systems/FaxecuteSystem.cs | 34 + .../Flash/Components/FlashComponent.cs | 10 + .../Components/FlashOnTriggerComponent.cs | 1 + Content.Shared/Follower/FollowerSystem.cs | 21 + Content.Shared/Geras/SharedGerasSystem.cs | 16 + Content.Shared/Ghost/GhostComponent.cs | 2 + .../Ghost/Roles/GhostRolePrototype.cs | 38 + .../Ghost/Roles/GhostRolesEuiMessages.cs | 60 +- .../Roles/Raffles/GhostRoleRaffleSettings.cs | 30 + .../GhostRoleRaffleSettingsPrototype.cs | 22 + Content.Shared/Ghost/SharedGhostSystem.cs | 6 + .../Prototypes/PreloadedGridPrototype.cs | 21 + .../Systems/SharedGridPreloaderSystem.cs | 4 + .../Hands/Components/HandsComponent.cs | 34 + .../SharedHandsSystem.Interactions.cs | 29 +- .../Hands/EntitySystems/SharedHandsSystem.cs | 48 +- .../HealthExaminableComponent.cs | 10 +- .../HealthExaminableSystem.cs | 12 +- .../Humanoid/HumanoidAppearanceComponent.cs | 6 + .../Humanoid/HumanoidCharacterAppearance.cs | 434 +- .../Humanoid/HumanoidProfileExport.cs | 17 + .../SharedHumanoidAppearanceSystem.cs | 83 +- Content.Shared/Humanoid/SkinColor.cs | 67 + Content.Shared/Input/ContentKeyFunctions.cs | 2 + .../Interaction/Components/ClumsyComponent.cs | 30 +- .../Interaction/SharedInteractionSystem.cs | 26 +- .../Inventory/Events/UnequippedEvents.cs | 6 + .../Inventory/InventoryComponent.cs | 12 + .../Inventory/InventorySystem.Equip.cs | 16 +- .../Inventory/InventorySystem.Relay.cs | 9 +- .../Inventory/InventorySystem.Slots.cs | 40 +- .../Inventory/InventoryTemplatePrototype.cs | 6 + Content.Shared/Inventory/SlotFlags.cs | 2 + .../Labels/Components/HandLabelerComponent.cs | 30 + .../EntitySystems/SharedHandLabelerSystem.cs | 129 + .../Labels/EntitySystems/SharedLabelSystem.cs | 2 + Content.Shared/Labels/LabelEvents.cs | 62 +- Content.Shared/Language/LanguagePrototype.cs | 2 +- .../SharedExpendableLightComponent.cs | 1 - .../UnpoweredFlashlightComponent.cs | 3 +- .../UnpoweredFlashlightSystem.cs | 122 + Content.Shared/Light/LightToggleEvent.cs | 6 + .../ContentLocalizationManager.cs | 4 +- Content.Shared/Lock/LockComponent.cs | 1 - Content.Shared/Lock/LockSystem.cs | 16 +- .../Magic/Components/MagicComponent.cs | 39 + .../Magic/Components/SpellbookComponent.cs | 17 +- .../Components/WizardClothesComponent.cs | 10 + .../Magic/Events/BeforeCastSpellEvent.cs | 12 + .../Magic/Events/ChargeSpellEvent.cs | 18 + .../Magic/Events/InstantSpawnSpellEvent.cs | 12 +- .../Magic/Events/KnockSpellEvent.cs | 19 +- .../Magic/Events/ProjectileSpellEvent.cs | 12 +- .../Magic/Events/SmiteSpellEvent.cs | 7 +- .../Magic/Events/SpeakSpellEvent.cs | 8 + .../Magic/Events/TeleportSpellEvent.cs | 12 +- .../Magic/Events/WorldSpawnSpellEvent.cs | 16 +- Content.Shared/Magic/MagicInstantSpawnData.cs | 25 + Content.Shared/Magic/MagicSpawnData.cs | 20 - Content.Shared/Magic/SharedMagicSystem.cs | 519 + Content.Shared/Magic/SpellbookSystem.cs | 98 + .../MagicMirror/MagicMirrorComponent.cs | 8 +- .../MagicMirror/SharedMagicMirrorSystem.cs | 21 +- Content.Shared/Mind/SharedMindSystem.cs | 25 +- .../Mobs/Components/MobStateComponent.cs | 21 +- Content.Shared/Mobs/Systems/MobStateSystem.cs | 21 - Content.Shared/Mood/MoodCategoryPrototype.cs | 2 +- Content.Shared/Mood/MoodEffectPrototype.cs | 2 +- .../MouseRotator/MouseRotatorComponent.cs | 13 +- .../MouseRotator/SharedMouseRotatorSystem.cs | 17 +- .../Movement/Components/MobMoverComponent.cs | 9 + .../Movement/Pulling/Systems/PullingSystem.cs | 13 + .../Systems/SharedMoverController.Input.cs | 2 +- .../Movement/Systems/SharedMoverController.cs | 11 +- .../Ninja/Components/SpaceNinjaComponent.cs | 20 +- .../Ninja/Systems/DashAbilitySystem.cs | 9 +- .../Ninja/Systems/SharedNinjaGlovesSystem.cs | 2 + .../Nutrition/Components/DrinkComponent.cs | 22 +- .../PressurizedSolutionComponent.cs | 106 + .../Components/ShakeableComponent.cs | 50 + .../Nutrition/EntitySystems/HungerSystem.cs | 44 +- .../Nutrition/EntitySystems/OpenableSystem.cs | 44 +- .../PressurizedSolutionSystem.cs | 285 + .../EntitySystems/ShakeableSystem.cs | 155 + .../EntitySystems/SharedDrinkSystem.cs | 90 + .../Nutrition/EntitySystems/ThirstSystem.cs | 43 + .../Mail/MailDeliveryPoolPrototype.cs | 2 +- Content.Shared/Objectives/ObjectiveInfo.cs | 1 + .../ShowCriminalRecordIconsComponent.cs | 9 + .../Overlays/ShowHungerIconsComponent.cs | 2 +- ...sComponent.cs => ShowJobIconsComponent.cs} | 4 +- .../Overlays/ShowMindShieldIconsComponent.cs | 9 + .../Overlays/ShowSyndicateIconsComponent.cs | 2 +- .../Overlays/ShowThirstIconsComponent.cs | 2 +- Content.Shared/Paper/SharedPaperComponent.cs | 2 + .../Components/PayloadTriggerComponent.cs | 1 + Content.Shared/Physics/CollisionGroup.cs | 3 + Content.Shared/Pinpointer/NavMapComponent.cs | 52 +- .../Pinpointer/SharedNavMapSystem.cs | 186 +- .../PlayTimeTrackingShared.cs | 11 +- .../Plunger/Systems/PlungerSystem.cs | 4 +- .../Components/ChameleonDisguiseComponent.cs | 25 + .../Components/ChameleonProjectorComponent.cs | 68 + .../Systems/SharedChameleonProjectorSystem.cs | 113 + Content.Shared/Popups/SharedPopupSystem.cs | 12 + .../ActivatableUIRequiresPowerComponent.cs | 8 + .../SharedPowerMonitoringConsoleSystem.cs | 20 + .../Preferences/HumanoidCharacterProfile.cs | 1076 +- .../Loadouts/Effects/SpeciesLoadoutEffect.cs | 6 + Content.Shared/Prying/Systems/PryingSystem.cs | 17 +- Content.Shared/RCD/RCDPrototype.cs | 8 +- .../Components/SharedRadioJammerComponent.cs | 74 + .../Radio/EntitySystems/SharedJammerSystem.cs | 78 + .../Random/Helpers/SharedRandomExtensions.cs | 5 +- .../ReagentSpeed/ReagentSpeedComponent.cs | 34 + .../ReagentSpeed/ReagentSpeedSystem.cs | 33 + .../Components/RoboticsConsoleComponent.cs | 53 + Content.Shared/Robotics/RoboticsConsoleUi.cs | 126 + .../Systems/SharedRoboticsConsoleSystem.cs | 8 + Content.Shared/Roles/SharedRoleSystem.cs | 3 + .../Roles/StartingGearEquippedEvent.cs | 10 + Content.Shared/Salvage/SalvageMapPrototype.cs | 2 +- .../Components/BorgTransponderComponent.cs | 43 + .../Silicons/Laws/SiliconLawPrototype.cs | 2 +- .../Traits/Components/NearsightedComponent.cs | 49 - .../Speech/Components/VocalComponent.cs | 15 +- Content.Shared/Speech/SpeechComponent.cs | 8 + .../Prototypes/AirlockDepartmentsPrototype.cs | 2 +- .../Station/SharedStationSpawningSystem.cs | 56 +- .../StatusIcon/StatusIconPrototype.cs | 2 +- Content.Shared/Stealth/SharedStealthSystem.cs | 2 +- .../ClothingRequiredStepTriggerComponent.cs | 10 + ...thingRequiredStepTriggerImmuneComponent.cs | 16 + .../ShoesRequiredStepTriggerComponent.cs | 11 - .../Systems/ShoesRequiredStepTriggerSystem.cs | 41 - .../Systems/StepTriggerImmuneSystem.cs | 37 + .../Components/SecretStashComponent.cs | 1 + .../EntitySystems/SharedStorageSystem.cs | 302 +- Content.Shared/Storage/StorageComponent.cs | 31 +- Content.Shared/Store/ListingPrototype.cs | 10 +- Content.Shared/Tag/TagSystem.cs | 117 +- .../Systems/SwapTeleporterSystem.cs | 15 +- Content.Shared/Timing/UseDelayComponent.cs | 59 +- Content.Shared/Timing/UseDelaySystem.cs | 154 +- Content.Shared/Tips/TippyEvent.cs | 19 + .../Tools/Components/SharedWelderComponent.cs | 21 - ...SharedWeldable.cs => WeldableComponent.cs} | 26 +- .../Tools/Components/WelderComponent.cs | 58 + .../Tools/Systems/SharedToolSystem.Welder.cs | 178 + .../Tools/Systems/SharedToolSystem.cs | 44 +- .../Tools/Systems/WeldableSystem.cs | 6 +- .../Components/PermanentBlindnessComponent.cs | 2 + .../Components}/SelfAwareComponent.cs | 5 +- .../Prototypes/SingerInstrumentPrototype.cs | 5 +- .../Systems/PermanentBlindnessSystem.cs | 37 +- .../Assorted/Systems/SharedSingerSystem.cs | 6 +- .../UserInterface/ActivatableUIComponent.cs | 44 +- .../UserInterface/ActivatableUIEvents.cs | 6 +- ...ActivatableUIRequiresPowerCellComponent.cs | 7 +- .../ActivatableUISystem.Power.cs | 38 +- .../UserInterface/ActivatableUISystem.cs | 332 + Content.Shared/Verbs/SharedVerbSystem.cs | 26 +- Content.Shared/Verbs/VerbCategory.cs | 2 + Content.Shared/Verbs/VerbEvents.cs | 10 +- Content.Shared/Wagging/WaggingComponent.cs | 3 - .../Weapons/Melee/MeleeSoundSystem.cs | 1 + .../Weapons/Melee/MeleeWeaponComponent.cs | 8 + .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 52 +- .../Ranged/Components/ActionGunComponent.cs | 37 + .../Components/GunWieldBonusComponent.cs | 3 + .../Weapons/Ranged/Events/MuzzleFlashEvent.cs | 9 +- .../Weapons/Ranged/Systems/ActionGunSystem.cs | 41 + .../Weapons/Ranged/Systems/SharedGunSystem.cs | 8 +- .../Weapons/Reflect/ReflectComponent.cs | 35 +- .../Weapons/Reflect/ReflectSystem.cs | 90 +- Content.Shared/Whitelist/EntityWhitelist.cs | 137 +- .../Whitelist/EntityWhitelistSystem.cs | 84 + .../Components/WieldableComponent.cs | 7 + Content.Shared/Wieldable/WieldableSystem.cs | 10 +- .../Equipment/SharedArtifactAnalyzer.cs | 78 +- Content.Shared/Zombies/ZombieComponent.cs | 2 +- Content.Tests/Shared/DamageTest.cs | 16 + Content.YAMLLinter/Program.cs | 46 +- Resources/Audio/Animals/attributions.yml | 34 +- Resources/Audio/Animals/fox1.ogg | Bin 0 -> 11424 bytes Resources/Audio/Animals/fox10.ogg | Bin 0 -> 16382 bytes Resources/Audio/Animals/fox11.ogg | Bin 0 -> 20105 bytes Resources/Audio/Animals/fox12.ogg | Bin 0 -> 6623 bytes Resources/Audio/Animals/fox13.ogg | Bin 0 -> 31239 bytes Resources/Audio/Animals/fox14.ogg | Bin 0 -> 30980 bytes Resources/Audio/Animals/fox2.ogg | Bin 0 -> 10537 bytes Resources/Audio/Animals/fox3.ogg | Bin 0 -> 13459 bytes Resources/Audio/Animals/fox4.ogg | Bin 0 -> 18978 bytes Resources/Audio/Animals/fox5.ogg | Bin 0 -> 11268 bytes Resources/Audio/Animals/fox6.ogg | Bin 0 -> 11811 bytes Resources/Audio/Animals/fox7.ogg | Bin 0 -> 11690 bytes Resources/Audio/Animals/fox8.ogg | Bin 0 -> 12874 bytes Resources/Audio/Animals/fox9.ogg | Bin 0 -> 9852 bytes .../Audio/Announcements/attributions.yml | 5 + Resources/Audio/Announcements/intercept.ogg | Bin 0 -> 239180 bytes .../Audio/Effects/Footsteps/attributions.yml | 7 + .../Audio/Effects/Footsteps/borgwalk1.ogg | Bin 0 -> 21701 bytes .../Audio/Effects/Footsteps/borgwalk2.ogg | Bin 0 -> 20233 bytes .../Grenades/SelfDestruct/SDS_Charge.ogg | Bin 0 -> 61451 bytes .../Grenades/SelfDestruct/SDS_Charge2.ogg | Bin 0 -> 55510 bytes .../Grenades/SelfDestruct/attributions.yml | 8 + Resources/Audio/Effects/chopstickbreak.ogg | Bin 0 -> 5552 bytes Resources/Audio/Effects/spray3.ogg | Bin 0 -> 12266 bytes Resources/Audio/Expedition/attributions.yml | 9 + Resources/Audio/Expedition/deadline.ogg | Bin 0 -> 1797293 bytes .../{Misc => Expedition}/tension_session.ogg | Bin Resources/Audio/Items/attributions.yml | 17 + Resources/Audio/Items/sheath.ogg | Bin 0 -> 7529 bytes Resources/Audio/Items/soda_shake.ogg | Bin 0 -> 18034 bytes Resources/Audio/Items/soda_spray.ogg | Bin 0 -> 16910 bytes Resources/Audio/Items/unsheath.ogg | Bin 0 -> 8558 bytes Resources/Audio/Jukebox/attributions.yml | 5 + Resources/Audio/Jukebox/sunset.ogg | Bin 0 -> 1535176 bytes Resources/Audio/Machines/warning_buzzer.ogg | Bin 29891 -> 57798 bytes .../Audio/Voice/Silicon/attributions.yml | 4 + .../Audio/Voice/Silicon/syndieborg_laugh.ogg | Bin 0 -> 97668 bytes .../Audio/Voice/Talk/Silicon/attributions.yml | 10 + Resources/Audio/Voice/Talk/Silicon/borg.ogg | Bin 0 -> 16427 bytes .../Audio/Voice/Talk/Silicon/borg_ask.ogg | Bin 0 -> 17365 bytes .../Audio/Voice/Talk/Silicon/borg_exclaim.ogg | Bin 0 -> 14653 bytes .../Audio/Voice/Talk/Silicon/syndieborg.ogg | Bin 0 -> 15981 bytes .../Voice/Talk/Silicon/syndieborg_ask.ogg | Bin 0 -> 17181 bytes .../Voice/Talk/Silicon/syndieborg_exclaim.ogg | Bin 0 -> 15793 bytes .../ConfigPresets/Build/development.toml | 1 + .../EinsteinEngines/default.toml | 1 + Resources/Locale/en-US/HUD/game-hud.ftl | 1 + Resources/Locale/en-US/accent/italian.ftl | 3 - Resources/Locale/en-US/accent/pirate.ftl | 2 +- .../Locale/en-US/accessories/human-hair.ftl | 1 + .../en-US/accessories/vox-facial-hair.ftl | 10 +- .../Locale/en-US/accessories/vox-hair.ftl | 27 +- .../Locale/en-US/administration/smites.ftl | 2 - .../en-US/administration/ui/admin-logs.ftl | 1 - .../en-US/administration/ui/admin-notes.ftl | 1 - Resources/Locale/en-US/alerts/alerts.ftl | 3 - .../components/ame-controller-component.ftl | 1 - .../space-villain-game-component.ftl | 3 +- .../en-US/atmos/gas-analyzer-component.ftl | 2 + Resources/Locale/en-US/borg/borg.ftl | 5 + Resources/Locale/en-US/burning/bodyburn.ftl | 2 +- .../en-US/cargo/cargo-console-component.ftl | 1 + .../chameleon-projector.ftl | 2 + Resources/Locale/en-US/chat/chat-repo.ftl | 7 + Resources/Locale/en-US/chat/emotes.ftl | 60 + Resources/Locale/en-US/chat/ui/emote-menu.ftl | 3 + .../reagent-dispenser-component.ftl | 2 +- .../components/solution-scanner-component.ftl | 1 + .../chemistry/components/solution-status.ftl | 2 + .../Locale/en-US/commands/tippy-command.ftl | 12 + .../en-US/commands/toolshed-commands.ftl | 2 + .../communications-console-component.ftl | 3 +- .../en-US/components/storage-component.ftl | 2 + .../construction/ui/construction-menu.ftl | 3 +- .../Locale/en-US/containers/containers.ftl | 3 + .../Locale/en-US/damage/damage-groups.ftl | 6 + .../Locale/en-US/damage/damage-types.ftl | 14 + .../Locale/en-US/devices/device-network.ftl | 2 + .../en-US/devices/network-configurator.ftl | 4 +- .../components/disposal-router-component.ftl | 4 - .../components/disposal-tagger-window.ftl | 3 - .../components/disposal-unit-component.ftl | 3 - .../en-US/escape-menu/ui/options-menu.ftl | 6 +- Resources/Locale/en-US/fax/fax.ftl | 2 + .../Locale/en-US/flavors/flavor-profiles.ftl | 9 + .../fluids/components/absorbent-component.ftl | 10 +- .../game-presets/preset-revolutionary.ftl | 14 +- .../game-presets/preset-traitor.ftl | 3 +- .../game-rules/rule-terminator.ftl | 18 - Resources/Locale/en-US/geras/geras.ftl | 2 + Resources/Locale/en-US/ghost/ghost-gui.ftl | 12 + .../ghost/roles/ghost-role-component.ftl | 50 +- .../ghostrole-spawner-verb-selectable.ftl | 1 + .../en-US/guidebook/chemistry/conditions.ftl | 13 +- .../en-US/guidebook/chemistry/effects.ftl | 8 +- Resources/Locale/en-US/guidebook/guides.ftl | 2 +- Resources/Locale/en-US/implant/implant.ftl | 5 +- .../interaction-popup-component.ftl | 6 - .../Locale/en-US/inventory/item-status.ftl | 1 + .../Locale/en-US/job/job-supervisors.ftl | 2 +- .../machine-linking/transmitter_ports.ftl | 3 + Resources/Locale/en-US/magic/magic.ftl | 1 + Resources/Locale/en-US/markings/reptilian.ftl | 9 +- .../Locale/en-US/markings/vox_tattoos.ftl | 11 + Resources/Locale/en-US/mech/mech.ftl | 1 + .../components/health-analyzer-component.ftl | 22 - .../en-US/metabolism/metabolism-groups.ftl | 7 + .../en-US/metabolism/metabolizer-types.ftl | 13 + .../Locale/en-US/ninja/ninja-actions.ftl | 2 + .../nutrition/components/drink-component.ftl | 4 +- .../pressurized-solution-component.ftl | 3 + .../components/shakeable-component.ftl | 3 + .../en-US/objectives/conditions/terminate.ftl | 1 - .../preferences/ui/character-setup-gui.ftl | 1 - .../ui/humanoid-profile-editor.ftl | 1 + .../Locale/en-US/prototypes/roles/antags.ftl | 3 - .../en-US/radiation/geiger-component.ftl | 2 +- .../components/radio-jammer-component.ftl | 10 + Resources/Locale/en-US/reagents/mannitol.ftl | 1 + .../meta/consumable/drink/alcohol.ftl | 18 + Resources/Locale/en-US/reagents/meta/fun.ftl | 2 +- .../Locale/en-US/reagents/meta/medicine.ftl | 9 + .../Locale/en-US/reagents/meta/narcotics.ftl | 6 +- .../en-US/reagents/meta/physical-desc.ftl | 4 +- .../Locale/en-US/reagents/meta/toxins.ftl | 3 + Resources/Locale/en-US/reagents/psicodine.ftl | 3 + .../research/components/robotics-console.ftl | 19 + .../Locale/en-US/research/technologies.ftl | 2 +- Resources/Locale/en-US/seeds/seeds.ftl | 7 +- Resources/Locale/en-US/speech/speech-liar.ftl | 132 + .../en-US/station-events/events/intercept.ftl | 1 + .../station-events/events/unknown-shuttle.ftl | 1 + Resources/Locale/en-US/station-laws/laws.ftl | 2 - .../en-US/step-trigger/shoes-required.ftl | 2 +- Resources/Locale/en-US/store/categories.ftl | 8 + Resources/Locale/en-US/store/currency.ftl | 3 +- .../Locale/en-US/store/spellbook-catalog.ftl | 35 + .../Locale/en-US/store/uplink-catalog.ftl | 13 +- Resources/Locale/en-US/thief/backpack.ftl | 6 +- .../tools/components/welder-component.ftl | 3 +- .../Locale/en-US/traits/disabilities.ftl | 2 - Resources/Locale/en-US/traits/traits.ftl | 6 + Resources/Locale/en-US/ui/verbs.ftl | 3 - Resources/Locale/en-US/verbs/verb-system.ftl | 2 +- .../en-US/wieldable/wieldable-component.ftl | 3 +- .../xenoarchaeology/artifact-analyzer.ftl | 7 + .../xenoarchaeology/traversal-distorter.ftl | 9 +- Resources/Maps/Dungeon/experiment.yml | 7 - Resources/Maps/Dungeon/lava_brig.yml | 26008 ++++++++-------- .../Maps/Ruins/DeltaV/biodome_satellite.yml | 4 + Resources/Maps/Ruins/DeltaV/old_ai_sat.yml | 4 + .../DeltaV/DV-atlas-conference-room.yml | 4 + Resources/Maps/Salvage/small-3.yml | 692 - Resources/Maps/Salvage/vegan-meatball.yml | 4 +- Resources/Maps/Shuttles/DeltaV/NTES_Box.yml | 4 + Resources/Maps/Shuttles/DeltaV/NTES_Delta.yml | 4 + Resources/Maps/Shuttles/DeltaV/NTES_Kaeri.yml | 4 + Resources/Maps/Shuttles/DeltaV/NTES_Lox.yml | 4 + .../Maps/Shuttles/DeltaV/NTES_Propeller.yml | 4 + .../ShuttleEvent/disaster_evacpod.yml | 350 + .../Maps/Shuttles/ShuttleEvent/honki.yml | 2666 ++ .../Maps/Shuttles/ShuttleEvent/lost_cargo.yml | 1411 + .../Shuttles/{ => ShuttleEvent}/striker.yml | 0 .../Shuttles/ShuttleEvent/syndie_evacpod.yml | 1188 + .../ShuttleEvent/traveling_china_cuisine.yml | 1872 ++ Resources/Maps/Test/dev_map.yml | 1 - Resources/Maps/core.yml | 1 - Resources/Maps/tortuga.yml | 1 - Resources/Migrations/migration.yml | 14 +- .../Prototypes/Accents/word_replacements.yml | 47 + Resources/Prototypes/Access/security.yml | 13 +- Resources/Prototypes/Actions/polymorph.yml | 30 + Resources/Prototypes/Actions/types.yml | 17 +- .../Prototypes/AlertLevels/alert_levels.yml | 7 + Resources/Prototypes/Alerts/alerts.yml | 9 + Resources/Prototypes/Anomaly/behaviours.yml | 5 +- .../Prototypes/Body/Parts/terminator.yml | 158 - Resources/Prototypes/Body/Parts/vox.yml | 8 +- .../Prototypes/Body/Prototypes/terminator.yml | 85 - .../Catalog/Cargo/cargo_engines.yml | 22 +- .../Catalog/Cargo/cargo_security.yml | 2 +- .../Catalog/Fills/Crates/engines.yml | 2 +- .../Catalog/Fills/Crates/service.yml | 6 +- .../Catalog/Fills/Lockers/engineer.yml | 15 +- .../Catalog/Fills/Lockers/heads.yml | 4 + .../Catalog/Fills/Paper/manuals.yml | 4 +- .../Prototypes/Catalog/Jukebox/Standard.yml | 6 + .../Catalog/ReagentDispensers/beverage.yml | 1 + .../VendingMachines/Inventories/boozeomat.yml | 4 + .../VendingMachines/Inventories/chang.yml | 1 + .../VendingMachines/Inventories/curadrobe.yml | 1 + .../VendingMachines/Inventories/detdrobe.yml | 2 +- .../Inventories/dinnerware.yml | 1 + .../VendingMachines/Inventories/discount.yml | 1 + .../VendingMachines/Inventories/medical.yml | 5 +- .../VendingMachines/Inventories/sec.yml | 9 +- .../Prototypes/Catalog/spellbook_catalog.yml | 140 + .../Prototypes/Catalog/thief_toolbox_sets.yml | 1 + .../Prototypes/Catalog/uplink_catalog.yml | 405 +- .../Chemistry/metabolism_groups.yml | 9 +- .../Chemistry/metabolizer_types.yml | 26 +- Resources/Prototypes/Damage/groups.yml | 5 + Resources/Prototypes/Damage/modifier_sets.yml | 10 +- Resources/Prototypes/Damage/types.yml | 13 + .../Prototypes/Datasets/corporations.yml | 12 + .../Prototypes/Datasets/criminal_records.yml | 6 + .../Prototypes/DeltaV/Body/Organs/harpy.yml | 2 +- .../DeltaV/Entities/Clothing/Eyes/hud.yml | 10 +- .../DeltaV/Entities/Mobs/NPCs/animals.yml | 12 + .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 6 +- .../DeltaV/Entities/Mobs/NPCs/nukiemouse.yml | 6 +- .../Entities/Objects/Misc/paperslips.yml | 4 +- .../Machines/syndicate_monitor_server.yml | 2 - .../Prototypes/DeltaV/GameRules/events.yml | 1 - .../DeltaV/Objectives/paradox_anomaly.yml | 4 +- .../DeltaV/Recipes/Construction/clothing.yml | 8 +- .../Prototypes/DeltaV/Voice/speech_emotes.yml | 9 + .../Device/devicenet_frequencies.yml | 11 + .../Prototypes/DeviceLinking/source_ports.yml | 5 + .../Entities/Clothing/Back/backpacks.yml | 4 +- .../Entities/Clothing/Back/specific.yml | 8 +- .../Clothing/Belt/base_clothingbelt.yml | 4 +- .../Entities/Clothing/Belt/belts.yml | 13 +- .../Entities/Clothing/Belt/quiver.yml | 4 + .../Entities/Clothing/Ears/specific.yml | 2 +- .../Entities/Clothing/Eyes/glasses.yml | 4 +- .../Prototypes/Entities/Clothing/Eyes/hud.yml | 49 +- .../Entities/Clothing/Eyes/specific.yml | 2 +- .../Entities/Clothing/Hands/gloves.yml | 14 +- .../Entities/Clothing/Hands/specific.yml | 4 +- .../Clothing/Head/base_clothinghead.yml | 20 +- .../Clothing/Head/hardsuit-helmets.yml | 8 +- .../Entities/Clothing/Head/hats.yml | 27 +- .../Entities/Clothing/Head/helmets.yml | 23 +- .../Entities/Clothing/Head/hoods.yml | 45 +- .../Entities/Clothing/Head/specific.yml | 2 +- .../Entities/Clothing/Head/welding.yml | 5 + .../Entities/Clothing/Masks/bandanas.yml | 5 +- .../Entities/Clothing/Masks/masks.yml | 93 +- .../Entities/Clothing/Masks/specific.yml | 43 +- .../Entities/Clothing/Neck/medals.yml | 228 +- .../Entities/Clothing/Neck/specific.yml | 2 +- .../Entities/Clothing/OuterClothing/armor.yml | 17 +- .../OuterClothing/base_clothingouter.yml | 18 +- .../Entities/Clothing/OuterClothing/coats.yml | 71 +- .../Clothing/OuterClothing/hardsuits.yml | 13 +- .../Entities/Clothing/OuterClothing/misc.yml | 13 +- .../Clothing/OuterClothing/specific.yml | 2 +- .../Entities/Clothing/OuterClothing/suits.yml | 34 +- .../Entities/Clothing/OuterClothing/vests.yml | 4 +- .../Clothing/OuterClothing/wintercoats.yml | 38 +- .../Clothing/Shoes/base_clothingshoes.yml | 1 + .../Entities/Clothing/Shoes/magboots.yml | 2 +- .../Entities/Clothing/Shoes/misc.yml | 2 + .../Entities/Clothing/Shoes/specific.yml | 2 +- .../Entities/Clothing/Uniforms/jumpskirts.yml | 19 +- .../Entities/Clothing/Uniforms/jumpsuits.yml | 4 +- .../Entities/Clothing/Uniforms/specific.yml | 4 +- .../Entities/Clothing/base_clothing.yml | 6 + .../Prototypes/Entities/Debugging/tippy.yml | 30 + .../Prototypes/Entities/Effects/puddle.yml | 5 +- .../Random/Food_Drinks/drinks_glass.yml | 6 + .../Random/Food_Drinks/food_produce.yml | 4 +- .../Entities/Markers/Spawners/ghost_roles.yml | 31 +- .../Entities/Markers/Spawners/mobs.yml | 14 + .../Customization/Markings/human_hair.yml | 7 + .../Mobs/Customization/Markings/reptilian.yml | 20 + .../Markings/vox_facial_hair.yml | 24 +- .../Mobs/Customization/Markings/vox_hair.yml | 141 +- .../Mobs/Customization/Markings/vox_parts.yml | 145 + .../Customization/Markings/vox_tattoos.yml | 55 + .../Mobs/Cyborgs/base_borg_chassis.yml | 87 +- .../Entities/Mobs/Cyborgs/borg_chassis.yml | 35 +- .../Entities/Mobs/Debugging/debug_counter.yml | 53 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 193 +- .../Entities/Mobs/NPCs/behonker.yml | 6 +- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 2 + .../Prototypes/Entities/Mobs/NPCs/dogs.yml | 5 +- .../Entities/Mobs/NPCs/elemental.yml | 5 +- .../Entities/Mobs/NPCs/hellspawn.yml | 3 + .../Prototypes/Entities/Mobs/NPCs/pets.yml | 17 +- .../Entities/Mobs/NPCs/regalrat.yml | 2 + .../Entities/Mobs/NPCs/revenant.yml | 6 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 71 +- .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 69 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 5 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 18 +- .../Prototypes/Entities/Mobs/NPCs/xenopet.yml | 26 +- .../Entities/Mobs/Player/admin_ghost.yml | 26 +- .../Entities/Mobs/Player/dragon.yml | 49 + .../Entities/Mobs/Player/familiars.yml | 2 + .../Entities/Mobs/Player/guardian.yml | 12 +- .../Entities/Mobs/Player/humanoid.yml | 340 + .../Entities/Mobs/Player/reptilian.yml | 3 +- .../Entities/Mobs/Player/silicon_base.yml | 7 +- .../Entities/Mobs/Player/skeleton.yml | 6 + .../Entities/Mobs/Player/terminator.yml | 203 - .../Prototypes/Entities/Mobs/Player/vox.yml | 4 +- .../Entities/Mobs/Species/arachne.yml | 2 +- .../Entities/Mobs/Species/arachnid.yml | 1 + .../Prototypes/Entities/Mobs/Species/base.yml | 8 +- .../Entities/Mobs/Species/dwarf.yml | 5 + .../Entities/Mobs/Species/harpy.yml | 1 - .../Entities/Mobs/Species/human.yml | 5 + .../Prototypes/Entities/Mobs/Species/moth.yml | 1 + .../Entities/Mobs/Species/reptilian.yml | 6 +- .../Entities/Mobs/Species/slime.yml | 36 + .../Prototypes/Entities/Mobs/Species/vox.yml | 53 + Resources/Prototypes/Entities/Mobs/base.yml | 2 +- .../Consumable/Drinks/drinks-cartons.yml | 3 + .../Objects/Consumable/Drinks/drinks.yml | 102 +- .../Consumable/Drinks/drinks_bottles.yml | 8 +- .../Objects/Consumable/Drinks/drinks_cans.yml | 10 +- .../Objects/Consumable/Drinks/drinks_cups.yml | 7 +- .../Objects/Consumable/Drinks/drinks_fun.yml | 3 + .../Consumable/Drinks/drinks_special.yml | 67 +- .../Consumable/Drinks/trash_drinks.yml | 18 +- .../Objects/Consumable/Food/Baked/bread.yml | 3 + .../Objects/Consumable/Food/Baked/cake.yml | 3 + .../Consumable/Food/Containers/bowl.yml | 6 +- .../Consumable/Food/Containers/box.yml | 5 +- .../Objects/Consumable/Food/produce.yml | 39 +- .../Smokeables/Cigarettes/joints.yml | 56 + .../Consumable/Smokeables/Pipes/pipe.yml | 23 + .../Machine/base_machineboard.yml | 2 +- .../Circuitboards/Machine/production.yml | 63 +- .../Devices/Circuitboards/computer.yml | 13 +- .../Objects/Devices/Electronics/door.yml | 6 +- .../Devices/Electronics/door_access.yml | 228 +- .../Objects/Devices/Electronics/triggers.yml | 17 +- .../reinforcement_teleporter.yml | 18 +- .../Syndicate_Gadgets/war_declarator.yml | 4 +- .../Objects/Devices/chameleon_projector.yml | 71 + .../Entities/Objects/Devices/flatpack.yml | 14 + .../Objects/Devices/forensic_scanner.yml | 6 +- .../Entities/Objects/Devices/geiger.yml | 3 + .../Entities/Objects/Devices/mousetrap.yml | 2 +- .../Entities/Objects/Devices/pda.yml | 21 +- .../Entities/Objects/Devices/pinpointer.yml | 17 +- .../Entities/Objects/Devices/radio.yml | 17 + .../Objects/Devices/station_beacon.yml | 4 +- .../Entities/Objects/Devices/station_map.yml | 2 +- .../Fun/Instruments/base_instruments.yml | 8 +- .../Entities/Objects/Fun/candy_bucket.yml | 4 +- .../Entities/Objects/Fun/crayons.yml | 4 +- .../Prototypes/Entities/Objects/Fun/dice.yml | 2 +- .../Entities/Objects/Fun/immovable_rod.yml | 1 + .../Prototypes/Entities/Objects/Fun/pai.yml | 10 +- .../Entities/Objects/Fun/snap_pops.yml | 7 +- .../Entities/Objects/Fun/whistles.yml | 30 +- .../Entities/Objects/Magic/books.yml | 61 +- .../Objects/Materials/Sheets/glass.yml | 24 +- .../Objects/Materials/Sheets/metal.yml | 8 +- .../Objects/Materials/Sheets/other.yml | 12 +- .../Entities/Objects/Materials/materials.yml | 52 + .../Entities/Objects/Materials/parts.yml | 4 +- .../Entities/Objects/Materials/shards.yml | 27 +- .../Entities/Objects/Misc/books.yml | 15 +- .../Entities/Objects/Misc/chopsticks.yml | 30 + .../Objects/Misc/fire_extinguisher.yml | 3 + .../Entities/Objects/Misc/fluff_lights.yml | 5 + .../Objects/Misc/identification_cards.yml | 4 +- .../Entities/Objects/Misc/medalcase.yml | 3 + .../Entities/Objects/Misc/paper.yml | 18 +- .../Entities/Objects/Misc/pet_carrier.yml | 2 +- .../Objects/Misc/subdermal_implants.yml | 6 +- .../Entities/Objects/Misc/utensils.yml | 25 + .../Objects/Power/portable_recharger.yml | 38 + .../Entities/Objects/Shields/shields.yml | 4 +- .../Objects/Specific/Cargo/cargo_pallet.yml | 26 +- .../Objects/Specific/Chapel/bibles.yml | 4 +- .../Entities/Objects/Specific/Chapel/urn.yml | 4 +- .../Objects/Specific/Hydroponics/leaves.yml | 94 + .../Objects/Specific/Hydroponics/seeds.yml | 21 + .../Objects/Specific/Janitorial/janitor.yml | 6 + .../Objects/Specific/Janitorial/spray.yml | 8 + .../Objects/Specific/Janitorial/trashbag.yml | 2 + .../Objects/Specific/Kitchen/foodcarts.yml | 4 +- .../Entities/Objects/Specific/Mech/mechs.yml | 4 +- .../Medical/handheld_crew_monitor.yml | 3 +- .../Specific/Medical/healthanalyzer.yml | 3 +- .../Objects/Specific/Medical/medkits.yml | 3 + .../Objects/Specific/Research/anomaly.yml | 4 +- .../Specific/Robotics/borg_modules.yml | 19 +- .../Objects/Specific/Service/barber.yml | 7 +- .../Xenoarchaeology/artifact_equipment.yml | 2 +- .../Xenoarchaeology/item_artifacts.yml | 16 +- .../Xenoarchaeology/structure_artifacts.yml | 16 +- .../Entities/Objects/Specific/atmos.yml | 6 +- .../Objects/Specific/chemical-containers.yml | 7 +- .../Objects/Specific/chemistry-bottles.yml | 9 +- .../Objects/Specific/chemistry-vials.yml | 9 +- .../Entities/Objects/Specific/chemistry.yml | 32 +- .../Entities/Objects/Specific/syndicate.yml | 4 +- .../Objects/Tools/access_configurator.yml | 4 +- .../Entities/Objects/Tools/appraisal.yml | 3 + .../Entities/Objects/Tools/bucket.yml | 8 +- .../Entities/Objects/Tools/cable_coils.yml | 2 +- .../Entities/Objects/Tools/cowtools.yml | 9 +- .../Entities/Objects/Tools/decoys.yml | 47 +- .../Entities/Objects/Tools/flare.yml | 8 +- .../Entities/Objects/Tools/gas_tanks.yml | 9 +- .../Prototypes/Entities/Objects/Tools/gps.yml | 4 + .../Entities/Objects/Tools/hand_labeler.yml | 2 +- .../Objects/Tools/handheld_mass_scanner.yml | 2 +- .../Entities/Objects/Tools/jammer.yml | 32 +- .../Entities/Objects/Tools/jetpacks.yml | 2 +- .../Entities/Objects/Tools/penlight.yml | 4 +- .../Entities/Objects/Tools/spray_painter.yml | 4 +- .../Entities/Objects/Tools/t-ray.yml | 4 + .../Entities/Objects/Tools/toolbox.yml | 2 +- .../Entities/Objects/Tools/tools.yml | 16 +- .../Entities/Objects/Tools/welders.yml | 1 - .../Guns/Ammunition/Boxes/light_rifle.yml | 2 +- .../Weapons/Guns/Ammunition/Boxes/magnum.yml | 2 +- .../Weapons/Guns/Ammunition/Boxes/rifle.yml | 2 +- .../Weapons/Guns/Ammunition/Boxes/shotgun.yml | 17 +- .../Guns/Ammunition/Magazines/light_rifle.yml | 21 + .../Guns/Ammunition/Magazines/magnum.yml | 26 + .../Guns/Ammunition/Magazines/pistol.yml | 70 + .../Guns/Ammunition/Magazines/rifle.yml | 21 + .../Guns/Ammunition/Magazines/shotgun.yml | 9 + .../Guns/Ammunition/SpeedLoaders/magnum.yml | 21 + .../Weapons/Guns/Basic/base_wieldable.yml | 12 + .../Objects/Weapons/Guns/Basic/watergun.yml | 4 +- .../Weapons/Guns/Battery/battery_guns.yml | 10 +- .../Entities/Objects/Weapons/Guns/Bow/bow.yml | 3 +- .../Objects/Weapons/Guns/LMGs/lmgs.yml | 1 + .../Weapons/Guns/Launchers/launchers.yml | 2 +- .../Weapons/Guns/Projectiles/arrows.yml | 3 +- .../Weapons/Guns/Projectiles/magic.yml | 33 + .../Objects/Weapons/Guns/Rifles/rifles.yml | 2 +- .../Objects/Weapons/Guns/SMGs/smgs.yml | 12 + .../Weapons/Guns/Shotguns/shotguns.yml | 43 +- .../Objects/Weapons/Guns/Snipers/snipers.yml | 4 +- .../Objects/Weapons/Guns/pneumatic_cannon.yml | 6 +- .../Objects/Weapons/Melee/baseball_bat.yml | 3 + .../Entities/Objects/Weapons/Melee/cane.yml | 98 + .../Objects/Weapons/Melee/e_sword.yml | 7 +- .../Entities/Objects/Weapons/Melee/knife.yml | 1 - .../Objects/Weapons/Melee/stunprod.yml | 4 +- .../Entities/Objects/Weapons/Melee/sword.yml | 19 +- .../Objects/Weapons/Throwable/grenades.yml | 24 + .../Entities/Objects/Weapons/security.yml | 7 + .../Prototypes/Entities/Objects/base_item.yml | 4 +- .../Prototypes/Entities/Stations/base.yml | 2 +- .../Dispensers/base_structuredispensers.yml | 4 +- .../Structures/Doors/Airlocks/access.yml | 18 +- .../Doors/Airlocks/base_structureairlocks.yml | 5 +- .../Structures/Doors/Airlocks/highsec.yml | 5 +- .../Structures/Doors/Airlocks/shuttle.yml | 7 +- .../Structures/Doors/Firelocks/firelock.yml | 3 +- .../Structures/Doors/Shutter/shutters.yml | 4 +- .../Doors/Windoors/base_structurewindoors.yml | 7 +- .../Structures/Doors/Windoors/windoor.yml | 242 +- .../Structures/Furniture/bookshelf.yml | 4 +- .../Entities/Structures/Furniture/dresser.yml | 4 +- .../Entities/Structures/Furniture/shower.yml | 4 +- .../Entities/Structures/Furniture/toilet.yml | 13 +- .../Structures/Lighting/base_lighting.yml | 43 +- .../Structures/Lighting/ground_lighting.yml | 6 +- .../Structures/Lighting/strobe_lighting.yml | 4 +- .../Structures/Machines/Computers/arcades.yml | 8 +- .../Machines/Computers/computers.yml | 146 +- .../Machines/Computers/techdiskterminal.yml | 8 +- .../Structures/Machines/Medical/cryo_pod.yml | 4 +- .../Structures/Machines/anomaly_equipment.yml | 8 +- .../Structures/Machines/artifact_analyzer.yml | 1 + .../Entities/Structures/Machines/bombs.yml | 2 +- .../Structures/Machines/chem_master.yml | 4 +- .../Structures/Machines/fax_machine.yml | 23 +- .../Structures/Machines/flatpacker.yml | 4 +- .../Entities/Structures/Machines/gateway.yml | 4 +- .../Structures/Machines/gravity_generator.yml | 4 +- .../Entities/Structures/Machines/hotplate.yml | 2 +- .../Entities/Structures/Machines/jukebox.yml | 4 +- .../Entities/Structures/Machines/lathe.yml | 361 +- .../Structures/Machines/microwave.yml | 4 +- .../Entities/Structures/Machines/nuke.yml | 4 +- .../Structures/Machines/reagent_grinder.yml | 6 +- .../Entities/Structures/Machines/research.yml | 4 +- .../Entities/Structures/Machines/salvage.yml | 4 +- .../Machines/surveillance_camera_routers.yml | 4 +- .../Structures/Machines/telecomms.yml | 2 +- .../Structures/Machines/vending_machines.yml | 8 +- .../Machines/wireless_surveillance_camera.yml | 2 +- .../Structures/Piping/Atmospherics/binary.yml | 6 +- .../Structures/Piping/Atmospherics/pipes.yml | 68 +- .../Piping/Atmospherics/portable.yml | 4 +- .../Piping/Atmospherics/trinary.yml | 9 +- .../Structures/Piping/Atmospherics/unary.yml | 7 +- .../Structures/Piping/Disposal/pipes.yml | 14 +- .../Structures/Piping/Disposal/units.yml | 18 +- .../Power/Generation/PA/control_box.yml | 8 +- .../Structures/Power/Generation/ame.yml | 4 +- .../Power/Generation/portable_generator.yml | 2 +- .../Entities/Structures/Power/apc.yml | 4 +- .../Structures/Specific/Anomaly/anomalies.yml | 1 - .../Structures/Specific/Janitor/janicart.yml | 4 +- .../Entities/Structures/Specific/oracle.yml | 9 - .../Storage/Canisters/gas_canisters.yml | 2 +- .../Closets/Lockers/base_structurelockers.yml | 7 +- .../Storage/Crates/base_structurecrates.yml | 2 +- .../Structures/Storage/Crates/crates.yml | 4 +- .../Structures/Storage/filing_cabinets.yml | 8 +- .../Entities/Structures/Storage/glass_box.yml | 238 +- .../Entities/Structures/Storage/morgue.yml | 6 +- .../Entities/Structures/Storage/ore_box.yml | 4 +- .../Entities/Structures/Storage/storage.yml | 4 +- .../Structures/Wallmounts/air_alarm.yml | 8 +- .../Structures/Wallmounts/fire_alarm.yml | 4 +- .../Structures/Wallmounts/intercom.yml | 4 +- .../Entities/Structures/Wallmounts/mirror.yml | 4 +- .../Wallmounts/monitors_televisions.yml | 8 +- .../Structures/Wallmounts/noticeboard.yml | 4 +- .../Structures/Wallmounts/station_map.yml | 2 +- .../Wallmounts/surveillance_camera.yml | 4 +- .../Entities/Structures/Wallmounts/timer.yml | 4 +- .../Entities/Structures/Walls/grille.yml | 2 +- .../Entities/Structures/Walls/walls.yml | 6 +- .../Entities/Structures/cargo_telepad.yml | 2 + .../Entities/Structures/cryopod.yml | 4 +- .../Entities/Structures/plastic_flaps.yml | 36 +- .../Entities/Tiles/shadow_basalt.yml | 2 +- Resources/Prototypes/Flavors/flavors.yml | 45 + .../Prototypes/GameRules/cargo_gifts.yml | 17 +- Resources/Prototypes/GameRules/events.yml | 239 +- Resources/Prototypes/GameRules/midround.yml | 22 +- Resources/Prototypes/GameRules/roundstart.yml | 2 +- .../Prototypes/GameRules/unknown_shuttles.yml | 64 + Resources/Prototypes/GameRules/variation.yml | 8 +- .../Prototypes/GhostRoleRaffles/deciders.yml | 3 + .../Prototypes/GhostRoleRaffles/settings.yml | 15 + Resources/Prototypes/Guidebook/science.yml | 1 - .../Prototypes/Hydroponics/mutations.yml | 1 - Resources/Prototypes/Hydroponics/seeds.yml | 301 +- .../aghost_inventory_template.yml | 1 + .../arachnid_inventory_template.yml | 9 + .../corpse_inventory_template.yml | 5 + .../diona_inventory_template.yml | 7 + .../holoclown_inventory_template.yml | 2 + .../human_inventory_template.yml | 7 + .../kangaroo_inventory_template.yml | 3 + .../monkey_inventory_template.yml | 3 + Resources/Prototypes/Magic/event_spells.yml | 13 + Resources/Prototypes/Magic/knock_spell.yml | 2 + .../Prototypes/Magic/projectile_spells.yml | 34 +- .../Prototypes/Magic/teleport_spells.yml | 4 +- Resources/Prototypes/Magic/utility_spells.yml | 15 + Resources/Prototypes/Maps/asterisk.yml | 2 + Resources/Prototypes/NPCs/Combat/melee.yml | 38 + Resources/Prototypes/NPCs/debug.yml | 90 + .../Prototypes/Nyanotrasen/Damage/groups.yml | 1 + .../Prototypes/Nyanotrasen/Damage/types.yml | 1 + .../Entities/Markers/Spawners/ghost_roles.yml | 40 +- .../Entities/Mobs/NPCs/mutants.yml | 261 +- .../Nyanotrasen/Entities/Mobs/NPCs/xeno.yml | 2 + .../Objects/Specific/Chapel/amphorae.yml | 5 +- .../Objects/Specific/Mail/base_mail.yml | 1 - .../Structures/Machines/deep_fryer.yml | 5 +- .../Entities/Structures/Machines/laundry.yml | 4 +- .../Machines/reverseEngineering.yml | 4 +- .../Structures/Research/sophicscribe.yml | 6 - .../Entities/Structures/Walls/walls.yml | 2 - .../Nyanotrasen/Hydroponics/seeds.yml | 5 +- .../Recipes/Cooking/meal_recipes.yml | 18 +- .../Nyanotrasen/Voice/speech_emotes.yml | 5 + .../Prototypes/Objectives/base_objectives.yml | 8 + Resources/Prototypes/Objectives/ninja.yml | 18 +- .../Prototypes/Objectives/terminator.yml | 40 - Resources/Prototypes/Objectives/traitor.yml | 3 + Resources/Prototypes/Polymorphs/polymorph.yml | 33 + .../Reagents/Consumable/Drink/alcohol.yml | 192 +- .../Reagents/Consumable/Drink/base_drink.yml | 3 +- .../Reagents/Consumable/Drink/drinks.yml | 36 +- .../Reagents/Consumable/Drink/juice.yml | 18 + .../Reagents/Consumable/Drink/soda.yml | 30 +- .../Reagents/Consumable/Food/food.yml | 8 +- Resources/Prototypes/Reagents/botany.yml | 10 + Resources/Prototypes/Reagents/gases.yml | 24 +- Resources/Prototypes/Reagents/medicine.yml | 85 + Resources/Prototypes/Reagents/narcotics.yml | 69 +- Resources/Prototypes/Reagents/toxins.yml | 21 +- .../Graphs/clothing/prescriptionhuds.yml} | 0 .../Construction/Graphs/clothing/quiver.yml | 19 + .../Graphs/structures/glassbox.yml | 160 + .../Graphs/structures/plastic_flaps.yml | 51 - .../Recipes/Construction/clothing.yml | 11 + .../Recipes/Construction/storage.yml | 18 + .../Recipes/Construction/structures.yml | 34 - .../Recipes/Cooking/meal_recipes.yml | 32 +- .../Recipes/Crafting/Graphs/bots/honkbot.yml | 30 +- .../Crafting/Graphs/bots/supplybot.yml | 23 + .../Graphs/improvised/makeshiftstunprod.yml | 23 +- .../Recipes/Crafting/Graphs/smokeables.yml | 43 + .../Crafting/Graphs/storage/tallbox.yml | 2 - .../Prototypes/Recipes/Crafting/bots.yml | 13 + .../Recipes/Crafting/smokeables.yml | 33 + .../Prototypes/Recipes/Lathes/clothing.yml | 12 +- .../Prototypes/Recipes/Lathes/cooking.yml | 7 + .../Prototypes/Recipes/Lathes/devices.yml | 8 + .../Prototypes/Recipes/Lathes/electronics.yml | 188 +- .../Prototypes/Recipes/Lathes/janitorial.yml | 2 +- .../Prototypes/Recipes/Lathes/medical.yml | 2 +- .../Prototypes/Recipes/Lathes/security.yml | 541 +- .../Prototypes/Recipes/Reactions/drinks.yml | 64 + .../Prototypes/Recipes/Reactions/medicine.yml | 68 +- .../Recipes/Reactions/pyrotechnic.yml | 2 +- Resources/Prototypes/Research/arsenal.yml | 32 +- .../Prototypes/Research/civilianservices.yml | 6 +- .../Prototypes/Research/experimental.yml | 5 +- Resources/Prototypes/Research/industrial.yml | 4 +- Resources/Prototypes/Roles/Antags/nukeops.yml | 6 +- .../Prototypes/Roles/Antags/terminator.yml | 6 - .../Prototypes/Roles/Ghostroles/syndicate.yml | 27 + .../Roles/Jobs/Fun/misc_startinggear.yml | 11 +- Resources/Prototypes/Shaders/displacement.yml | 10 + .../Shuttles/shuttle_incoming_event.yml | 29 + .../SimpleStation14/Traits/disabilities.yml | 12 - Resources/Prototypes/SimpleStation14/tags.yml | 2 - .../SoundCollections/expeditions.yml | 5 + .../Prototypes/SoundCollections/footsteps.yml | 10 + Resources/Prototypes/SoundCollections/fox.yml | 18 + Resources/Prototypes/Species/terminator.yml | 110 - Resources/Prototypes/Species/vox.yml | 87 +- .../Prototypes/Stacks/Materials/materials.yml | 8 + .../Prototypes/Stacks/consumable_stacks.yml | 16 + Resources/Prototypes/StatusEffects/health.yml | 4 +- Resources/Prototypes/Store/categories.yml | 36 + Resources/Prototypes/Store/currency.yml | 9 +- Resources/Prototypes/Store/presets.yml | 12 + .../Prototypes/Traits/Misc/singer_types.yml | 8 +- Resources/Prototypes/Traits/disabilities.yml | 14 + Resources/Prototypes/Traits/neutral.yml | 10 +- Resources/Prototypes/Traits/physical.yml | 24 +- Resources/Prototypes/Voice/disease_emotes.yml | 38 +- .../Prototypes/Voice/speech_emote_sounds.yml | 40 +- Resources/Prototypes/Voice/speech_emotes.yml | 206 +- Resources/Prototypes/Voice/speech_sounds.yml | 18 + Resources/Prototypes/Voice/tail_emotes.yml | 3 +- .../XenoArch/Effects/normal_effects.yml | 2 +- .../XenoArch/Effects/utility_effects.yml | 4 +- Resources/Prototypes/floor_trap.yml | 116 + Resources/Prototypes/lobbyscreens.yml | 4 + .../Prototypes/name_identifier_groups.yml | 6 + Resources/Prototypes/tags.yml | 26 +- Resources/Prototypes/themes.yml | 14 + .../Guidebook/Antagonist/Antagonists.xml | 1 + .../Guidebook/Antagonist/Revolutionaries.xml | 4 +- .../Guidebook/Antagonist/SpaceNinja.xml | 94 +- .../ServerInfo/Guidebook/Engineering/AME.xml | 33 +- .../Engineering/AccessConfigurator.xml | 44 +- .../Guidebook/Engineering/AirlockSecurity.xml | 130 +- .../Guidebook/Engineering/Atmospherics.xml | 124 +- .../Guidebook/Engineering/Construction.xml | 12 +- .../Guidebook/Engineering/Engineering.xml | 33 +- .../Guidebook/Engineering/Fires.xml | 22 +- .../Engineering/NetworkConfigurator.xml | 57 +- .../Guidebook/Engineering/Networking.xml | 37 +- .../Engineering/PortableGenerator.xml | 15 +- .../Guidebook/Engineering/Power.xml | 100 +- .../ServerInfo/Guidebook/Engineering/RTG.xml | 29 +- .../Guidebook/Engineering/Shuttlecraft.xml | 63 +- .../Guidebook/Engineering/Singularity.xml | 246 +- .../ServerInfo/Guidebook/Engineering/TEG.xml | 75 +- .../Guidebook/Medical/Cryogenics.xml | 2 +- .../ServerInfo/Guidebook/Mobs/SlimePerson.xml | 16 +- .../Guidebook/Science/ArtifactReports.xml | 29 +- .../Guidebook/Science/Xenoarchaeology.xml | 39 +- .../Guidebook/Security/Forensics.xml | 4 +- .../Guidebook/Service/Bartender.xml | 1 + .../Eyes/Hud/syndagent.rsi/equipped-EYES.png | Bin 0 -> 5126 bytes .../Clothing/Eyes/Hud/syndagent.rsi/icon.png | Bin 0 -> 5331 bytes .../Eyes/Hud/syndagent.rsi/inhand-left.png | Bin 0 -> 4629 bytes .../Eyes/Hud/syndagent.rsi/inhand-right.png | Bin 0 -> 4636 bytes .../Clothing/Eyes/Hud/syndagent.rsi/meta.json | 26 + .../Hands/Gloves/combat.rsi/equipped-HAND.png | Bin 0 -> 441 bytes .../Clothing/Hands/Gloves/combat.rsi/icon.png | Bin 0 -> 591 bytes .../Hands/Gloves/combat.rsi/inhand-left.png | Bin 0 -> 564 bytes .../Hands/Gloves/combat.rsi/inhand-right.png | Bin 0 -> 567 bytes .../Hands/Gloves/combat.rsi/meta.json | 26 + .../black.rsi/equipped-HELMET-vox.png | Bin 0 -> 568 bytes .../Bandanas/black.rsi/equipped-MASK-vox.png | Bin 0 -> 528 bytes .../Head/Bandanas/black.rsi/meta.json | 10 +- .../Bandanas/blue.rsi/equipped-HELMET-vox.png | Bin 0 -> 578 bytes .../Bandanas/blue.rsi/equipped-MASK-vox.png | Bin 0 -> 552 bytes .../Clothing/Head/Bandanas/blue.rsi/meta.json | 10 +- .../botany.rsi/equipped-HELMET-vox.png | Bin 0 -> 725 bytes .../Bandanas/botany.rsi/equipped-MASK-vox.png | Bin 0 -> 629 bytes .../Head/Bandanas/botany.rsi/meta.json | 8 +- .../Bandanas/gold.rsi/equipped-HELMET-vox.png | Bin 0 -> 559 bytes .../Bandanas/gold.rsi/equipped-MASK-vox.png | Bin 0 -> 565 bytes .../Clothing/Head/Bandanas/gold.rsi/meta.json | 10 +- .../green.rsi/equipped-HELMET-vox.png | Bin 0 -> 545 bytes .../Bandanas/green.rsi/equipped-MASK-vox.png | Bin 0 -> 558 bytes .../Head/Bandanas/green.rsi/meta.json | 10 +- .../Bandanas/grey.rsi/equipped-HELMET-vox.png | Bin 0 -> 635 bytes .../Bandanas/grey.rsi/equipped-MASK-vox.png | Bin 0 -> 591 bytes .../Clothing/Head/Bandanas/grey.rsi/meta.json | 10 +- .../Bandanas/red.rsi/equipped-HELMET-vox.png | Bin 0 -> 531 bytes .../Bandanas/red.rsi/equipped-MASK-vox.png | Bin 0 -> 545 bytes .../Clothing/Head/Bandanas/red.rsi/meta.json | 10 +- .../skull.rsi/equipped-HELMET-vox.png | Bin 0 -> 382 bytes .../Bandanas/skull.rsi/equipped-MASK-vox.png | Bin 0 -> 639 bytes .../Head/Bandanas/skull.rsi/meta.json | 10 +- .../ERThelmets/ertengineer.rsi/meta.json | 14 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 517 bytes .../ertengineer.rsi/off-inhand-left.png | Bin 933 -> 0 bytes .../ertengineer.rsi/off-inhand-right.png | Bin 873 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1539 bytes .../ertengineer.rsi/on-inhand-left.png | Bin 1512 -> 0 bytes .../ertengineer.rsi/on-inhand-right.png | Bin 1576 -> 0 bytes .../ERThelmets/ertjanitor.rsi/meta.json | 14 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 517 bytes .../ertjanitor.rsi/off-inhand-left.png | Bin 941 -> 0 bytes .../ertjanitor.rsi/off-inhand-right.png | Bin 912 -> 0 bytes .../ertjanitor.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1515 bytes .../ertjanitor.rsi/on-inhand-left.png | Bin 1555 -> 0 bytes .../ertjanitor.rsi/on-inhand-right.png | Bin 1584 -> 0 bytes .../ERThelmets/ertleader.rsi/meta.json | 14 +- .../ertleader.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 549 bytes .../ertleader.rsi/off-inhand-left.png | Bin 1006 -> 0 bytes .../ertleader.rsi/off-inhand-right.png | Bin 993 -> 0 bytes .../ertleader.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1515 bytes .../ertleader.rsi/on-inhand-left.png | Bin 1318 -> 0 bytes .../ertleader.rsi/on-inhand-right.png | Bin 1334 -> 0 bytes .../ERThelmets/ertmedical.rsi/meta.json | 14 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 520 bytes .../ertmedical.rsi/off-inhand-left.png | Bin 913 -> 0 bytes .../ertmedical.rsi/off-inhand-right.png | Bin 849 -> 0 bytes .../ertmedical.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1516 bytes .../ertmedical.rsi/on-equipped-HELMET.png | Bin 1760 -> 1562 bytes .../ertmedical.rsi/on-inhand-left.png | Bin 1522 -> 0 bytes .../ertmedical.rsi/on-inhand-right.png | Bin 1565 -> 0 bytes .../ERThelmets/ertsecurity.rsi/meta.json | 14 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 518 bytes .../ertsecurity.rsi/off-inhand-left.png | Bin 893 -> 0 bytes .../ertsecurity.rsi/off-inhand-right.png | Bin 849 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1512 bytes .../ertsecurity.rsi/on-inhand-left.png | Bin 1480 -> 0 bytes .../ertsecurity.rsi/on-inhand-right.png | Bin 1545 -> 0 bytes .../equipped-head-light-vox.png | Bin 0 -> 1266 bytes .../equipped-head-unshaded-vox.png | Bin 0 -> 234 bytes .../atmospherics.rsi/equipped-head-vox.png | Bin 0 -> 520 bytes .../atmospherics.rsi/inhand-left-light.png | Bin 7029 -> 0 bytes .../atmospherics.rsi/inhand-left-unshaded.png | Bin 5169 -> 0 bytes .../atmospherics.rsi/inhand-left.png | Bin 919 -> 0 bytes .../atmospherics.rsi/inhand-right-light.png | Bin 7309 -> 0 bytes .../inhand-right-unshaded.png | Bin 5960 -> 0 bytes .../atmospherics.rsi/inhand-right.png | Bin 994 -> 0 bytes .../Head/Hardsuits/atmospherics.rsi/meta.json | 22 +- .../Head/Hardsuits/capspace.rsi/meta.json | 14 +- .../capspace.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 1153 bytes .../capspace.rsi/off-inhand-left.png | Bin 858 -> 0 bytes .../capspace.rsi/off-inhand-right.png | Bin 882 -> 0 bytes .../capspace.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1393 bytes .../Hardsuits/capspace.rsi/on-inhand-left.png | Bin 1457 -> 0 bytes .../capspace.rsi/on-inhand-right.png | Bin 1486 -> 0 bytes .../cburn.rsi/equipped-head-unshaded-vox.png | Bin 0 -> 214 bytes .../Hardsuits/cburn.rsi/equipped-head-vox.png | Bin 0 -> 453 bytes .../cburn.rsi/inhand-left-unshaded.png | Bin 465 -> 0 bytes .../Head/Hardsuits/cburn.rsi/inhand-left.png | Bin 519 -> 0 bytes .../cburn.rsi/inhand-right-unshaded.png | Bin 415 -> 0 bytes .../Head/Hardsuits/cburn.rsi/inhand-right.png | Bin 527 -> 0 bytes .../Head/Hardsuits/cburn.rsi/meta.json | 14 +- .../Head/Hardsuits/clown.rsi/meta.json | 10 +- .../clown.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 7418 bytes .../clown.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 8100 bytes .../cybersun.rsi/equipped-HELMET-vox.png | Bin 0 -> 416 bytes .../Hardsuits/cybersun.rsi/inhand-left.png | Bin 427 -> 0 bytes .../Hardsuits/cybersun.rsi/inhand-right.png | Bin 421 -> 0 bytes .../Head/Hardsuits/cybersun.rsi/meta.json | 12 +- .../deathsquad.rsi/equipped-HELMET-vox.png | Bin 0 -> 1226 bytes .../Hardsuits/deathsquad.rsi/inhand-left.png | Bin 1045 -> 0 bytes .../Hardsuits/deathsquad.rsi/inhand-right.png | Bin 1057 -> 0 bytes .../Head/Hardsuits/deathsquad.rsi/meta.json | 10 +- .../Hardsuits/engineering-white.rsi/meta.json | 32 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 543 bytes .../engineering-white.rsi/off-inhand-left.png | Bin 879 -> 0 bytes .../off-inhand-right.png | Bin 912 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1430 bytes .../engineering-white.rsi/on-inhand-left.png | Bin 1241 -> 0 bytes .../engineering-white.rsi/on-inhand-right.png | Bin 1224 -> 0 bytes .../Head/Hardsuits/engineering.rsi/meta.json | 16 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 544 bytes .../engineering.rsi/off-inhand-left.png | Bin 858 -> 0 bytes .../engineering.rsi/off-inhand-right.png | Bin 918 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1414 bytes .../engineering.rsi/on-inhand-left.png | Bin 1223 -> 0 bytes .../engineering.rsi/on-inhand-right.png | Bin 1296 -> 0 bytes .../Head/Hardsuits/luxury.rsi/meta.json | 14 +- .../luxury.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 2178 bytes .../Hardsuits/luxury.rsi/off-inhand-left.png | Bin 8656 -> 0 bytes .../Hardsuits/luxury.rsi/off-inhand-right.png | Bin 8912 -> 0 bytes .../luxury.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 2824 bytes .../Hardsuits/luxury.rsi/on-inhand-left.png | Bin 8910 -> 0 bytes .../Hardsuits/luxury.rsi/on-inhand-right.png | Bin 8566 -> 0 bytes .../maxim.rsi/equipped-HELMET-vox.png | Bin 0 -> 643 bytes .../Head/Hardsuits/maxim.rsi/inhand-left.png | Bin 499 -> 0 bytes .../Head/Hardsuits/maxim.rsi/inhand-right.png | Bin 677 -> 0 bytes .../Head/Hardsuits/maxim.rsi/meta.json | 8 +- .../Head/Hardsuits/medical.rsi/meta.json | 24 +- .../medical.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 1124 bytes .../Hardsuits/medical.rsi/off-inhand-left.png | Bin 813 -> 0 bytes .../medical.rsi/off-inhand-right.png | Bin 870 -> 0 bytes .../medical.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1238 bytes .../Hardsuits/medical.rsi/on-inhand-left.png | Bin 995 -> 0 bytes .../Hardsuits/medical.rsi/on-inhand-right.png | Bin 988 -> 0 bytes .../equipped-HELMET-vox.png | Bin 0 -> 4235 bytes .../Hardsuits/piratecaptainhelm.rsi/meta.json | 6 +- .../pirateeva.rsi/equipped-HELMET-vox.png | Bin 0 -> 3860 bytes .../Head/Hardsuits/pirateeva.rsi/meta.json | 6 +- .../Clothing/Head/Hardsuits/rd.rsi/meta.json | 22 +- .../rd.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 507 bytes .../Head/Hardsuits/rd.rsi/off-inhand-left.png | Bin 834 -> 0 bytes .../Hardsuits/rd.rsi/off-inhand-right.png | Bin 890 -> 0 bytes .../rd.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1299 bytes .../Head/Hardsuits/rd.rsi/on-inhand-left.png | Bin 1076 -> 0 bytes .../Head/Hardsuits/rd.rsi/on-inhand-right.png | Bin 1124 -> 0 bytes .../Head/Hardsuits/salvage.rsi/meta.json | 22 +- .../salvage.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 1052 bytes .../Hardsuits/salvage.rsi/off-inhand-left.png | Bin 967 -> 0 bytes .../salvage.rsi/off-inhand-right.png | Bin 983 -> 0 bytes .../salvage.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1245 bytes .../Hardsuits/salvage.rsi/on-inhand-left.png | Bin 1228 -> 0 bytes .../Hardsuits/salvage.rsi/on-inhand-right.png | Bin 1222 -> 0 bytes .../santahelm.rsi/equipped-HELMET-vox.png | Bin 0 -> 662 bytes .../Hardsuits/santahelm.rsi/inhand-left.png | Bin 934 -> 0 bytes .../Hardsuits/santahelm.rsi/inhand-right.png | Bin 970 -> 0 bytes .../Head/Hardsuits/santahelm.rsi/meta.json | 8 +- .../Head/Hardsuits/security-red.rsi/meta.json | 22 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 1099 bytes .../security-red.rsi/off-inhand-left.png | Bin 916 -> 0 bytes .../security-red.rsi/off-inhand-right.png | Bin 945 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1515 bytes .../security-red.rsi/on-inhand-left.png | Bin 1162 -> 0 bytes .../security-red.rsi/on-inhand-right.png | Bin 1219 -> 0 bytes .../Hardsuits/security-warden.rsi/meta.json | 10 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 510 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 536 bytes .../Head/Hardsuits/security.rsi/meta.json | 22 +- .../security.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 485 bytes .../security.rsi/off-inhand-left.png | Bin 746 -> 0 bytes .../security.rsi/off-inhand-right.png | Bin 792 -> 0 bytes .../security.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 519 bytes .../Hardsuits/security.rsi/on-inhand-left.png | Bin 903 -> 0 bytes .../security.rsi/on-inhand-right.png | Bin 953 -> 0 bytes .../equipped-head-light-vox.png | Bin 0 -> 1298 bytes .../equipped-head-unshaded-vox.png | Bin 0 -> 177 bytes .../spatiohelm.rsi/equipped-head-vox.png | Bin 0 -> 513 bytes .../spatiohelm.rsi/inhand-left-light.png | Bin 1125 -> 0 bytes .../spatiohelm.rsi/inhand-left-unshaded.png | Bin 122 -> 0 bytes .../Hardsuits/spatiohelm.rsi/inhand-left.png | Bin 717 -> 0 bytes .../spatiohelm.rsi/inhand-right-light.png | Bin 1258 -> 0 bytes .../spatiohelm.rsi/inhand-right-unshaded.png | Bin 177 -> 0 bytes .../Hardsuits/spatiohelm.rsi/inhand-right.png | Bin 758 -> 0 bytes .../Head/Hardsuits/spatiohelm.rsi/meta.json | 24 +- .../Head/Hardsuits/syndicate.rsi/meta.json | 14 +- .../syndicate.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 495 bytes .../syndicate.rsi/off-inhand-left.png | Bin 891 -> 0 bytes .../syndicate.rsi/off-inhand-right.png | Bin 838 -> 0 bytes .../syndicate.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1344 bytes .../syndicate.rsi/on-inhand-left.png | Bin 1398 -> 0 bytes .../syndicate.rsi/on-inhand-right.png | Bin 1389 -> 0 bytes .../Hardsuits/syndiecommander.rsi/meta.json | 16 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 513 bytes .../syndiecommander.rsi/off-inhand-left.png | Bin 934 -> 0 bytes .../syndiecommander.rsi/off-inhand-right.png | Bin 891 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1185 bytes .../syndiecommander.rsi/on-inhand-left.png | Bin 1427 -> 0 bytes .../syndiecommander.rsi/on-inhand-right.png | Bin 1445 -> 0 bytes .../Head/Hardsuits/syndieelite.rsi/meta.json | 69 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 527 bytes .../syndieelite.rsi/off-inhand-left.png | Bin 672 -> 0 bytes .../syndieelite.rsi/off-inhand-right.png | Bin 648 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1500 bytes .../syndieelite.rsi/on-inhand-left.png | Bin 1677 -> 0 bytes .../syndieelite.rsi/on-inhand-right.png | Bin 1689 -> 0 bytes .../Head/Hardsuits/syndiemedic.rsi/meta.json | 14 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 504 bytes .../syndiemedic.rsi/off-inhand-left.png | Bin 912 -> 0 bytes .../syndiemedic.rsi/off-inhand-right.png | Bin 856 -> 0 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1345 bytes .../syndiemedic.rsi/on-inhand-left.png | Bin 1325 -> 0 bytes .../syndiemedic.rsi/on-inhand-right.png | Bin 1311 -> 0 bytes .../Head/Hardsuits/wizard.rsi/meta.json | 22 +- .../wizard.rsi/off-equipped-HELMET-vox.png | Bin 0 -> 601 bytes .../Hardsuits/wizard.rsi/off-inhand-left.png | Bin 917 -> 0 bytes .../Hardsuits/wizard.rsi/off-inhand-right.png | Bin 1003 -> 0 bytes .../wizard.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 1524 bytes .../Hardsuits/wizard.rsi/on-inhand-left.png | Bin 1212 -> 0 bytes .../Hardsuits/wizard.rsi/on-inhand-right.png | Bin 1308 -> 0 bytes .../gladiator.rsi/equipped-HELMET-vox.png | Bin 0 -> 1863 bytes .../Head/Hats/gladiator.rsi/meta.json | 8 +- .../Hats/paper.rsi/equipped-HELMET-vox.png | Bin 0 -> 431 bytes .../Clothing/Head/Hats/paper.rsi/meta.json | 6 +- .../surgcap_blue.rsi/equipped-HELMET-vox.png | Bin 0 -> 524 bytes .../Head/Hats/surgcap_blue.rsi/meta.json | 6 +- .../surgcap_green.rsi/equipped-HELMET-vox.png | Bin 0 -> 529 bytes .../Head/Hats/surgcap_green.rsi/meta.json | 6 +- .../equipped-HELMET-vox.png | Bin 0 -> 537 bytes .../Head/Hats/surgcap_purple.rsi/meta.json | 6 +- .../Helmets/atmos_firehelmet.rsi/meta.json | 90 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 1165 bytes .../on-equipped-HELMET-vox.png | Bin 0 -> 1185 bytes .../bombsuit.rsi/equipped-HELMET-vox.png | Bin 0 -> 826 bytes .../Head/Helmets/bombsuit.rsi/meta.json | 6 +- .../Helmets/eva.rsi/equipped-HELMET-vox.png | Bin 0 -> 1510 bytes .../Clothing/Head/Helmets/eva.rsi/meta.json | 4 + .../eva_large.rsi/equipped-HELMET-vox.png | Bin 0 -> 1544 bytes .../Helmets/eva_large.rsi/equipped-HELMET.png | Bin 1394 -> 1376 bytes .../Head/Helmets/eva_large.rsi/meta.json | 4 + .../eva_syndicate.rsi/equipped-HELMET-vox.png | Bin 0 -> 1579 bytes .../Head/Helmets/eva_syndicate.rsi/meta.json | 4 + .../Head/Helmets/firehelmet.rsi/meta.json | 10 +- .../off-equipped-HELMET-vox.png | Bin 0 -> 564 bytes .../firehelmet.rsi/on-equipped-HELMET-vox.png | Bin 0 -> 574 bytes .../ihvoid.rsi/equipped-HELMET-vox.png | Bin 0 -> 825 bytes .../Head/Helmets/ihvoid.rsi/meta.json | 6 +- .../light_riot.rsi/equipped-HELMET-vox.png | Bin 0 -> 924 bytes .../Head/Helmets/light_riot.rsi/meta.json | 6 +- .../security.rsi/equipped-HELMET-vox.png | Bin 0 -> 956 bytes .../Head/Helmets/security.rsi/meta.json | 6 +- .../spaceninja.rsi/equipped-HELMET-vox.png | Bin 0 -> 445 bytes .../Head/Helmets/spaceninja.rsi/meta.json | 6 +- .../Helmets/swat.rsi/equipped-HELMET-vox.png | Bin 0 -> 727 bytes .../Clothing/Head/Helmets/swat.rsi/meta.json | 6 +- .../equipped-HELMET-vox.png | Bin 0 -> 847 bytes .../Head/Helmets/swat_syndicate.rsi/meta.json | 6 +- .../templar.rsi/equipped-HELMET-vox.png | Bin 0 -> 1436 bytes .../Head/Helmets/templar.rsi/meta.json | 6 +- .../wizardhelm.rsi/equipped-HELMET-vox.png | Bin 0 -> 916 bytes .../Head/Helmets/wizardhelm.rsi/meta.json | 6 +- .../Hoods/Bio/bio.rsi/equipped-HELMET-vox.png | Bin 0 -> 933 bytes .../Clothing/Head/Hoods/Bio/bio.rsi/meta.json | 6 +- .../Hoods/Bio/cmo.rsi/equipped-HELMET-vox.png | Bin 0 -> 880 bytes .../Clothing/Head/Hoods/Bio/cmo.rsi/meta.json | 60 +- .../Bio/general.rsi/equipped-HELMET-vox.png | Bin 0 -> 933 bytes .../Head/Hoods/Bio/general.rsi/meta.json | 60 +- .../Bio/janitor.rsi/equipped-HELMET-vox.png | Bin 0 -> 855 bytes .../Head/Hoods/Bio/janitor.rsi/meta.json | 60 +- .../Bio/scientist.rsi/equipped-HELMET-vox.png | Bin 0 -> 1136 bytes .../Head/Hoods/Bio/scientist.rsi/meta.json | 60 +- .../Bio/security.rsi/equipped-HELMET-vox.png | Bin 0 -> 928 bytes .../Head/Hoods/Bio/security.rsi/meta.json | 60 +- .../Bio/virology.rsi/equipped-HELMET-vox.png | Bin 0 -> 920 bytes .../Head/Hoods/Bio/virology.rsi/meta.json | 60 +- .../chickenhead.rsi/equipped-HELMET-vox.png | Bin 0 -> 536 bytes .../Head/Misc/chickenhead.rsi/meta.json | 6 +- .../equipped-HELMET-vox.png | Bin 0 -> 578 bytes .../blue_flame_welding_mask.rsi/meta.json | 10 +- .../up-equipped-HELMET-vox.png | Bin 0 -> 1090 bytes .../equipped-HELMET-vox.png | Bin 0 -> 565 bytes .../Welding/flame_welding_mask.rsi/meta.json | 10 +- .../up-equipped-HELMET-vox.png | Bin 0 -> 1080 bytes .../up-equipped-HELMET.png | Bin 1037 -> 1078 bytes .../equipped-HELMET-vox.png | Bin 0 -> 513 bytes .../Head/Welding/paintedwelding.rsi/meta.json | 10 +- .../up-equipped-HELMET-vox.png | Bin 0 -> 897 bytes .../welding.rsi/equipped-HELMET-vox.png | Bin 0 -> 947 bytes .../Head/Welding/welding.rsi/meta.json | 10 +- .../welding.rsi/up-equipped-HELMET-vox.png | Bin 0 -> 1043 bytes .../Mask/bee.rsi/equipped-MASK-vox.png | Bin 0 -> 814 bytes .../Textures/Clothing/Mask/bee.rsi/meta.json | 6 +- .../Clothing/Mask/breath.rsi/meta.json | 14 +- .../Mask/breath.rsi/up-equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Mask/clown.rsi/equipped-MASK-vox.png | Bin 0 -> 729 bytes .../Clothing/Mask/clown.rsi/meta.json | 6 +- .../Mask/gas.rsi/equipped-MASK-vox.png | Bin 0 -> 672 bytes .../Textures/Clothing/Mask/gas.rsi/meta.json | 6 +- .../Mask/gasatmos.rsi/equipped-MASK-vox.png | Bin 0 -> 621 bytes .../Clothing/Mask/gasatmos.rsi/meta.json | 6 +- .../Mask/gascaptain.rsi/equipped-MASK-vox.png | Bin 0 -> 634 bytes .../Clothing/Mask/gascaptain.rsi/meta.json | 6 +- .../gasexplorer.rsi/equipped-MASK-vox.png | Bin 0 -> 957 bytes .../Clothing/Mask/gasexplorer.rsi/meta.json | 76 +- .../gassecurity.rsi/equipped-MASK-vox.png | Bin 0 -> 585 bytes .../Clothing/Mask/gassecurity.rsi/meta.json | 18 +- .../gassecurity.rsi/up-equipped-MASK-vox.png | Bin 0 -> 588 bytes .../gassyndicate.rsi/equipped-MASK-vox.png | Bin 0 -> 633 bytes .../Clothing/Mask/gassyndicate.rsi/meta.json | 12 +- .../equipped-MASK-vox.png | Bin 0 -> 301 bytes .../Mask/italian_moustache.rsi/meta.json | 6 +- .../Mask/medical.rsi/equipped-MASK-vox.png | Bin 0 -> 500 bytes .../Clothing/Mask/medical.rsi/meta.json | 10 +- .../Mask/medical.rsi/up-equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Mask/mime.rsi/equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Textures/Clothing/Mask/mime.rsi/meta.json | 6 +- .../Mask/muzzle.rsi/equipped-MASK-vox.png | Bin 0 -> 530 bytes .../Clothing/Mask/muzzle.rsi/meta.json | 6 +- .../Mask/ninja.rsi/equipped-MASK-vox.png | Bin 0 -> 552 bytes .../Clothing/Mask/ninja.rsi/meta.json | 6 +- .../equipped-MASK-vox.png | Bin 0 -> 893 bytes .../Mask/plaguedoctormask.rsi/meta.json | 64 +- .../Mask/sexyclown.rsi/equipped-MASK-vox.png | Bin 0 -> 992 bytes .../Clothing/Mask/sexyclown.rsi/meta.json | 6 +- .../Mask/sexymime.rsi/equipped-MASK-vox.png | Bin 0 -> 598 bytes .../Clothing/Mask/sexymime.rsi/meta.json | 6 +- .../Mask/sterile.rsi/equipped-MASK-vox.png | Bin 0 -> 478 bytes .../Clothing/Mask/sterile.rsi/meta.json | 18 +- .../Mask/sterile.rsi/up-equipped-MASK-vox.png | Bin 0 -> 553 bytes .../Mask/swat.rsi/equipped-MASK-vox.png | Bin 0 -> 885 bytes .../Textures/Clothing/Mask/swat.rsi/meta.json | 14 +- .../welding-gas.rsi/equipped-MASK-vox.png | Bin 0 -> 693 bytes .../Mask/welding-gas.rsi/equipped-MASK.png | Bin 0 -> 599 bytes .../Clothing/Mask/welding-gas.rsi/icon-up.png | Bin 0 -> 457 bytes .../Clothing/Mask/welding-gas.rsi/icon.png | Bin 0 -> 480 bytes .../Mask/welding-gas.rsi/inhand-left.png | Bin 0 -> 553 bytes .../Mask/welding-gas.rsi/inhand-right.png | Bin 0 -> 550 bytes .../Clothing/Mask/welding-gas.rsi/meta.json | 49 + .../welding-gas.rsi/up-equipped-MASK-vox.png | Bin 0 -> 624 bytes .../Mask/welding-gas.rsi/up-equipped-MASK.png | Bin 0 -> 539 bytes .../Mask/welding-gas.rsi/up-inhand-left.png | Bin 0 -> 461 bytes .../Mask/welding-gas.rsi/up-inhand-right.png | Bin 0 -> 474 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 978 bytes .../Armor/armor_reflec.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 524 bytes .../Armor/bulletproof.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 541 bytes .../Armor/captain_carapace.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 828 bytes .../Armor/cult_armour.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3210 bytes .../Armor/heavygreen.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3161 bytes .../Armor/heavyred.rsi/meta.json | 6 +- .../riot.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 797 bytes .../OuterClothing/Armor/riot.rsi/meta.json | 52 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 465 bytes .../Armor/security.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 400 bytes .../Armor/security_slim.rsi/meta.json | 52 +- .../cmo.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3106 bytes .../OuterClothing/Bio/cmo.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2834 bytes .../OuterClothing/Bio/general.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3141 bytes .../OuterClothing/Bio/janitor.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2771 bytes .../OuterClothing/Bio/scientist.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3236 bytes .../OuterClothing/Bio/security.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2945 bytes .../OuterClothing/Bio/virology.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1274 bytes .../Coats/expensive_coat.rsi/meta.json | 4 + .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 637 bytes .../Coats/hos_trenchcoat.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1202 bytes .../Coats/jensencoat.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 671 bytes .../OuterClothing/Coats/labcoat.rsi/meta.json | 8 + .../open-equipped-OUTERCLOTHING-vox.png | Bin 0 -> 672 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../Coats/labcoat_chem.rsi/meta.json | 8 + .../open-equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 661 bytes .../Coats/labcoat_cmo.rsi/meta.json | 8 + .../open-equipped-OUTERCLOTHING-vox.png | Bin 0 -> 658 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../Coats/labcoat_gene.rsi/meta.json | 8 + .../open-equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../Coats/labcoat_viro.rsi/meta.json | 8 + .../open-equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../pirate.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1244 bytes .../OuterClothing/Coats/pirate.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../OuterClothing/Coats/rndcoat.rsi/meta.json | 8 + .../open-equipped-OUTERCLOTHING-vox.png | Bin 0 -> 699 bytes .../warden.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1780 bytes .../OuterClothing/Coats/warden.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1819 bytes .../ERTSuits/ertengineer.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1841 bytes .../ERTSuits/ertjanitor.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1825 bytes .../ERTSuits/ertleader.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1816 bytes .../ERTSuits/ertmedical.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1778 bytes .../ERTSuits/ertsecurity.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2148 bytes .../Hardsuits/atmospherics.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 959 bytes .../Hardsuits/capspace.rsi/meta.json | 6 +- .../cburn.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2467 bytes .../Hardsuits/cburn.rsi/meta.json | 2 +- .../clown.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 8131 bytes .../Hardsuits/clown.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2312 bytes .../Hardsuits/cybersun.rsi/meta.json | 64 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2187 bytes .../Hardsuits/deathsquad.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2462 bytes .../Hardsuits/engineering-white.rsi/meta.json | 20 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2149 bytes .../Hardsuits/engineering.rsi/meta.json | 6 +- .../luxury.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3694 bytes .../Hardsuits/luxury.rsi/meta.json | 20 +- .../maxim.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2319 bytes .../Hardsuits/maxim.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2089 bytes .../Hardsuits/medical.rsi/meta.json | 20 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 3416 bytes .../Hardsuits/paramed.rsi/meta.json | 64 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 6680 bytes .../Hardsuits/piratecaptain.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 5539 bytes .../Hardsuits/pirateeva.rsi/meta.json | 6 +- .../rd.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2141 bytes .../OuterClothing/Hardsuits/rd.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2071 bytes .../Hardsuits/salvage.rsi/meta.json | 20 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2289 bytes .../Hardsuits/santahardsuit.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1933 bytes .../Hardsuits/security-red.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2131 bytes .../Hardsuits/security-warden.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2094 bytes .../Hardsuits/security.rsi/meta.json | 6 +- .../spatio.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2227 bytes .../Hardsuits/spatio.rsi/meta.json | 66 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2278 bytes .../Hardsuits/syndicate.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2302 bytes .../Hardsuits/syndiecommander.rsi/meta.json | 64 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2132 bytes .../Hardsuits/syndieelite.rsi/meta.json | 60 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2503 bytes .../Hardsuits/syndiemedic.rsi/meta.json | 20 +- .../wizard.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2157 bytes .../Hardsuits/wizard.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 645 bytes .../Misc/apronbotanist.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 534 bytes .../Misc/apronchef.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 581 bytes .../OuterClothing/Misc/cardborg.rsi/meta.json | 6 +- .../chef.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1498 bytes .../OuterClothing/Misc/chef.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 839 bytes .../Misc/classicponcho.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 584 bytes .../Misc/ghostsheet.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1169 bytes .../Misc/grey_hoodie.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1558 bytes .../OuterClothing/Misc/nunrobe.rsi/meta.json | 56 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 977 bytes .../Misc/red_racoon.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 672 bytes .../Misc/redwizard.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 444 bytes .../OuterClothing/Misc/skubbody.rsi/meta.json | 6 +- .../body-overlay-2-vox.png | Bin 0 -> 882 bytes .../Misc/straight_jacket.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 905 bytes .../Misc/violetwizard.rsi/meta.json | 6 +- .../wizard.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 683 bytes .../OuterClothing/Misc/wizard.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 841 bytes .../Suits/bombsuit.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1354 bytes .../OuterClothing/Suits/chicken.rsi/meta.json | 6 +- .../eva.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2033 bytes .../OuterClothing/Suits/eva.rsi/meta.json | 4 + .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2013 bytes .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1938 bytes .../Suits/eva_prisoner.rsi/meta.json | 4 + .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1909 bytes .../Suits/eva_syndicate.rsi/meta.json | 4 + .../fire.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 2588 bytes .../OuterClothing/Suits/fire.rsi/meta.json | 2 +- .../monkey.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 745 bytes .../OuterClothing/Suits/monkey.rsi/meta.json | 6 +- .../rad.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 975 bytes .../OuterClothing/Suits/rad.rsi/meta.json | 2 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 475 bytes .../OuterClothing/Vests/detvest.rsi/meta.json | 6 +- .../hazard.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 486 bytes .../OuterClothing/Vests/hazard.rsi/meta.json | 6 +- .../vest.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 464 bytes .../OuterClothing/Vests/vest.rsi/meta.json | 6 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 615 bytes .../OuterClothing/Vests/webvest.rsi/meta.json | 6 +- .../coat.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1044 bytes .../WinterCoats/coat.rsi/meta.json | 56 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1355 bytes .../WinterCoats/coatatmos.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1358 bytes .../WinterCoats/coatbar.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 655 bytes .../WinterCoats/coatcap.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1376 bytes .../WinterCoats/coatcargo.rsi/meta.json | 54 +- .../coatce.rsi/equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1300 bytes .../WinterCoats/coatce.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1302 bytes .../WinterCoats/coatclown.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1321 bytes .../WinterCoats/coatengi.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING.png | Bin 0 -> 1928 bytes .../WinterCoats/coathosarmored.rsi/icon.png | Bin 0 -> 724 bytes .../coathosarmored.rsi/inhand-left.png | Bin 0 -> 624 bytes .../coathosarmored.rsi/inhand-right.png | Bin 0 -> 626 bytes .../WinterCoats/coathosarmored.rsi/meta.json | 26 + .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1323 bytes .../WinterCoats/coathydro.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1286 bytes .../WinterCoats/coatmed.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 964 bytes .../WinterCoats/coatmime.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1212 bytes .../WinterCoats/coatminer.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1169 bytes .../WinterCoats/coatparamed.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1210 bytes .../WinterCoats/coatsci.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1232 bytes .../WinterCoats/coatsec.rsi/meta.json | 54 +- .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 1930 bytes .../coatwarden.rsi/equipped-OUTERCLOTHING.png | Bin 1851 -> 772 bytes .../WinterCoats/coatwarden.rsi/icon.png | Bin 761 -> 324 bytes .../coatwarden.rsi/inhand-left.png | Bin 623 -> 493 bytes .../coatwarden.rsi/inhand-right.png | Bin 621 -> 484 bytes .../WinterCoats/coatwarden.rsi/meta.json | 56 +- .../equipped-OUTERCLOTHING.png | Bin 0 -> 1851 bytes .../coatwardenarmored.rsi/icon.png | Bin 0 -> 761 bytes .../coatwardenarmored.rsi/inhand-left.png | Bin 0 -> 623 bytes .../coatwardenarmored.rsi/inhand-right.png | Bin 0 -> 621 bytes .../coatwardenarmored.rsi/meta.json | 26 + .../Boots/jackboots.rsi/equipped-FEET-vox.png | Bin 0 -> 532 bytes .../Shoes/Boots/jackboots.rsi/meta.json | 6 +- .../equipped-FEET-vox.png | Bin 0 -> 457 bytes .../Boots/magboots-advanced.rsi/meta.json | 10 +- .../on-equipped-FEET-vox.png | Bin 0 -> 852 bytes .../equipped-FEET-vox.png | Bin 0 -> 922 bytes .../Boots/magboots-syndicate.rsi/meta.json | 10 +- .../on-equipped-FEET-vox.png | Bin 0 -> 921 bytes .../Boots/magboots.rsi/equipped-FEET-vox.png | Bin 0 -> 461 bytes .../Shoes/Boots/magboots.rsi/meta.json | 10 +- .../magboots.rsi/on-equipped-FEET-vox.png | Bin 0 -> 839 bytes .../Misc/slippers.rsi/equipped-FEET-vox.png | Bin 0 -> 553 bytes .../Shoes/Misc/slippers.rsi/meta.json | 6 +- .../Misc/tourist.rsi/equipped-FEET-vox.png | Bin 0 -> 553 bytes .../Clothing/Shoes/Misc/tourist.rsi/meta.json | 6 +- .../Specific/clown.rsi/equipped-FEET-vox.png | Bin 0 -> 539 bytes .../Shoes/Specific/clown.rsi/meta.json | 6 +- .../Specific/swat.rsi/equipped-FEET-vox.png | Bin 0 -> 532 bytes .../Shoes/Specific/swat.rsi/meta.json | 6 +- .../Specific/wizard.rsi/equipped-FEET-vox.png | Bin 0 -> 345 bytes .../Shoes/Specific/wizard.rsi/meta.json | 6 +- .../Under/Socks/coder.rsi/equipped-FEET.png | Bin 343 -> 310 bytes .../Clothing/Under/Socks/coder.rsi/meta.json | 2 +- .../olddress.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1263 bytes .../Uniforms/Jumpskirt/olddress.rsi/icon.png | Bin 0 -> 533 bytes .../Jumpskirt/olddress.rsi/inhand-left.png | Bin 0 -> 566 bytes .../Jumpskirt/olddress.rsi/inhand-right.png | Bin 0 -> 612 bytes .../Uniforms/Jumpskirt/olddress.rsi/meta.json | 26 + .../security.rsi/equipped-INNERCLOTHING.png | Bin 611 -> 636 bytes .../equipped-INNERCLOTHING.png | Bin 1316 -> 664 bytes .../Jumpskirt/senior_officer.rsi/icon.png | Bin 587 -> 376 bytes .../equipped-INNERCLOTHING-monkey.png | Bin 950 -> 864 bytes .../equipped-INNERCLOTHING.png | Bin 1310 -> 1215 bytes .../Jumpskirt/senior_physician.rsi/icon.png | Bin 538 -> 546 bytes .../senior_physician.rsi/inhand-left.png | Bin 619 -> 621 bytes .../senior_physician.rsi/inhand-right.png | Bin 610 -> 595 bytes .../security.rsi/equipped-INNERCLOTHING.png | Bin 1266 -> 663 bytes .../Uniforms/Jumpsuit/security.rsi/meta.json | 2 +- .../Jumpsuit/senior_officer.rsi/meta.json | 2 +- .../equipped-INNERCLOTHING-monkey.png | Bin 987 -> 929 bytes .../equipped-INNERCLOTHING.png | Bin 1240 -> 1198 bytes .../Jumpsuit/senior_physician.rsi/icon.png | Bin 482 -> 493 bytes .../senior_physician.rsi/inhand-left.png | Bin 619 -> 621 bytes .../senior_physician.rsi/inhand-right.png | Bin 610 -> 595 bytes .../Effects/creampie.rsi/creampie_vox.png | Bin 0 -> 585 bytes .../Textures/Effects/creampie.rsi/meta.json | 6 +- .../Alerts/deflecting.rsi/deflecting0.png | Bin 0 -> 1761 bytes .../Alerts/deflecting.rsi}/meta.json | 4 +- .../Interface/Ashen/item_status_left.png | Bin 0 -> 255 bytes .../Ashen/item_status_left_highlight.png | Bin 0 -> 195 bytes .../Interface/Ashen/item_status_right.png | Bin 0 -> 246 bytes .../Ashen/item_status_right_highlight.png | Bin 0 -> 189 bytes .../Interface/Ashen/template_small.png | Bin 0 -> 1282 bytes .../Interface/Clockwork/item_status_left.png | Bin 0 -> 371 bytes .../Clockwork/item_status_left_highlight.png | Bin 0 -> 307 bytes .../Interface/Clockwork/item_status_right.png | Bin 0 -> 389 bytes .../Clockwork/item_status_right_highlight.png | Bin 0 -> 326 bytes .../Interface/Default/item_status_left.png | Bin 0 -> 264 bytes .../Default/item_status_left_highlight.png | Bin 0 -> 251 bytes .../Interface/Default/item_status_right.png | Bin 0 -> 258 bytes .../Default/item_status_right_highlight.png | Bin 0 -> 237 bytes .../Interface/Emotes/attributions.yml | 117 + Resources/Textures/Interface/Emotes/beep.png | Bin 0 -> 584 bytes Resources/Textures/Interface/Emotes/buzz.png | Bin 0 -> 572 bytes .../Textures/Interface/Emotes/buzztwo.png | Bin 0 -> 595 bytes Resources/Textures/Interface/Emotes/chime.png | Bin 0 -> 380 bytes Resources/Textures/Interface/Emotes/chirp.png | Bin 0 -> 514 bytes .../Textures/Interface/Emotes/chitter.png | Bin 0 -> 478 bytes Resources/Textures/Interface/Emotes/clap.png | Bin 0 -> 628 bytes Resources/Textures/Interface/Emotes/click.png | Bin 0 -> 569 bytes Resources/Textures/Interface/Emotes/cough.png | Bin 0 -> 449 bytes Resources/Textures/Interface/Emotes/cry.png | Bin 0 -> 577 bytes .../Textures/Interface/Emotes/deathgasp.png | Bin 0 -> 536 bytes Resources/Textures/Interface/Emotes/honk.png | Bin 0 -> 600 bytes Resources/Textures/Interface/Emotes/laugh.png | Bin 0 -> 583 bytes Resources/Textures/Interface/Emotes/ping.png | Bin 0 -> 512 bytes .../Textures/Interface/Emotes/salute.png | Bin 0 -> 839 bytes Resources/Textures/Interface/Emotes/sigh.png | Bin 0 -> 449 bytes Resources/Textures/Interface/Emotes/snap.png | Bin 0 -> 1106 bytes .../Textures/Interface/Emotes/squeak.png | Bin 0 -> 342 bytes .../Textures/Interface/Emotes/squish.png | Bin 0 -> 602 bytes Resources/Textures/Interface/Emotes/vocal.png | Bin 0 -> 473 bytes Resources/Textures/Interface/Emotes/weh.png | Bin 0 -> 478 bytes .../Textures/Interface/Emotes/whistle.png | Bin 0 -> 910 bytes Resources/Textures/Interface/Emotes/yawn.png | Bin 0 -> 660 bytes .../Interface/Minimalist/SlotBackground.png | Bin 240 -> 266 bytes .../Interface/Minimalist/item_status_left.png | Bin 0 -> 208 bytes .../Minimalist/item_status_left_highlight.png | Bin 0 -> 277 bytes .../Minimalist/item_status_right.png | Bin 0 -> 198 bytes .../item_status_right_highlight.png | Bin 0 -> 249 bytes .../Interface/Minimalist/template_small.png | Bin 0 -> 266 bytes Resources/Textures/Interface/Nano/help.png | Bin 0 -> 636 bytes .../Interface/Nano/item_status_left.svg | 100 - .../Nano/item_status_left.svg.96dpi.png | Bin 459 -> 0 bytes .../Interface/Nano/item_status_middle.svg | 100 - .../Nano/item_status_middle.svg.96dpi.png | Bin 438 -> 0 bytes .../Interface/Nano/item_status_right.svg | 100 - .../Nano/item_status_right.svg.96dpi.png | Bin 409 -> 0 bytes .../Interface/Plasmafire/item_status_left.png | Bin 0 -> 271 bytes .../Plasmafire/item_status_left_highlight.png | Bin 0 -> 220 bytes .../Plasmafire/item_status_right.png | Bin 0 -> 271 bytes .../item_status_right_highlight.png | Bin 0 -> 206 bytes .../Interface/Retro/item_status_left.png | Bin 0 -> 249 bytes .../Retro/item_status_left_highlight.png | Bin 0 -> 235 bytes .../Interface/Retro/item_status_right.png | Bin 0 -> 239 bytes .../Retro/item_status_right_highlight.png | Bin 0 -> 253 bytes .../Interface/Retro/template_small.png | Bin 0 -> 96 bytes .../Interface/Slimecore/item_status_left.png | Bin 0 -> 280 bytes .../Slimecore/item_status_left_highlight.png | Bin 0 -> 219 bytes .../Interface/Slimecore/item_status_right.png | Bin 0 -> 267 bytes .../Slimecore/item_status_right_highlight.png | Bin 0 -> 206 bytes Resources/Textures/Interface/emotes.svg | 1 + .../Textures/Interface/emotes.svg.192dpi.png | Bin 0 -> 1818 bytes .../Interface/emotes.svg.192dpi.png.yml | 2 + .../Textures/LobbyScreens/attributions.yml | 5 + .../Textures/LobbyScreens/justaweekaway.webp | Bin 0 -> 309680 bytes .../Textures/LobbyScreens/justaweekaway.yml | 2 + .../Mobs/Customization/eyes.rsi/meta.json | 2 +- .../Customization/eyes.rsi/vox_eyes_s.png | Bin 125 -> 0 bytes .../Customization/human_hair.rsi/meta.json | 4 + .../human_hair.rsi/spookylong.png | Bin 0 -> 755 bytes .../reptilian_parts.rsi/frills_axolotl.png | Bin 412 -> 521 bytes .../reptilian_parts.rsi/frills_neckfull.png | Bin 0 -> 649 bytes .../reptilian_parts.rsi/meta.json | 862 +- .../snout_splotch_primary.png | Bin 0 -> 262 bytes .../snout_splotch_secondary.png | Bin 0 -> 230 bytes .../vox_facial_hair.rsi/beard_s.png | Bin 0 -> 273 bytes .../vox_facial_hair.rsi/colonel_s.png | Bin 0 -> 257 bytes .../vox_facial_hair.rsi/fu_s.png | Bin 0 -> 271 bytes .../vox_facial_hair.rsi/mane_s.png | Bin 0 -> 412 bytes .../vox_facial_hair.rsi/meta.json | 32 +- .../vox_facial_hair.rsi/neck_s.png | Bin 0 -> 302 bytes .../vox_facial_hair.rsi/vox_beard_s.png | Bin 159 -> 0 bytes .../vox_facial_hair.rsi/vox_colonel_s.png | Bin 150 -> 0 bytes .../vox_facial_hair.rsi/vox_fu_s.png | Bin 169 -> 0 bytes .../vox_facial_hair.rsi/vox_neck_s.png | Bin 186 -> 0 bytes .../vox_facial_hair.rsi/vox_ruff_beard_s.png | Bin 314 -> 0 bytes .../vox_facial_hair.rsi/vox_ruff_beard_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/afro_s.png | Bin 0 -> 436 bytes .../Customization/vox_hair.rsi/braid_s.png | Bin 0 -> 347 bytes .../vox_hair.rsi/crestedquills_s.png | Bin 0 -> 420 bytes .../vox_hair.rsi/emperorquills_s.png | Bin 0 -> 287 bytes .../Customization/vox_hair.rsi/flowing_s.png | Bin 0 -> 515 bytes .../Customization/vox_hair.rsi/hawk_s.png | Bin 0 -> 336 bytes .../Customization/vox_hair.rsi/horns_s.png | Bin 0 -> 347 bytes .../vox_hair.rsi/keelquills_s.png | Bin 0 -> 397 bytes .../vox_hair.rsi/keetquills_s.png | Bin 0 -> 381 bytes .../Customization/vox_hair.rsi/kingly_s.png | Bin 0 -> 457 bytes .../vox_hair.rsi/long_braid_s.png | Bin 0 -> 913 bytes .../Customization/vox_hair.rsi/mange_s.png | Bin 0 -> 636 bytes .../Mobs/Customization/vox_hair.rsi/meta.json | 100 +- .../Customization/vox_hair.rsi/mohawk_s.png | Bin 0 -> 337 bytes .../Customization/vox_hair.rsi/nights_s.png | Bin 0 -> 369 bytes .../Customization/vox_hair.rsi/ponytail_s.png | Bin 0 -> 747 bytes .../vox_hair.rsi/razor_clipped_s.png | Bin 0 -> 399 bytes .../Customization/vox_hair.rsi/razor_s.png | Bin 0 -> 411 bytes .../vox_hair.rsi/short_braid_s.png | Bin 0 -> 427 bytes .../vox_hair.rsi/shortquills_s.png | Bin 0 -> 391 bytes .../Customization/vox_hair.rsi/surf_s.png | Bin 0 -> 519 bytes .../vox_hair.rsi/tielquills_s.png | Bin 0 -> 373 bytes .../Customization/vox_hair.rsi/vox_afro_s.png | Bin 298 -> 0 bytes .../vox_hair.rsi/vox_afro_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/vox_bald_s.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_cropped_s.png | Bin 262 -> 0 bytes .../vox_hair.rsi/vox_cropped_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_horns_s.png | Bin 236 -> 0 bytes .../vox_hair.rsi/vox_horns_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_kingly_s.png | Bin 309 -> 0 bytes .../vox_hair.rsi/vox_kingly_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_mange_s.png | Bin 296 -> 0 bytes .../vox_hair.rsi/vox_mange_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_mohawk_s.png | Bin 237 -> 0 bytes .../vox_hair.rsi/vox_mohawk_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_nights_s.png | Bin 256 -> 0 bytes .../vox_hair.rsi/vox_nights_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/vox_pony_s.png | Bin 384 -> 0 bytes .../vox_hair.rsi/vox_pony_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/vox_rows_s.png | Bin 227 -> 0 bytes .../vox_hair.rsi/vox_rows_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_ruff_hawk_s.png | Bin 402 -> 0 bytes .../vox_hair.rsi/vox_ruff_hawk_s2.png | Bin 96 -> 0 bytes .../vox_hair.rsi/vox_shortquills_s.png | Bin 250 -> 0 bytes .../vox_hair.rsi/vox_shortquills_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/vox_surf_s.png | Bin 377 -> 0 bytes .../vox_hair.rsi/vox_surf_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/vox_yasu_s.png | Bin 356 -> 0 bytes .../vox_hair.rsi/vox_yasu_s2.png | Bin 96 -> 0 bytes .../Customization/vox_hair.rsi/yasu_s.png | Bin 0 -> 516 bytes .../Mobs/Customization/vox_parts.rsi/beak.png | Bin 0 -> 396 bytes .../Customization/vox_parts.rsi/l_arm.png | Bin 0 -> 342 bytes .../Customization/vox_parts.rsi/l_foot.png | Bin 0 -> 315 bytes .../Customization/vox_parts.rsi/l_hand.png | Bin 0 -> 349 bytes .../Customization/vox_parts.rsi/l_leg.png | Bin 0 -> 415 bytes .../Customization/vox_parts.rsi/meta.json | 55 + .../Customization/vox_parts.rsi/r_arm.png | Bin 0 -> 302 bytes .../Customization/vox_parts.rsi/r_foot.png | Bin 0 -> 305 bytes .../Customization/vox_parts.rsi/r_hand.png | Bin 0 -> 354 bytes .../Customization/vox_parts.rsi/r_leg.png | Bin 0 -> 422 bytes .../Mobs/Customization/vox_parts.rsi/tail.png | Bin 0 -> 590 bytes .../vox_parts.rsi/tail_stenciled.png | Bin 0 -> 615 bytes .../vox_tattoos.rsi/heart_l_arm.png | Bin 0 -> 223 bytes .../vox_tattoos.rsi/heart_r_arm.png | Bin 0 -> 223 bytes .../Customization/vox_tattoos.rsi/hive_s.png | Bin 0 -> 275 bytes .../Customization/vox_tattoos.rsi/meta.json | 27 + .../vox_tattoos.rsi/nightling_s.png | Bin 0 -> 312 bytes .../Species/Vox/displacement.rsi/jumpsuit.png | Bin 0 -> 906 bytes .../Species/Vox/displacement.rsi/meta.json | 18 + .../Mobs/Species/Vox/parts.rsi/eyes.png | Bin 0 -> 925 bytes .../Mobs/Species/Vox/parts.rsi/full.png | Bin 0 -> 493 bytes .../Mobs/Species/Vox/parts.rsi/groin.png | Bin 0 -> 361 bytes .../Mobs/Species/Vox/parts.rsi/groin_f.png | Bin 318 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/groin_m.png | Bin 318 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/head.png | Bin 0 -> 429 bytes .../Mobs/Species/Vox/parts.rsi/head_f.png | Bin 737 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/head_m.png | Bin 737 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/l_arm.png | Bin 385 -> 399 bytes .../Mobs/Species/Vox/parts.rsi/l_foot.png | Bin 255 -> 9030 bytes .../Mobs/Species/Vox/parts.rsi/l_hand.png | Bin 337 -> 9080 bytes .../Mobs/Species/Vox/parts.rsi/l_leg.png | Bin 596 -> 544 bytes .../Mobs/Species/Vox/parts.rsi/meta.json | 17 +- .../Mobs/Species/Vox/parts.rsi/r_arm.png | Bin 391 -> 387 bytes .../Mobs/Species/Vox/parts.rsi/r_foot.png | Bin 252 -> 9026 bytes .../Mobs/Species/Vox/parts.rsi/r_hand.png | Bin 354 -> 9085 bytes .../Mobs/Species/Vox/parts.rsi/r_leg.png | Bin 591 -> 549 bytes .../Mobs/Species/Vox/parts.rsi/torso.png | Bin 0 -> 866 bytes .../Mobs/Species/Vox/parts.rsi/torso_f.png | Bin 1038 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/torso_m.png | Bin 1038 -> 0 bytes .../Mobs/Species/Vox/parts.rsi/vox_m.png | Bin 2545 -> 1123 bytes .../Drinks/budgetinsulsdrink.rsi/fill-1.png | Bin 0 -> 282 bytes .../Drinks/budgetinsulsdrink.rsi/fill-2.png | Bin 0 -> 298 bytes .../Drinks/budgetinsulsdrink.rsi/fill-3.png | Bin 0 -> 313 bytes .../Drinks/budgetinsulsdrink.rsi/icon.png | Bin 0 -> 313 bytes .../budgetinsulsdrink.rsi/icon_empty.png | Bin 0 -> 220 bytes .../Drinks/budgetinsulsdrink.rsi/meta.json | 28 + .../Drinks/coffeeglass.rsi/fill-1.png | Bin 0 -> 2962 bytes .../Drinks/coffeeglass.rsi/fill-2.png | Bin 0 -> 2988 bytes .../Drinks/coffeeglass.rsi/fill-3.png | Bin 0 -> 2985 bytes .../Drinks/coffeeglass.rsi/fill-4.png | Bin 0 -> 2988 bytes .../Drinks/coffeeglass.rsi/icon.png | Bin 0 -> 3113 bytes .../Drinks/coffeeglass.rsi/icon_empty.png | Bin 0 -> 3069 bytes .../Drinks/coffeeglass.rsi/meta.json | 29 + .../Drinks/colaglass.rsi/fill-1.png | Bin 0 -> 2916 bytes .../Drinks/colaglass.rsi/fill-2.png | Bin 0 -> 2937 bytes .../Drinks/colaglass.rsi/fill-3.png | Bin 0 -> 2946 bytes .../Drinks/colaglass.rsi/fill-4.png | Bin 0 -> 2958 bytes .../Drinks/colaglass.rsi/fill-5.png | Bin 0 -> 2961 bytes .../Consumable/Drinks/colaglass.rsi/icon.png | Bin 0 -> 3178 bytes .../Drinks/colaglass.rsi/icon_empty.png | Bin 0 -> 3161 bytes .../Consumable/Drinks/colaglass.rsi/meta.json | 32 + .../Drinks/dr_gibb_glass.rsi/fill-1.png | Bin 0 -> 2909 bytes .../Drinks/dr_gibb_glass.rsi/fill-2.png | Bin 0 -> 2911 bytes .../Drinks/dr_gibb_glass.rsi/fill-3.png | Bin 0 -> 2925 bytes .../Drinks/dr_gibb_glass.rsi/fill-4.png | Bin 0 -> 2920 bytes .../Drinks/dr_gibb_glass.rsi/fill-5.png | Bin 0 -> 2946 bytes .../Drinks/dr_gibb_glass.rsi/icon.png | Bin 305 -> 3135 bytes .../Drinks/dr_gibb_glass.rsi/icon_empty.png | Bin 0 -> 3087 bytes .../Drinks/dr_gibb_glass.rsi/meta.json | 33 +- .../Drinks/energy_drink.rsi/icon.png | Bin 504 -> 450 bytes .../Drinks/energy_drink.rsi/icon_open.png | Bin 488 -> 440 bytes .../Drinks/greenteaglass.rsi/fill-1.png | Bin 0 -> 2903 bytes .../Drinks/greenteaglass.rsi/fill-2.png | Bin 0 -> 2915 bytes .../Drinks/greenteaglass.rsi/fill-3.png | Bin 0 -> 2931 bytes .../Drinks/greenteaglass.rsi/fill-4.png | Bin 0 -> 2931 bytes .../Drinks/greenteaglass.rsi/icon.png | Bin 0 -> 3116 bytes .../Drinks/greenteaglass.rsi/icon_empty.png | Bin 0 -> 3098 bytes .../Drinks/greenteaglass.rsi/meta.json | 29 + .../Consumable/Drinks/icebucket.rsi/icon.png | Bin 0 -> 554 bytes .../Consumable/Drinks/icebucket.rsi/meta.json | 14 + .../Drinks/icedgreenteaglass.rsi/fill-1.png | Bin 0 -> 2925 bytes .../Drinks/icedgreenteaglass.rsi/fill-2.png | Bin 0 -> 2945 bytes .../Drinks/icedgreenteaglass.rsi/fill-3.png | Bin 0 -> 2984 bytes .../Drinks/icedgreenteaglass.rsi/fill-4.png | Bin 0 -> 2993 bytes .../Drinks/icedgreenteaglass.rsi/fill-5.png | Bin 0 -> 3025 bytes .../Drinks/icedgreenteaglass.rsi/icon.png | Bin 0 -> 3190 bytes .../icedgreenteaglass.rsi/icon_empty.png | Bin 0 -> 3032 bytes .../Drinks/icedgreenteaglass.rsi/meta.json | 32 + .../Consumable/Drinks/iceglass.rsi/fill-1.png | Bin 0 -> 2935 bytes .../Consumable/Drinks/iceglass.rsi/fill-2.png | Bin 0 -> 2978 bytes .../Consumable/Drinks/iceglass.rsi/fill-3.png | Bin 0 -> 3005 bytes .../Consumable/Drinks/iceglass.rsi/icon.png | Bin 363 -> 3215 bytes .../Drinks/iceglass.rsi/icon_empty.png | Bin 0 -> 3071 bytes .../Consumable/Drinks/iceglass.rsi/meta.json | 27 +- .../Consumable/Drinks/jigger.rsi/icon.png | Bin 0 -> 314 bytes .../Consumable/Drinks/jigger.rsi/meta.json | 14 + .../Drinks/lemonjuiceglass.rsi/fill-1.png | Bin 0 -> 2981 bytes .../Drinks/lemonjuiceglass.rsi/fill-2.png | Bin 0 -> 2993 bytes .../Drinks/lemonjuiceglass.rsi/fill-3.png | Bin 0 -> 2993 bytes .../Drinks/lemonjuiceglass.rsi/fill-4.png | Bin 0 -> 3000 bytes .../Drinks/lemonjuiceglass.rsi/fill-5.png | Bin 0 -> 3004 bytes .../Drinks/lemonjuiceglass.rsi/icon.png | Bin 0 -> 3308 bytes .../Drinks/lemonjuiceglass.rsi/icon_empty.png | Bin 0 -> 3278 bytes .../Drinks/lemonjuiceglass.rsi/meta.json | 32 + .../Drinks/moonshineglass.rsi/fill-1.png | Bin 0 -> 2930 bytes .../Drinks/moonshineglass.rsi/fill-2.png | Bin 0 -> 2929 bytes .../Drinks/moonshineglass.rsi/fill-3.png | Bin 0 -> 2937 bytes .../Drinks/moonshineglass.rsi/fill-4.png | Bin 0 -> 2970 bytes .../Drinks/moonshineglass.rsi/fill-5.png | Bin 0 -> 2971 bytes .../Drinks/moonshineglass.rsi/fill-6.png | Bin 0 -> 2967 bytes .../Drinks/moonshineglass.rsi/icon.png | Bin 0 -> 3067 bytes .../Drinks/moonshineglass.rsi/icon_empty.png | Bin 0 -> 3018 bytes .../Drinks/moonshineglass.rsi/meta.json | 35 + .../Drinks/orangejuiceglass.rsi/fill-1.png | Bin 0 -> 2956 bytes .../Drinks/orangejuiceglass.rsi/fill-2.png | Bin 0 -> 2960 bytes .../Drinks/orangejuiceglass.rsi/fill-3.png | Bin 0 -> 2972 bytes .../Drinks/orangejuiceglass.rsi/fill-4.png | Bin 0 -> 2981 bytes .../Drinks/orangejuiceglass.rsi/fill-5.png | Bin 0 -> 2982 bytes .../Drinks/orangejuiceglass.rsi/icon.png | Bin 0 -> 3136 bytes .../orangejuiceglass.rsi/icon_empty.png | Bin 0 -> 3121 bytes .../Drinks/orangejuiceglass.rsi/meta.json | 32 + .../Drinks/rubberneck.rsi/fill-1.png | Bin 0 -> 277 bytes .../Drinks/rubberneck.rsi/fill-2.png | Bin 0 -> 278 bytes .../Drinks/rubberneck.rsi/fill-3.png | Bin 0 -> 278 bytes .../Consumable/Drinks/rubberneck.rsi/icon.png | Bin 0 -> 278 bytes .../Drinks/rubberneck.rsi/icon_empty.png | Bin 0 -> 277 bytes .../Drinks/rubberneck.rsi/meta.json | 28 + .../Drinks/space-up_glass.rsi/fill-1.png | Bin 0 -> 2925 bytes .../Drinks/space-up_glass.rsi/fill-2.png | Bin 0 -> 2940 bytes .../Drinks/space-up_glass.rsi/fill-3.png | Bin 0 -> 2940 bytes .../Drinks/space-up_glass.rsi/fill-4.png | Bin 0 -> 2953 bytes .../Drinks/space-up_glass.rsi/fill-5.png | Bin 0 -> 2955 bytes .../Drinks/space-up_glass.rsi/fill-6.png | Bin 0 -> 2961 bytes .../Drinks/space-up_glass.rsi/icon.png | Bin 320 -> 3131 bytes .../Drinks/space-up_glass.rsi/icon_empty.png | Bin 0 -> 3094 bytes .../Drinks/space-up_glass.rsi/meta.json | 36 +- .../space_mountain_wind_glass.rsi/fill-1.png | Bin 0 -> 2934 bytes .../space_mountain_wind_glass.rsi/fill-2.png | Bin 0 -> 2945 bytes .../space_mountain_wind_glass.rsi/fill-3.png | Bin 0 -> 2956 bytes .../space_mountain_wind_glass.rsi/fill-4.png | Bin 0 -> 2963 bytes .../space_mountain_wind_glass.rsi/fill-5.png | Bin 0 -> 2990 bytes .../space_mountain_wind_glass.rsi/icon.png | Bin 404 -> 3160 bytes .../icon_empty.png | Bin 0 -> 3119 bytes .../space_mountain_wind_glass.rsi/meta.json | 33 +- .../Drinks/sugarglass.rsi/fill-1.png | Bin 0 -> 2874 bytes .../Drinks/sugarglass.rsi/fill-2.png | Bin 0 -> 2893 bytes .../Drinks/sugarglass.rsi/fill-3.png | Bin 0 -> 2902 bytes .../Drinks/sugarglass.rsi/fill-4.png | Bin 0 -> 2900 bytes .../Drinks/sugarglass.rsi/fill-5.png | Bin 0 -> 2911 bytes .../Drinks/sugarglass.rsi/fill-6.png | Bin 0 -> 2921 bytes .../Drinks/sugarglass.rsi/fill-7.png | Bin 0 -> 2920 bytes .../Consumable/Drinks/sugarglass.rsi/icon.png | Bin 0 -> 3051 bytes .../Drinks/sugarglass.rsi/icon_empty.png | Bin 0 -> 2986 bytes .../Drinks/sugarglass.rsi/meta.json | 38 + .../Consumable/Drinks/teaglass.rsi/fill-1.png | Bin 0 -> 2937 bytes .../Consumable/Drinks/teaglass.rsi/fill-2.png | Bin 0 -> 2944 bytes .../Consumable/Drinks/teaglass.rsi/fill-3.png | Bin 0 -> 2983 bytes .../Consumable/Drinks/teaglass.rsi/fill-4.png | Bin 0 -> 2955 bytes .../Consumable/Drinks/teaglass.rsi/icon.png | Bin 231 -> 3156 bytes .../Drinks/teaglass.rsi/icon_empty.png | Bin 0 -> 3127 bytes .../Consumable/Drinks/teaglass.rsi/meta.json | 30 +- .../Drinks/tequillaglass.rsi/fill-1.png | Bin 189 -> 3054 bytes .../Drinks/tequillaglass.rsi/fill-2.png | Bin 208 -> 3052 bytes .../Drinks/tequillaglass.rsi/fill-3.png | Bin 237 -> 3045 bytes .../Drinks/tequillaglass.rsi/fill-4.png | Bin 248 -> 0 bytes .../Drinks/tequillaglass.rsi/icon.png | Bin 447 -> 3149 bytes .../Drinks/tequillaglass.rsi/icon_empty.png | Bin 348 -> 3129 bytes .../Drinks/tequillaglass.rsi/meta.json | 49 +- .../Drinks/tonicglass.rsi/fill-1.png | Bin 0 -> 2864 bytes .../Drinks/tonicglass.rsi/fill-2.png | Bin 0 -> 2882 bytes .../Drinks/tonicglass.rsi/fill-3.png | Bin 0 -> 2883 bytes .../Drinks/tonicglass.rsi/fill-4.png | Bin 0 -> 2883 bytes .../Drinks/tonicglass.rsi/fill-5.png | Bin 0 -> 2883 bytes .../Consumable/Drinks/tonicglass.rsi/icon.png | Bin 0 -> 3146 bytes .../Drinks/tonicglass.rsi/icon_empty.png | Bin 0 -> 3085 bytes .../Drinks/tonicglass.rsi/meta.json | 32 + .../Drinks/watermelonglass.rsi/fill-1.png | Bin 0 -> 2933 bytes .../Drinks/watermelonglass.rsi/fill-2.png | Bin 0 -> 2936 bytes .../Drinks/watermelonglass.rsi/fill-3.png | Bin 0 -> 2973 bytes .../Drinks/watermelonglass.rsi/fill-4.png | Bin 0 -> 3000 bytes .../Drinks/watermelonglass.rsi/icon.png | Bin 0 -> 3180 bytes .../Drinks/watermelonglass.rsi/icon_empty.png | Bin 0 -> 3107 bytes .../Drinks/watermelonglass.rsi/meta.json | 29 + .../Drinks/xenobasher.rsi/fill-1.png | Bin 0 -> 790 bytes .../Drinks/xenobasher.rsi/fill-2.png | Bin 0 -> 839 bytes .../Consumable/Drinks/xenobasher.rsi/icon.png | Bin 0 -> 839 bytes .../Drinks/xenobasher.rsi/icon_empty.png | Bin 0 -> 754 bytes .../Drinks/xenobasher.rsi/meta.json | 23 + .../cigar-gold.rsi/lit-equipped-MASK-vox.png | Bin 0 -> 1123 bytes .../Cigars/cigar-gold.rsi/meta.json | 52 +- .../unlit-equipped-MASK-vox.png | Bin 0 -> 262 bytes .../cigar.rsi/lit-equipped-MASK-vox.png | Bin 0 -> 1123 bytes .../Smokeables/Cigars/cigar.rsi/meta.json | 52 +- .../cigar.rsi/unlit-equipped-MASK-vox.png | Bin 0 -> 262 bytes .../icon.png | Bin .../meta.json | 0 .../Devices/chameleon_projector.rsi/icon.png | Bin 0 -> 716 bytes .../chameleon_projector.rsi/inhand-left.png | Bin 0 -> 306 bytes .../chameleon_projector.rsi/inhand-right.png | Bin 0 -> 316 bytes .../Devices/chameleon_projector.rsi/meta.json | 32 + .../Objects/Devices/flatpack.rsi/emitter.png | Bin 0 -> 326 bytes .../Objects/Devices/flatpack.rsi/meta.json | 5 +- .../Objects/Devices/jammer.rsi/jammer-on.png | Bin 537 -> 0 bytes .../Devices/jammer.rsi/jammer_high_charge.png | Bin 0 -> 609 bytes .../Devices/jammer.rsi/jammer_low_charge.png | Bin 0 -> 617 bytes .../jammer.rsi/jammer_medium_charge.png | Bin 0 -> 608 bytes .../Objects/Devices/jammer.rsi/meta.json | 26 +- .../Devices/securityhandy.rsi/meta.json | 28 + .../walkietalkie-inhand-left.png | Bin 0 -> 372 bytes .../walkietalkie-inhand-right.png | Bin 0 -> 384 bytes .../securityhandy.rsi/walkietalkie-off.png | Bin 0 -> 357 bytes .../securityhandy.rsi/walkietalkie-on.png | Bin 0 -> 156 bytes .../securityhandy.rsi/walkietalkie.png | Bin 0 -> 348 bytes .../Fun/whistles.rsi/equipped-NECK.png | Bin 0 -> 288 bytes .../Objects/Fun/whistles.rsi/meta.json | 33 + .../Fun/whistles.rsi/sec-equipped-NECK.png | Bin 0 -> 6755 bytes .../sec.png} | Bin .../whistles.rsi/trench-equipped-NECK.png} | Bin .../Fun/whistles.rsi/trench.png} | Bin .../Objects/Fun/whistles.rsi/whistle.png | Bin 0 -> 593 bytes .../Objects/Materials/materials.rsi/meta.json | 11 +- .../Materials/materials.rsi/pyrotton.png | Bin 0 -> 1311 bytes .../Materials/materials.rsi/pyrotton_2.png | Bin 0 -> 1394 bytes .../Materials/materials.rsi/pyrotton_3.png | Bin 0 -> 1450 bytes .../Objects/Misc/chopstick.rsi/icon.png | Bin 0 -> 4359 bytes .../Misc/chopstick.rsi/inhand-left.png | Bin 0 -> 749 bytes .../Misc/chopstick.rsi/inhand-right.png | Bin 0 -> 711 bytes .../Objects/Misc/chopstick.rsi/meta.json | 25 + .../Objects/Misc/chopstick.rsi/paired.png | Bin 0 -> 4648 bytes .../utensils.rsi/bar_spoon-inhand-left.png | Bin 0 -> 260 bytes .../utensils.rsi/bar_spoon-inhand-right.png | Bin 0 -> 251 bytes .../Objects/Misc/utensils.rsi/bar_spoon.png | Bin 0 -> 312 bytes .../Objects/Misc/utensils.rsi/meta.json | 13 +- .../charging-equipped-BACKPACK.png | Bin 0 -> 1886 bytes .../portable_recharger.rsi/charging-unlit.png | Bin 0 -> 539 bytes .../Power/portable_recharger.rsi/charging.png | Bin 0 -> 964 bytes .../portable_recharger.rsi/inhand-left.png | Bin 0 -> 714 bytes .../portable_recharger.rsi/inhand-right.png | Bin 0 -> 735 bytes .../Power/portable_recharger.rsi/meta.json | 92 + .../Specific/Chapel/quran.rsi/icon.png | Bin 0 -> 707 bytes .../Specific/Chapel/quran.rsi/inhand-left.png | Bin 0 -> 886 bytes .../Chapel/quran.rsi/inhand-right.png | Bin 0 -> 1071 bytes .../Specific/Chapel/quran.rsi/meta.json | 22 + .../Hydroponics/chili.rsi/produce.png | Bin 300 -> 279 bytes .../Hydroponics/chilly.rsi/produce.png | Bin 172 -> 200 bytes .../Hydroponics/pyrotton.rsi/dead.png | Bin 0 -> 1267 bytes .../Hydroponics/pyrotton.rsi/harvest.png | Bin 0 -> 1514 bytes .../Hydroponics/pyrotton.rsi/meta.json | 32 + .../Hydroponics/pyrotton.rsi/produce.png | Bin 0 -> 1456 bytes .../Hydroponics/pyrotton.rsi/seed.png | Bin 0 -> 1385 bytes .../Hydroponics/pyrotton.rsi/stage-1.png | Bin 0 -> 1132 bytes .../Hydroponics/pyrotton.rsi/stage-2.png | Bin 0 -> 1219 bytes .../Hydroponics/pyrotton.rsi/stage-3.png | Bin 0 -> 1295 bytes .../Hydroponics/rainbow_cannabis.rsi/dead.png | Bin 0 -> 281 bytes .../rainbow_cannabis.rsi/dried.png | Bin 0 -> 484 bytes .../rainbow_cannabis.rsi/harvest.png | Bin 0 -> 48775 bytes .../rainbow_cannabis.rsi/meta.json | 173 + .../powderpile_rainbow.png | Bin 0 -> 521 bytes .../rainbow_cannabis.rsi/produce.png | Bin 0 -> 17259 bytes .../Hydroponics/rainbow_cannabis.rsi/seed.png | Bin 0 -> 493 bytes .../rainbow_cannabis.rsi/stage-1.png | Bin 0 -> 25186 bytes .../rainbow_cannabis.rsi/stage-2.png | Bin 0 -> 26288 bytes .../rainbow_cannabis.rsi/stage-3.png | Bin 0 -> 31374 bytes .../Robotics/borgmodule.rsi/icon-bomb.png | Bin 0 -> 248 bytes .../Robotics/borgmodule.rsi/meta.json | 8 +- .../borgmodule.rsi/syndicateborgbomb.png | Bin 0 -> 686 bytes .../Objects/Storage/boxes.rsi/meta.json | 3 + .../Storage/boxes.rsi/shelluranium.png | Bin 0 -> 1504 bytes .../emergency.rsi/equipped-SUITSTORAGE.png | Bin 0 -> 643 bytes .../Objects/Tanks/emergency.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 444 bytes .../Tanks/emergency_clown.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 525 bytes .../Tanks/emergency_double.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 652 bytes .../Tanks/emergency_double_red.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 665 bytes .../Tanks/emergency_extended.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 440 bytes .../emergency_extended_red.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 440 bytes .../Objects/Tanks/emergency_red.rsi/meta.json | 4 + .../equipped-SUITSTORAGE.png | Bin 0 -> 665 bytes .../Tanks/emergency_yellow.rsi/meta.json | 4 + .../Tanks/plasma.rsi/equipped-SUITSTORAGE.png | Bin 0 -> 383 bytes .../Objects/Tanks/plasma.rsi/meta.json | 4 + .../Guns/Battery/antiquelasergun.rsi/base.png | Bin 1407 -> 1035 bytes .../Guns/Battery/antiquelasergun.rsi/icon.png | Bin 1415 -> 1040 bytes .../antiquelasergun.rsi/mag-unshaded-0.png | Bin 133 -> 166 bytes .../antiquelasergun.rsi/mag-unshaded-1.png | Bin 208 -> 168 bytes .../antiquelasergun.rsi/mag-unshaded-2.png | Bin 211 -> 179 bytes .../antiquelasergun.rsi/mag-unshaded-3.png | Bin 214 -> 177 bytes .../antiquelasergun.rsi/mag-unshaded-4.png | Bin 227 -> 196 bytes .../Battery/antiquelasergun.rsi/meta.json | 160 +- .../Guns/Battery/laser_cannon.rsi/meta.json | 146 +- .../laser_cannon.rsi/wielded-inhand-left.png | Bin 0 -> 1039 bytes .../laser_cannon.rsi/wielded-inhand-right.png | Bin 0 -> 1039 bytes .../Guns/Battery/laser_gun.rsi/meta.json | 78 +- .../laser_gun.rsi/wielded-inhand-left.png | Bin 0 -> 807 bytes .../laser_gun.rsi/wielded-inhand-right.png | Bin 0 -> 803 bytes .../Guns/Battery/pulse_carbine.rsi/meta.json | 78 +- .../pulse_carbine.rsi/wielded-inhand-left.png | Bin 0 -> 792 bytes .../wielded-inhand-right.png | Bin 0 -> 805 bytes .../Guns/Battery/pulse_rifle.rsi/meta.json | 78 +- .../pulse_rifle.rsi/wielded-inhand-left.png | Bin 0 -> 792 bytes .../pulse_rifle.rsi/wielded-inhand-right.png | Bin 0 -> 805 bytes .../Weapons/Guns/Battery/xray.rsi/meta.json | 100 +- .../Battery/xray.rsi/wielded-inhand-left.png | Bin 0 -> 1551 bytes .../Battery/xray.rsi/wielded-inhand-right.png | Bin 0 -> 1578 bytes .../Guns/Launchers/china_lake.rsi/meta.json | 12 +- .../china_lake.rsi/wielded-inhand-left.png | Bin 0 -> 839 bytes .../china_lake.rsi/wielded-inhand-right.png | Bin 0 -> 863 bytes .../Weapons/Guns/Rifles/ak.rsi/meta.json | 18 +- .../Rifles/ak.rsi/wielded-inhand-left.png | Bin 0 -> 1198 bytes .../Rifles/ak.rsi/wielded-inhand-right.png | Bin 0 -> 1192 bytes .../Weapons/Guns/Rifles/lecter.rsi/meta.json | 12 +- .../Rifles/lecter.rsi/wielded-inhand-left.png | Bin 0 -> 832 bytes .../lecter.rsi/wielded-inhand-right.png | Bin 0 -> 822 bytes .../Weapons/Guns/SMGs/c20r.rsi/meta.json | 10 +- .../SMGs/c20r.rsi/wielded-inhand-left.png | Bin 0 -> 679 bytes .../SMGs/c20r.rsi/wielded-inhand-right.png | Bin 0 -> 671 bytes .../Weapons/Guns/SMGs/drozd.rsi/meta.json | 74 +- .../SMGs/drozd.rsi/wielded-inhand-left.png | Bin 0 -> 719 bytes .../SMGs/drozd.rsi/wielded-inhand-right.png | Bin 0 -> 709 bytes .../Guns/Shotguns/blunderbuss.rsi/meta.json | 10 +- .../blunderbuss.rsi/wielded-inhand-left.png | Bin 0 -> 949 bytes .../blunderbuss.rsi/wielded-inhand-right.png | Bin 0 -> 964 bytes .../Guns/Shotguns/bulldog.rsi/meta.json | 12 +- .../bulldog.rsi/wielded-inhand-left.png | Bin 0 -> 802 bytes .../bulldog.rsi/wielded-inhand-right.png | Bin 0 -> 803 bytes .../Guns/Shotguns/db_shotgun.rsi/meta.json | 2 +- .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../db_shotgun_inhands_64x.rsi/meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 836 bytes .../wielded-inhand-right.png | Bin 0 -> 842 bytes .../Guns/Shotguns/enforcer.rsi/meta.json | 2 +- .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../enforcer_inhands_64x.rsi/meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 775 bytes .../wielded-inhand-right.png | Bin 0 -> 762 bytes .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 867 bytes .../wielded-inhand-right.png | Bin 0 -> 877 bytes .../Guns/Shotguns/inhands_64x.rsi/meta.json | 51 - .../Weapons/Guns/Shotguns/pump.rsi/meta.json | 2 +- .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../Shotguns/pump_inhands_64x.rsi/meta.json | 27 + .../wielded-inhand-left.png | Bin 0 -> 905 bytes .../wielded-inhand-right.png | Bin 0 -> 922 bytes .../inhand-left.png} | Bin .../inhand-right.png} | Bin .../Shotguns/sawn_inhands_64x.rsi/meta.json | 19 + .../Guns/Snipers/bolt_gun_wood.rsi/meta.json | 12 +- .../bolt_gun_wood.rsi/wielded-inhand-left.png | Bin 0 -> 714 bytes .../wielded-inhand-right.png | Bin 0 -> 733 bytes .../Guns/Snipers/heavy_sniper.rsi/meta.json | 12 +- .../heavy_sniper.rsi/wielded-inhand-left.png | Bin 0 -> 1719 bytes .../heavy_sniper.rsi/wielded-inhand-right.png | Bin 0 -> 1665 bytes .../Weapons/Melee/cane.rsi/cane-empty.png | Bin 0 -> 564 bytes .../Objects/Weapons/Melee/cane.rsi/cane.png | Bin 0 -> 649 bytes .../Weapons/Melee/cane.rsi/inhand-left.png | Bin 0 -> 261 bytes .../Weapons/Melee/cane.rsi/inhand-right.png | Bin 0 -> 268 bytes .../Objects/Weapons/Melee/cane.rsi/meta.json | 33 + .../Melee/cane.rsi/wielded-inhand-left.png | Bin 0 -> 633 bytes .../Melee/cane.rsi/wielded-inhand-right.png | Bin 0 -> 640 bytes .../Weapons/Melee/cane_blade.rsi/icon.png | Bin 0 -> 682 bytes .../Melee/cane_blade.rsi/inhand-left.png | Bin 0 -> 264 bytes .../Melee/cane_blade.rsi/inhand-right.png | Bin 0 -> 266 bytes .../Weapons/Melee/cane_blade.rsi}/meta.json | 9 +- Resources/Textures/Shaders/displacement.swsl | 18 + .../Machines/artifact_crusher.rsi/icon.png | Bin 0 -> 1570 bytes .../Machines/artifact_crusher.rsi/meta.json | 3 + .../building.png | Bin 0 -> 3419 bytes .../circuit_imprinter_hypercon.rsi/icon.png | Bin 0 -> 797 bytes .../circuit_imprinter_hypercon.rsi/meta.json | 52 + .../circuit_imprinter_hypercon.rsi/panel.png | Bin 0 -> 244 bytes .../circuit_imprinter_hypercon.rsi/unlit.png | Bin 0 -> 4771 bytes .../fax_machine.rsi/inserting_hamster.png} | Bin 21026 -> 23368 bytes .../fax_machine.rsi/inserting_mothroach.png | Bin 0 -> 23838 bytes .../fax_machine.rsi/inserting_mouse.png | Bin 0 -> 23808 bytes .../Machines/fax_machine.rsi/meta.json | 57 + .../pipe.rsi/Bend-inhand-left.png | Bin 0 -> 6821 bytes .../pipe.rsi/Bend-inhand-right.png | Bin 0 -> 6825 bytes .../pipe.rsi/Fourway-inhand-left.png | Bin 0 -> 6914 bytes .../pipe.rsi/Fourway-inhand-right.png | Bin 0 -> 6915 bytes .../pipe.rsi/TJunction-inhand-left.png | Bin 0 -> 6895 bytes .../pipe.rsi/TJunction-inhand-right.png | Bin 0 -> 6893 bytes .../Atmospherics/pipe.rsi/inhand-left.png | Bin 0 -> 6818 bytes .../Atmospherics/pipe.rsi/inhand-right.png | Bin 0 -> 6826 bytes .../Piping/Atmospherics/pipe.rsi/meta.json | 46 +- .../Piping/Atmospherics/pipe.rsi/pipeBend.png | Bin 3965 -> 621 bytes .../Atmospherics/pipe.rsi/storageBend.png | Bin 0 -> 449 bytes .../Atmospherics/pipe.rsi/storageStraight.png | Bin 0 -> 503 bytes .../pipe.rsi/storageTJunction.png | Bin 0 -> 509 bytes .../Storage/glassbox.rsi/DamageOverlay_12.png | Bin 1294 -> 512 bytes .../Storage/glassbox.rsi/DamageOverlay_4.png | Bin 733 -> 311 bytes .../Storage/glassbox.rsi/DamageOverlay_8.png | Bin 1116 -> 423 bytes .../{glassbox-empty-open.png => base.png} | Bin .../{glass-4.png => glass-broken.png} | Bin .../glassbox.rsi/glassbox-filled-closed.png | Bin 901 -> 0 bytes .../glassbox.rsi/glassbox-filled-open.png | Bin 796 -> 0 bytes .../Storage/glassbox.rsi/glassbox.png | Bin 313 -> 0 bytes .../Structures/Storage/glassbox.rsi/icon.png | Bin 0 -> 459 bytes .../Structures/Storage/glassbox.rsi/meta.json | 26 +- .../cargo_pallets.rsi/cargo_pallet_buy_0.png | Bin 0 -> 1072 bytes .../cargo_pallets.rsi/cargo_pallet_buy_1.png | Bin 0 -> 923 bytes .../cargo_pallets.rsi/cargo_pallet_buy_2.png | Bin 0 -> 1072 bytes .../cargo_pallets.rsi/cargo_pallet_buy_3.png | Bin 0 -> 923 bytes .../cargo_pallets.rsi/cargo_pallet_buy_4.png | Bin 0 -> 1203 bytes .../cargo_pallets.rsi/cargo_pallet_buy_5.png | Bin 0 -> 883 bytes .../cargo_pallets.rsi/cargo_pallet_buy_6.png | Bin 0 -> 1203 bytes .../cargo_pallets.rsi/cargo_pallet_buy_7.png | Bin 0 -> 433 bytes .../cargo_pallets.rsi/cargo_pallet_sell_0.png | Bin 0 -> 1054 bytes .../cargo_pallets.rsi/cargo_pallet_sell_1.png | Bin 0 -> 917 bytes .../cargo_pallets.rsi/cargo_pallet_sell_2.png | Bin 0 -> 1054 bytes .../cargo_pallets.rsi/cargo_pallet_sell_3.png | Bin 0 -> 917 bytes .../cargo_pallets.rsi/cargo_pallet_sell_4.png | Bin 0 -> 1216 bytes .../cargo_pallets.rsi/cargo_pallet_sell_5.png | Bin 0 -> 848 bytes .../cargo_pallets.rsi/cargo_pallet_sell_6.png | Bin 0 -> 1216 bytes .../cargo_pallets.rsi/cargo_pallet_sell_7.png | Bin 0 -> 433 bytes .../Structures/cargo_pallets.rsi/meta.json | 64 + .../Tiles/Misc/floortrap.rsi/floortrap.png | Bin 0 -> 152 bytes .../Misc/floortrap.rsi/floortrapspawn.png | Bin 0 -> 189 bytes .../Tiles/Misc/floortrap.rsi/meta.json | 17 + Resources/Textures/Tips/tippy.rsi/down.png | Bin 0 -> 5325 bytes Resources/Textures/Tips/tippy.rsi/left.png | Bin 0 -> 4000 bytes Resources/Textures/Tips/tippy.rsi/meta.json | 20 + Resources/Textures/Tips/tippy.rsi/right.png | Bin 0 -> 4341 bytes Resources/engineCommandPerms.yml | 2 + Resources/keybinds.yml | 6 + RobustToolbox | 2 +- SpaceStation14.sln.DotSettings | 2 + .../Displacement Map Flip.lua | 78 + .../Displacement Map Visualizer.lua | 171 + .../Displacement Map.png | Bin 0 -> 1212 bytes 2773 files changed, 55476 insertions(+), 30184 deletions(-) create mode 100644 Content.Client/Animations/TrackUserComponent.cs create mode 100644 Content.Client/Chat/UI/EmotesMenu.xaml create mode 100644 Content.Client/Chat/UI/EmotesMenu.xaml.cs create mode 100644 Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs create mode 100644 Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs create mode 100644 Content.Client/Chemistry/UI/ButtonGrid.cs create mode 100644 Content.Client/Chemistry/UI/ReagentCardControl.xaml create mode 100644 Content.Client/Chemistry/UI/ReagentCardControl.xaml.cs create mode 100644 Content.Client/Chemistry/UI/SolutionStatusControl.cs create mode 100644 Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs create mode 100644 Content.Client/DeviceNetwork/JammerSystem.cs create mode 100644 Content.Client/Fax/System/FaxVisualsSystem.cs create mode 100644 Content.Client/Ghost/Commands/ToggleGhostVisibilityCommand.cs create mode 100644 Content.Client/Items/UI/PollingItemStatusControl.cs create mode 100644 Content.Client/Labels/EntitySystems/HandLabelerSystem.cs rename Content.Client/{Preferences => Lobby}/ClientPreferencesManager.cs (99%) rename Content.Client/{Preferences => Lobby}/IClientPreferencesManager.cs (94%) create mode 100644 Content.Client/Lobby/UI/CharacterPickerButton.xaml create mode 100644 Content.Client/Lobby/UI/CharacterPickerButton.xaml.cs rename Content.Client/{Preferences => Lobby}/UI/CharacterSetupGui.xaml (91%) create mode 100644 Content.Client/Lobby/UI/CharacterSetupGui.xaml.cs rename Content.Client/{Preferences => Lobby}/UI/HighlightedContainer.xaml (100%) rename Content.Client/{Preferences => Lobby}/UI/HighlightedContainer.xaml.cs (88%) rename Content.Client/{Preferences => Lobby}/UI/HumanoidProfileEditor.xaml (72%) rename Content.Client/{Preferences => Lobby}/UI/HumanoidProfileEditor.xaml.cs (58%) create mode 100644 Content.Client/Lobby/UI/LoadoutPreferenceSelector.xaml rename Content.Client/{Preferences/UI/LoadoutPreferenceSelector.cs => Lobby/UI/LoadoutPreferenceSelector.xaml.cs} (73%) create mode 100644 Content.Client/Lobby/UI/LobbyCharacterPreviewPanel.xaml create mode 100644 Content.Client/Lobby/UI/LobbyCharacterPreviewPanel.xaml.cs create mode 100644 Content.Client/Lobby/UI/RequirementsSelector.xaml create mode 100644 Content.Client/Lobby/UI/RequirementsSelector.xaml.cs create mode 100644 Content.Client/Lobby/UI/TraitPreferenceSelector.xaml rename Content.Client/{Preferences/UI/TraitPreferenceSelector.cs => Lobby/UI/TraitPreferenceSelector.xaml.cs} (68%) create mode 100644 Content.Client/Magic/MagicSystem.cs create mode 100644 Content.Client/MagicMirror/MagicMirrorSystem.cs create mode 100644 Content.Client/Nutrition/EntitySystems/DrinkSystem.cs create mode 100644 Content.Client/Overlays/ShowCriminalRecordIconsSystem.cs create mode 100644 Content.Client/Overlays/ShowJobIconsSystem.cs create mode 100644 Content.Client/Overlays/ShowMindShieldIconsSystem.cs delete mode 100644 Content.Client/Overlays/ShowSecurityIconsSystem.cs create mode 100644 Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs create mode 100644 Content.Client/Power/ActivatableUIRequiresPowerSystem.cs delete mode 100644 Content.Client/Preferences/UI/AntagPreferenceSelector.cs delete mode 100644 Content.Client/Preferences/UI/CharacterSetupGui.xaml.cs delete mode 100644 Content.Client/Preferences/UI/HumanoidProfileEditor.Random.cs delete mode 100644 Content.Client/Preferences/UI/JobPrioritySelector.cs delete mode 100644 Content.Client/Preferences/UI/RequirementsSelector.cs create mode 100644 Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs create mode 100644 Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs create mode 100644 Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml create mode 100644 Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs create mode 100644 Content.Client/RoundEnd/RoundEndSummaryUIController.cs delete mode 100644 Content.Client/SimpleStation14/Overlays/Shaders/NearsightedOverlays.cs delete mode 100644 Content.Client/SimpleStation14/Overlays/Systems/NearsightedSystems.cs create mode 100644 Content.Client/Tips/TippyUI.xaml create mode 100644 Content.Client/Tips/TippyUI.xaml.cs create mode 100644 Content.Client/Tips/TippyUIController.cs delete mode 100644 Content.Client/Tools/Components/WelderComponent.cs create mode 100644 Content.Client/UserInterface/Controls/ClipControl.cs create mode 100644 Content.Client/UserInterface/Systems/Emotes/EmotesUIController.cs create mode 100644 Content.Client/Weapons/Ranged/ItemStatus/BulletRender.cs create mode 100644 Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs create mode 100644 Content.IntegrationTests/Tests/Mapping/MappingTests.cs create mode 100644 Content.IntegrationTests/Tests/Minds/GhostTests.cs create mode 100644 Content.IntegrationTests/Tests/Station/EvacShuttleTest.cs delete mode 100644 Content.Server/Access/Components/IdExaminableComponent.cs create mode 100644 Content.Server/Chat/V2/Commands/DeleteChatMessageCommand.cs create mode 100644 Content.Server/Chat/V2/Commands/NukeChatMessagesCommand.cs create mode 100644 Content.Server/Chat/V2/Messages.cs create mode 100644 Content.Server/Chat/V2/Repository/ChatRepository.cs delete mode 100644 Content.Server/Chemistry/Components/ReagentTankComponent.cs create mode 100644 Content.Server/Chemistry/ReagentEffectConditions/TotalHunger.cs rename Content.Server/Chemistry/ReagentEffects/{ChemCleanBoodstream.cs => ChemCleanBloodstream.cs} (100%) create mode 100644 Content.Server/Chemistry/ReagentEffects/ReduceRotting.cs create mode 100644 Content.Server/Containers/ThrowInsertContainerComponent.cs create mode 100644 Content.Server/Containers/ThrowInsertContainerSystem.cs create mode 100644 Content.Server/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs create mode 100644 Content.Server/Explosion/Components/RepeatingTriggerComponent.cs create mode 100644 Content.Server/Geras/GerasComponent.cs create mode 100644 Content.Server/Geras/GerasSystem.cs create mode 100644 Content.Server/Ghost/Roles/Components/GhostRoleRaffleComponent.cs create mode 100644 Content.Server/Ghost/Roles/MakeRaffledGhostRoleCommand.cs create mode 100644 Content.Server/Ghost/Roles/Raffles/GhostRoleRaffleConfig.cs create mode 100644 Content.Server/Ghost/Roles/Raffles/GhostRoleRaffleDeciderPrototype.cs create mode 100644 Content.Server/Ghost/Roles/Raffles/IGhostRoleRaffleDecider.cs create mode 100644 Content.Server/Ghost/Roles/Raffles/RngGhostRoleRaffleDecider.cs create mode 100644 Content.Server/GridPreloader/GridPreloaderComponent.cs create mode 100644 Content.Server/GridPreloader/GridPreloaderSystem.cs delete mode 100644 Content.Server/Labels/Label/Components/HandLabelerComponent.cs delete mode 100644 Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs delete mode 100644 Content.Server/Light/Events/LightToggleEvent.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/KeyNotExistsPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyBoolEqualsPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyFloatEqualsPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyFloatGreaterPrecondition.cs create mode 100644 Content.Server/NPC/HTN/Preconditions/Math/KeyFloatLessPrecondition.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Math/AddFloatOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Math/SetBoolOperator.cs rename Content.Server/NPC/HTN/PrimitiveTasks/Operators/{ => Math}/SetFloatOperator.cs (52%) create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/Math/SetRandomFloatOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/PlaySoundOperator.cs create mode 100644 Content.Server/NPC/HTN/PrimitiveTasks/Operators/SayKeyOperator.cs delete mode 100644 Content.Server/Nutrition/Components/PressurizedDrinkComponent.cs create mode 100644 Content.Server/Objectives/Components/CodeConditionSystem.cs delete mode 100644 Content.Server/Objectives/Components/TerminatorTargetOverrideComponent.cs delete mode 100644 Content.Server/Objectives/Components/TerrorConditionComponent.cs create mode 100644 Content.Server/Objectives/Systems/CodeConditionSystem.cs delete mode 100644 Content.Server/Objectives/Systems/TerminatorTargetOverrideSystem.cs create mode 100644 Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs delete mode 100644 Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs delete mode 100644 Content.Server/Radio/Components/RadioJammerComponent.cs create mode 100644 Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs create mode 100644 Content.Server/Shuttles/Components/DockingSignalControlComponent.cs create mode 100644 Content.Server/Shuttles/Systems/DockingSignalControlSystem.cs create mode 100644 Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs create mode 100644 Content.Server/Speech/EmotesMenuSystem.cs create mode 100644 Content.Server/Station/Components/StationBiomeComponent.cs create mode 100644 Content.Server/Station/Systems/StationBiomeSystem.cs create mode 100644 Content.Server/StationEvents/Components/AlertLevelInterceptionRuleComponent.cs create mode 100644 Content.Server/StationEvents/Events/AlertLevelInterceptionRule.cs delete mode 100644 Content.Server/Terminator/Components/TerminatorComponent.cs delete mode 100644 Content.Server/Terminator/Components/TerminatorTargetComponent.cs delete mode 100644 Content.Server/Terminator/Systems/TerminatorSystem.cs delete mode 100644 Content.Server/Tools/Components/WelderComponent.cs delete mode 100644 Content.Server/Tools/ToolSystem.Welder.cs delete mode 100644 Content.Server/UserInterface/ActivatableUISystem.cs create mode 100644 Content.Shared/Access/Components/IdExaminableComponent.cs rename {Content.Server => Content.Shared}/Access/Systems/IdExaminableSystem.cs (85%) create mode 100644 Content.Shared/Actions/Events/ActionPerformedEvent.cs create mode 100644 Content.Shared/Actions/Events/ValidateActionEntityTargetEvent.cs create mode 100644 Content.Shared/Actions/Events/ValidateActionWorldTargetEvent.cs create mode 100644 Content.Shared/Armor/AllowSuitStorageComponent.cs rename {Content.Server => Content.Shared}/Atmos/GasMixture.cs (98%) create mode 100644 Content.Shared/Atmos/GasMixtureStringRepresentation.cs create mode 100644 Content.Shared/Atmos/GetFireProtectionEvent.cs create mode 100644 Content.Shared/Atmos/Reactions/GasReactionEnums.cs create mode 100644 Content.Shared/Chat/EmotesEvents.cs create mode 100644 Content.Shared/Chat/V2/Repository/Types.cs create mode 100644 Content.Shared/Chat/V2/Types.cs create mode 100644 Content.Shared/Chemistry/Components/MixableSolutionComponent.cs create mode 100644 Content.Shared/Chemistry/Components/ReagentTankComponent.cs create mode 100644 Content.Shared/Clothing/Components/FireProtectionComponent.cs create mode 100644 Content.Shared/Clothing/Components/HideLayerClothingComponent.cs create mode 100644 Content.Shared/Clothing/EntitySystems/FireProtectionSystem.cs create mode 100644 Content.Shared/CriminalRecords/Components/CriminalRecordsHackerComponent.cs create mode 100644 Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsHackerSystem.cs rename {Content.Server/Fax => Content.Shared/Fax/Components}/FaxMachineComponent.cs (80%) create mode 100644 Content.Shared/Fax/Components/FaxableObjectComponent.cs create mode 100644 Content.Shared/Fax/Components/FaxecuteComponent.cs create mode 100644 Content.Shared/Fax/DamageOnFaxecuteEvent.cs create mode 100644 Content.Shared/Fax/Systems/FaxecuteSystem.cs create mode 100644 Content.Shared/Geras/SharedGerasSystem.cs create mode 100644 Content.Shared/Ghost/Roles/GhostRolePrototype.cs create mode 100644 Content.Shared/Ghost/Roles/Raffles/GhostRoleRaffleSettings.cs create mode 100644 Content.Shared/Ghost/Roles/Raffles/GhostRoleRaffleSettingsPrototype.cs create mode 100644 Content.Shared/GridPreloader/Prototypes/PreloadedGridPrototype.cs create mode 100644 Content.Shared/GridPreloader/Systems/SharedGridPreloaderSystem.cs rename {Content.Server => Content.Shared}/HealthExaminable/HealthExaminableComponent.cs (71%) rename {Content.Server => Content.Shared}/HealthExaminable/HealthExaminableSystem.cs (96%) create mode 100644 Content.Shared/Humanoid/HumanoidProfileExport.cs create mode 100644 Content.Shared/Labels/Components/HandLabelerComponent.cs create mode 100644 Content.Shared/Labels/EntitySystems/SharedHandLabelerSystem.cs create mode 100644 Content.Shared/Light/EntitySystems/UnpoweredFlashlightSystem.cs create mode 100644 Content.Shared/Light/LightToggleEvent.cs create mode 100644 Content.Shared/Magic/Components/MagicComponent.cs rename {Content.Server => Content.Shared}/Magic/Components/SpellbookComponent.cs (60%) create mode 100644 Content.Shared/Magic/Components/WizardClothesComponent.cs create mode 100644 Content.Shared/Magic/Events/BeforeCastSpellEvent.cs create mode 100644 Content.Shared/Magic/Events/ChargeSpellEvent.cs create mode 100644 Content.Shared/Magic/Events/SpeakSpellEvent.cs create mode 100644 Content.Shared/Magic/MagicInstantSpawnData.cs delete mode 100644 Content.Shared/Magic/MagicSpawnData.cs create mode 100644 Content.Shared/Magic/SharedMagicSystem.cs create mode 100644 Content.Shared/Magic/SpellbookSystem.cs rename {Content.Server => Content.Shared}/MagicMirror/MagicMirrorComponent.cs (89%) rename {Content.Server => Content.Shared}/Nutrition/Components/DrinkComponent.cs (66%) create mode 100644 Content.Shared/Nutrition/Components/PressurizedSolutionComponent.cs create mode 100644 Content.Shared/Nutrition/Components/ShakeableComponent.cs create mode 100644 Content.Shared/Nutrition/EntitySystems/PressurizedSolutionSystem.cs create mode 100644 Content.Shared/Nutrition/EntitySystems/ShakeableSystem.cs create mode 100644 Content.Shared/Nutrition/EntitySystems/SharedDrinkSystem.cs create mode 100644 Content.Shared/Overlays/ShowCriminalRecordIconsComponent.cs rename Content.Shared/Overlays/{ShowSecurityIconsComponent.cs => ShowJobIconsComponent.cs} (51%) create mode 100644 Content.Shared/Overlays/ShowMindShieldIconsComponent.cs create mode 100644 Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs create mode 100644 Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs create mode 100644 Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs create mode 100644 Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs create mode 100644 Content.Shared/Preferences/Loadouts/Effects/SpeciesLoadoutEffect.cs create mode 100644 Content.Shared/Radio/Components/SharedRadioJammerComponent.cs create mode 100644 Content.Shared/Radio/EntitySystems/SharedJammerSystem.cs create mode 100644 Content.Shared/ReagentSpeed/ReagentSpeedComponent.cs create mode 100644 Content.Shared/ReagentSpeed/ReagentSpeedSystem.cs create mode 100644 Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs create mode 100644 Content.Shared/Robotics/RoboticsConsoleUi.cs create mode 100644 Content.Shared/Robotics/Systems/SharedRoboticsConsoleSystem.cs create mode 100644 Content.Shared/Roles/StartingGearEquippedEvent.cs create mode 100644 Content.Shared/Silicons/Borgs/Components/BorgTransponderComponent.cs delete mode 100644 Content.Shared/SimpleStation14/Traits/Components/NearsightedComponent.cs rename {Content.Server => Content.Shared}/Speech/Components/VocalComponent.cs (83%) create mode 100644 Content.Shared/StepTrigger/Components/ClothingRequiredStepTriggerComponent.cs create mode 100644 Content.Shared/StepTrigger/Components/ClothingRequiredStepTriggerImmuneComponent.cs delete mode 100644 Content.Shared/StepTrigger/Components/ShoesRequiredStepTriggerComponent.cs delete mode 100644 Content.Shared/StepTrigger/Systems/ShoesRequiredStepTriggerSystem.cs create mode 100644 Content.Shared/StepTrigger/Systems/StepTriggerImmuneSystem.cs create mode 100644 Content.Shared/Tips/TippyEvent.cs delete mode 100644 Content.Shared/Tools/Components/SharedWelderComponent.cs rename Content.Shared/Tools/Components/{SharedWeldable.cs => WeldableComponent.cs} (55%) create mode 100644 Content.Shared/Tools/Components/WelderComponent.cs create mode 100644 Content.Shared/Tools/Systems/SharedToolSystem.Welder.cs rename {Content.Server/Traits/Assorted => Content.Shared/Traits/Assorted/Components}/SelfAwareComponent.cs (91%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUIComponent.cs (59%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUIRequiresPowerCellComponent.cs (65%) rename {Content.Server => Content.Shared}/UserInterface/ActivatableUISystem.Power.cs (72%) create mode 100644 Content.Shared/UserInterface/ActivatableUISystem.cs create mode 100644 Content.Shared/Weapons/Ranged/Components/ActionGunComponent.cs create mode 100644 Content.Shared/Weapons/Ranged/Systems/ActionGunSystem.cs create mode 100644 Content.Shared/Whitelist/EntityWhitelistSystem.cs create mode 100644 Resources/Audio/Animals/fox1.ogg create mode 100644 Resources/Audio/Animals/fox10.ogg create mode 100644 Resources/Audio/Animals/fox11.ogg create mode 100644 Resources/Audio/Animals/fox12.ogg create mode 100644 Resources/Audio/Animals/fox13.ogg create mode 100644 Resources/Audio/Animals/fox14.ogg create mode 100644 Resources/Audio/Animals/fox2.ogg create mode 100644 Resources/Audio/Animals/fox3.ogg create mode 100644 Resources/Audio/Animals/fox4.ogg create mode 100644 Resources/Audio/Animals/fox5.ogg create mode 100644 Resources/Audio/Animals/fox6.ogg create mode 100644 Resources/Audio/Animals/fox7.ogg create mode 100644 Resources/Audio/Animals/fox8.ogg create mode 100644 Resources/Audio/Animals/fox9.ogg create mode 100644 Resources/Audio/Announcements/intercept.ogg create mode 100644 Resources/Audio/Effects/Footsteps/borgwalk1.ogg create mode 100644 Resources/Audio/Effects/Footsteps/borgwalk2.ogg create mode 100644 Resources/Audio/Effects/Grenades/SelfDestruct/SDS_Charge.ogg create mode 100644 Resources/Audio/Effects/Grenades/SelfDestruct/SDS_Charge2.ogg create mode 100644 Resources/Audio/Effects/Grenades/SelfDestruct/attributions.yml create mode 100644 Resources/Audio/Effects/chopstickbreak.ogg create mode 100644 Resources/Audio/Effects/spray3.ogg create mode 100644 Resources/Audio/Expedition/attributions.yml create mode 100644 Resources/Audio/Expedition/deadline.ogg rename Resources/Audio/{Misc => Expedition}/tension_session.ogg (100%) create mode 100644 Resources/Audio/Items/sheath.ogg create mode 100644 Resources/Audio/Items/soda_shake.ogg create mode 100644 Resources/Audio/Items/soda_spray.ogg create mode 100644 Resources/Audio/Items/unsheath.ogg create mode 100644 Resources/Audio/Jukebox/sunset.ogg create mode 100644 Resources/Audio/Voice/Silicon/attributions.yml create mode 100644 Resources/Audio/Voice/Silicon/syndieborg_laugh.ogg create mode 100644 Resources/Audio/Voice/Talk/Silicon/attributions.yml create mode 100644 Resources/Audio/Voice/Talk/Silicon/borg.ogg create mode 100644 Resources/Audio/Voice/Talk/Silicon/borg_ask.ogg create mode 100644 Resources/Audio/Voice/Talk/Silicon/borg_exclaim.ogg create mode 100644 Resources/Audio/Voice/Talk/Silicon/syndieborg.ogg create mode 100644 Resources/Audio/Voice/Talk/Silicon/syndieborg_ask.ogg create mode 100644 Resources/Audio/Voice/Talk/Silicon/syndieborg_exclaim.ogg create mode 100644 Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl create mode 100644 Resources/Locale/en-US/chat/chat-repo.ftl create mode 100644 Resources/Locale/en-US/chat/emotes.ftl create mode 100644 Resources/Locale/en-US/chat/ui/emote-menu.ftl create mode 100644 Resources/Locale/en-US/chemistry/components/solution-status.ftl create mode 100644 Resources/Locale/en-US/commands/tippy-command.ftl create mode 100644 Resources/Locale/en-US/damage/damage-groups.ftl create mode 100644 Resources/Locale/en-US/damage/damage-types.ftl delete mode 100644 Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl create mode 100644 Resources/Locale/en-US/geras/geras.ftl create mode 100644 Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl create mode 100644 Resources/Locale/en-US/inventory/item-status.ftl create mode 100644 Resources/Locale/en-US/magic/magic.ftl create mode 100644 Resources/Locale/en-US/markings/vox_tattoos.ftl create mode 100644 Resources/Locale/en-US/metabolism/metabolism-groups.ftl create mode 100644 Resources/Locale/en-US/metabolism/metabolizer-types.ftl create mode 100644 Resources/Locale/en-US/nutrition/components/pressurized-solution-component.ftl create mode 100644 Resources/Locale/en-US/nutrition/components/shakeable-component.ftl delete mode 100644 Resources/Locale/en-US/objectives/conditions/terminate.ftl create mode 100644 Resources/Locale/en-US/reagents/mannitol.ftl create mode 100644 Resources/Locale/en-US/reagents/psicodine.ftl create mode 100644 Resources/Locale/en-US/research/components/robotics-console.ftl create mode 100644 Resources/Locale/en-US/speech/speech-liar.ftl create mode 100644 Resources/Locale/en-US/station-events/events/intercept.ftl create mode 100644 Resources/Locale/en-US/station-events/events/unknown-shuttle.ftl create mode 100644 Resources/Locale/en-US/store/spellbook-catalog.ftl delete mode 100644 Resources/Locale/en-US/traits/disabilities.ftl delete mode 100644 Resources/Locale/en-US/ui/verbs.ftl create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/disaster_evacpod.yml create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/honki.yml create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/lost_cargo.yml rename Resources/Maps/Shuttles/{ => ShuttleEvent}/striker.yml (100%) create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/syndie_evacpod.yml create mode 100644 Resources/Maps/Shuttles/ShuttleEvent/traveling_china_cuisine.yml delete mode 100644 Resources/Prototypes/Body/Parts/terminator.yml delete mode 100644 Resources/Prototypes/Body/Prototypes/terminator.yml create mode 100644 Resources/Prototypes/Catalog/spellbook_catalog.yml create mode 100644 Resources/Prototypes/Datasets/corporations.yml create mode 100644 Resources/Prototypes/Entities/Debugging/tippy.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_tattoos.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Debugging/debug_counter.yml delete mode 100644 Resources/Prototypes/Entities/Mobs/Player/terminator.yml create mode 100644 Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml create mode 100644 Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml create mode 100644 Resources/Prototypes/Entities/Objects/Power/portable_recharger.yml create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml create mode 100644 Resources/Prototypes/GameRules/unknown_shuttles.yml create mode 100644 Resources/Prototypes/GhostRoleRaffles/deciders.yml create mode 100644 Resources/Prototypes/GhostRoleRaffles/settings.yml create mode 100644 Resources/Prototypes/Magic/event_spells.yml create mode 100644 Resources/Prototypes/Magic/utility_spells.yml create mode 100644 Resources/Prototypes/NPCs/debug.yml delete mode 100644 Resources/Prototypes/Objectives/terminator.yml rename Resources/Prototypes/{DeltaV/Recipes/Construction/Graphs/clothing/prescription_huds.yml => Recipes/Construction/Graphs/clothing/prescriptionhuds.yml} (100%) create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/structures/glassbox.yml create mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/bots/supplybot.yml delete mode 100644 Resources/Prototypes/Roles/Antags/terminator.yml create mode 100644 Resources/Prototypes/Roles/Ghostroles/syndicate.yml create mode 100644 Resources/Prototypes/Shaders/displacement.yml create mode 100644 Resources/Prototypes/Shuttles/shuttle_incoming_event.yml delete mode 100644 Resources/Prototypes/SimpleStation14/Traits/disabilities.yml delete mode 100644 Resources/Prototypes/SimpleStation14/tags.yml create mode 100644 Resources/Prototypes/SoundCollections/expeditions.yml create mode 100644 Resources/Prototypes/SoundCollections/fox.yml delete mode 100644 Resources/Prototypes/Species/terminator.yml create mode 100644 Resources/Prototypes/floor_trap.yml create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/equipped-EYES.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/equipped-HAND.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertjanitor.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertjanitor.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertjanitor.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertjanitor.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertjanitor.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertjanitor.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertleader.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertleader.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertleader.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertleader.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertleader.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertleader.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertmedical.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertmedical.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertmedical.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertmedical.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertmedical.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertmedical.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertsecurity.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertsecurity.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertsecurity.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertsecurity.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertsecurity.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/ERThelmets/ertsecurity.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/equipped-head-light-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/equipped-head-unshaded-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/equipped-head-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/inhand-left-light.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/inhand-left-unshaded.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/inhand-right-light.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/inhand-right-unshaded.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cburn.rsi/equipped-head-unshaded-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cburn.rsi/equipped-head-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cburn.rsi/inhand-left-unshaded.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cburn.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cburn.rsi/inhand-right-unshaded.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cburn.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/clown.rsi/off-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/clown.rsi/on-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/deathsquad.rsi/equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/deathsquad.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/deathsquad.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/engineering.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/luxury.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/luxury.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/luxury.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/luxury.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/luxury.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/luxury.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/maxim.rsi/equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/maxim.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/maxim.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/medical.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/medical.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/medical.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/medical.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/medical.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/medical.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/pirateeva.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/rd.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/salvage.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/salvage.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/salvage.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/salvage.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/salvage.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/salvage.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/santahelm.rsi/equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/santahelm.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/santahelm.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-red.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-red.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-red.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-red.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-red.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-red.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-warden.rsi/off-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security-warden.rsi/on-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/security.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/equipped-head-light-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/equipped-head-unshaded-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/equipped-head-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/inhand-left-light.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/inhand-left-unshaded.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/inhand-right-light.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/inhand-right-unshaded.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/spatiohelm.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndicate.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndicate.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndicate.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndicate.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndicate.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndicate.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiecommander.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiecommander.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiecommander.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiecommander.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiecommander.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiecommander.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndieelite.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndieelite.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndieelite.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndieelite.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndieelite.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndieelite.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/wizard.rsi/off-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/wizard.rsi/off-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/wizard.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/wizard.rsi/on-equipped-HELMET-vox.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/wizard.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/wizard.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/gladiator.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/paper.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/surgcap_blue.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/surgcap_green.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/surgcap_purple.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/atmos_firehelmet.rsi/off-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/atmos_firehelmet.rsi/on-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/bombsuit.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/eva.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/eva_large.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/eva_syndicate.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/firehelmet.rsi/off-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/firehelmet.rsi/on-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/ihvoid.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/light_riot.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/security.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/spaceninja.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/swat.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/swat_syndicate.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/templar.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Helmets/wizardhelm.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/bio.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/cmo.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/general.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/janitor.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/scientist.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/security.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hoods/Bio/virology.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Misc/chickenhead.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/blue_flame_welding_mask.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/blue_flame_welding_mask.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/flame_welding_mask.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/flame_welding_mask.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/paintedwelding.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/paintedwelding.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/welding.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Welding/welding.rsi/up-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Mask/bee.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/breath.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/clown.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gas.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gasatmos.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gascaptain.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gasexplorer.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gassecurity.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gassecurity.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/gassyndicate.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/italian_moustache.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/medical.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/medical.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/mime.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/muzzle.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/ninja.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/plaguedoctormask.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sexyclown.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sexymime.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sterile.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/sterile.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/swat.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-left.png create mode 100644 Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/armor_reflec.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/captain_carapace.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/cult_armour.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/heavygreen.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/heavyred.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/cmo.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/general.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/janitor.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/scientist.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/security.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Bio/virology.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/expensive_coat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/hos_trenchcoat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/jensencoat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat.rsi/open-equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_chem.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_chem.rsi/open-equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_cmo.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_cmo.rsi/open-equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_gene.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_gene.rsi/open-equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_viro.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/labcoat_viro.rsi/open-equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/pirate.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/rndcoat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/rndcoat.rsi/open-equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Coats/warden.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertsecurity.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/cburn.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/clown.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/deathsquad.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/maxim.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/piratecaptain.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/pirateeva.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/santahardsuit.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/security-red.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/security-warden.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/security.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/wizard.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/apronbotanist.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/apronchef.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/cardborg.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/chef.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/classicponcho.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/ghostsheet.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/grey_hoodie.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/nunrobe.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/red_racoon.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/redwizard.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/skubbody.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/straight_jacket.rsi/body-overlay-2-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/violetwizard.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/chicken.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/monkey.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/detvest.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/hazard.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/vest.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/webvest.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coat.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatatmos.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatbar.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcap.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcargo.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatce.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatclown.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatengi.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathosarmored.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coathydro.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatmed.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatmime.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatminer.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatparamed.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatsci.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatsec.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwarden.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/coatwardenarmored.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Shoes/Boots/jackboots.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-advanced.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-advanced.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-syndicate.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots-syndicate.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/magboots.rsi/on-equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Misc/slippers.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Misc/tourist.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Specific/clown.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Specific/swat.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Shoes/Specific/wizard.rsi/equipped-FEET-vox.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/meta.json create mode 100644 Resources/Textures/Effects/creampie.rsi/creampie_vox.png create mode 100644 Resources/Textures/Interface/Alerts/deflecting.rsi/deflecting0.png rename Resources/Textures/{Objects/Fun/whistle.rsi => Interface/Alerts/deflecting.rsi}/meta.json (64%) create mode 100644 Resources/Textures/Interface/Ashen/item_status_left.png create mode 100644 Resources/Textures/Interface/Ashen/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Ashen/item_status_right.png create mode 100644 Resources/Textures/Interface/Ashen/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Ashen/template_small.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_left.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_right.png create mode 100644 Resources/Textures/Interface/Clockwork/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Default/item_status_left.png create mode 100644 Resources/Textures/Interface/Default/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Default/item_status_right.png create mode 100644 Resources/Textures/Interface/Default/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Emotes/attributions.yml create mode 100644 Resources/Textures/Interface/Emotes/beep.png create mode 100644 Resources/Textures/Interface/Emotes/buzz.png create mode 100644 Resources/Textures/Interface/Emotes/buzztwo.png create mode 100644 Resources/Textures/Interface/Emotes/chime.png create mode 100644 Resources/Textures/Interface/Emotes/chirp.png create mode 100644 Resources/Textures/Interface/Emotes/chitter.png create mode 100644 Resources/Textures/Interface/Emotes/clap.png create mode 100644 Resources/Textures/Interface/Emotes/click.png create mode 100644 Resources/Textures/Interface/Emotes/cough.png create mode 100644 Resources/Textures/Interface/Emotes/cry.png create mode 100644 Resources/Textures/Interface/Emotes/deathgasp.png create mode 100644 Resources/Textures/Interface/Emotes/honk.png create mode 100644 Resources/Textures/Interface/Emotes/laugh.png create mode 100644 Resources/Textures/Interface/Emotes/ping.png create mode 100644 Resources/Textures/Interface/Emotes/salute.png create mode 100644 Resources/Textures/Interface/Emotes/sigh.png create mode 100644 Resources/Textures/Interface/Emotes/snap.png create mode 100644 Resources/Textures/Interface/Emotes/squeak.png create mode 100644 Resources/Textures/Interface/Emotes/squish.png create mode 100644 Resources/Textures/Interface/Emotes/vocal.png create mode 100644 Resources/Textures/Interface/Emotes/weh.png create mode 100644 Resources/Textures/Interface/Emotes/whistle.png create mode 100644 Resources/Textures/Interface/Emotes/yawn.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_left.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_right.png create mode 100644 Resources/Textures/Interface/Minimalist/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Minimalist/template_small.png create mode 100644 Resources/Textures/Interface/Nano/help.png delete mode 100644 Resources/Textures/Interface/Nano/item_status_left.svg delete mode 100644 Resources/Textures/Interface/Nano/item_status_left.svg.96dpi.png delete mode 100644 Resources/Textures/Interface/Nano/item_status_middle.svg delete mode 100644 Resources/Textures/Interface/Nano/item_status_middle.svg.96dpi.png delete mode 100644 Resources/Textures/Interface/Nano/item_status_right.svg delete mode 100644 Resources/Textures/Interface/Nano/item_status_right.svg.96dpi.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_left.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_right.png create mode 100644 Resources/Textures/Interface/Plasmafire/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Retro/item_status_left.png create mode 100644 Resources/Textures/Interface/Retro/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Retro/item_status_right.png create mode 100644 Resources/Textures/Interface/Retro/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/Retro/template_small.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_left.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_left_highlight.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_right.png create mode 100644 Resources/Textures/Interface/Slimecore/item_status_right_highlight.png create mode 100644 Resources/Textures/Interface/emotes.svg create mode 100644 Resources/Textures/Interface/emotes.svg.192dpi.png create mode 100644 Resources/Textures/Interface/emotes.svg.192dpi.png.yml create mode 100644 Resources/Textures/LobbyScreens/justaweekaway.webp create mode 100644 Resources/Textures/LobbyScreens/justaweekaway.yml delete mode 100644 Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png create mode 100644 Resources/Textures/Mobs/Customization/human_hair.rsi/spookylong.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/frills_neckfull.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_primary.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/snout_splotch_secondary.png create mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/beard_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/colonel_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/fu_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/mane_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/neck_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/vox_beard_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/vox_colonel_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/vox_fu_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/vox_neck_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/vox_ruff_beard_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_facial_hair.rsi/vox_ruff_beard_s2.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/afro_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/braid_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/crestedquills_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/emperorquills_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/flowing_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/hawk_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/horns_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/keelquills_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/keetquills_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/kingly_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/long_braid_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/mange_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/mohawk_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/nights_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/ponytail_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/razor_clipped_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/razor_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/short_braid_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/shortquills_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/surf_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/tielquills_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_afro_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_afro_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_bald_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_cropped_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_cropped_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_horns_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_horns_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_kingly_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_kingly_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_mange_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_mange_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_mohawk_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_mohawk_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_nights_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_nights_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_pony_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_pony_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_rows_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_rows_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_ruff_hawk_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_ruff_hawk_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_shortquills_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_shortquills_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_surf_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_surf_s2.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_yasu_s.png delete mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/vox_yasu_s2.png create mode 100644 Resources/Textures/Mobs/Customization/vox_hair.rsi/yasu_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/tail.png create mode 100644 Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png create mode 100644 Resources/Textures/Mobs/Customization/vox_tattoos.rsi/heart_l_arm.png create mode 100644 Resources/Textures/Mobs/Customization/vox_tattoos.rsi/heart_r_arm.png create mode 100644 Resources/Textures/Mobs/Customization/vox_tattoos.rsi/hive_s.png create mode 100644 Resources/Textures/Mobs/Customization/vox_tattoos.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/vox_tattoos.rsi/nightling_s.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_m.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/head.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/head_f.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/torso.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png delete mode 100644 Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/budgetinsulsdrink.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colaglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dr_gibb_glass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/greenteaglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icebucket.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icebucket.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/icedgreenteaglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/iceglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jigger.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jigger.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lemonjuiceglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/moonshineglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuiceglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rubberneck.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_glass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_glass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/fill-7.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/sugarglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/teaglass.rsi/icon_empty.png delete mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillaglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tonicglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/watermelonglass.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/xenobasher.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar-gold.rsi/lit-equipped-MASK-vox.png create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar-gold.rsi/unlit-equipped-MASK-vox.png create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar.rsi/lit-equipped-MASK-vox.png create mode 100644 Resources/Textures/Objects/Consumable/Smokeables/Cigars/cigar.rsi/unlit-equipped-MASK-vox.png rename Resources/Textures/Objects/Consumable/TrashDrinks/{goldschlagerbottle_empty.rsi => gildlagerbottle_empty.rsi}/icon.png (100%) rename Resources/Textures/Objects/Consumable/TrashDrinks/{goldschlagerbottle_empty.rsi => gildlagerbottle_empty.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Objects/Devices/chameleon_projector.rsi/icon.png create mode 100644 Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/chameleon_projector.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/chameleon_projector.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/flatpack.rsi/emitter.png delete mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer_high_charge.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer_low_charge.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer_medium_charge.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-off.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie-on.png create mode 100644 Resources/Textures/Objects/Devices/securityhandy.rsi/walkietalkie.png create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/equipped-NECK.png create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/meta.json create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/sec-equipped-NECK.png rename Resources/Textures/Objects/Fun/{whistle.rsi/securityWhistle.png => whistles.rsi/sec.png} (100%) rename Resources/Textures/{Clothing/Neck/Misc/whistles.rsi/equipped-NECK.png => Objects/Fun/whistles.rsi/trench-equipped-NECK.png} (100%) rename Resources/Textures/{Clothing/Neck/Misc/whistles.rsi/icon.png => Objects/Fun/whistles.rsi/trench.png} (100%) create mode 100644 Resources/Textures/Objects/Fun/whistles.rsi/whistle.png create mode 100644 Resources/Textures/Objects/Materials/materials.rsi/pyrotton.png create mode 100644 Resources/Textures/Objects/Materials/materials.rsi/pyrotton_2.png create mode 100644 Resources/Textures/Objects/Materials/materials.rsi/pyrotton_3.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/icon.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/meta.json create mode 100644 Resources/Textures/Objects/Misc/chopstick.rsi/paired.png create mode 100644 Resources/Textures/Objects/Misc/utensils.rsi/bar_spoon-inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/utensils.rsi/bar_spoon-inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/utensils.rsi/bar_spoon.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/charging-equipped-BACKPACK.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/charging-unlit.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/charging.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Power/portable_recharger.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/icon.png create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Chapel/quran.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/pyrotton.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/dead.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/dried.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/harvest.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/powderpile_rainbow.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/produce.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/seed.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/stage-1.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/stage-2.png create mode 100644 Resources/Textures/Objects/Specific/Hydroponics/rainbow_cannabis.rsi/stage-3.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-bomb.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/syndicateborgbomb.png create mode 100644 Resources/Textures/Objects/Storage/boxes.rsi/shelluranium.png create mode 100644 Resources/Textures/Objects/Tanks/emergency.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_clown.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_double.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_double_red.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_extended.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_red.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/emergency_yellow.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Tanks/plasma.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/db-inhand-left.png => db_shotgun_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/db-inhand-right.png => db_shotgun_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/enforcer-inhand-left.png => enforcer_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/enforcer-inhand-right.png => enforcer_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/improvised-inhand-left.png => improvised_shotgun_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/improvised-inhand-right.png => improvised_shotgun_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi/wielded-inhand-right.png delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/inhands_64x.rsi/meta.json rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/pump-inhand-left.png => pump_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/pump-inhand-right.png => pump_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi/wielded-inhand-right.png rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/sawn-inhand-left.png => sawn_inhands_64x.rsi/inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Guns/Shotguns/{inhands_64x.rsi/sawn-inhand-right.png => sawn_inhands_64x.rsi/inhand-right.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn_inhands_64x.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/cane-empty.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/cane.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane_blade.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane_blade.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/cane_blade.rsi/inhand-right.png rename Resources/Textures/{Clothing/Neck/Misc/whistles.rsi => Objects/Weapons/Melee/cane_blade.rsi}/meta.json (54%) create mode 100644 Resources/Textures/Shaders/displacement.swsl create mode 100644 Resources/Textures/Structures/Machines/artifact_crusher.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/building.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/panel.png create mode 100644 Resources/Textures/Structures/Machines/circuit_imprinter_hypercon.rsi/unlit.png rename Resources/Textures/{Clothing/Head/Bandanas/botany.rsi/equipped-HELMET-hamster.png => Structures/Machines/fax_machine.rsi/inserting_hamster.png} (68%) create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mothroach.png create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mouse.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Bend-inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Bend-inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Fourway-inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/Fourway-inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/TJunction-inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/TJunction-inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/inhand-left.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/inhand-right.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/storageBend.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/storageStraight.png create mode 100644 Resources/Textures/Structures/Piping/Atmospherics/pipe.rsi/storageTJunction.png rename Resources/Textures/Structures/Storage/glassbox.rsi/{glassbox-empty-open.png => base.png} (100%) rename Resources/Textures/Structures/Storage/glassbox.rsi/{glass-4.png => glass-broken.png} (100%) delete mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/glassbox-filled-closed.png delete mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/glassbox-filled-open.png delete mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/glassbox.png create mode 100644 Resources/Textures/Structures/Storage/glassbox.rsi/icon.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_0.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_1.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_2.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_3.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_4.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_5.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_6.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy_7.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_0.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_1.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_2.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_3.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_4.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_5.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_6.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell_7.png create mode 100644 Resources/Textures/Tiles/Misc/floortrap.rsi/floortrap.png create mode 100644 Resources/Textures/Tiles/Misc/floortrap.rsi/floortrapspawn.png create mode 100644 Resources/Textures/Tiles/Misc/floortrap.rsi/meta.json create mode 100644 Resources/Textures/Tips/tippy.rsi/down.png create mode 100644 Resources/Textures/Tips/tippy.rsi/left.png create mode 100644 Resources/Textures/Tips/tippy.rsi/meta.json create mode 100644 Resources/Textures/Tips/tippy.rsi/right.png create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua create mode 100644 Tools/SS14 Aseprite Plugins/Displacement Map.png diff --git a/.editorconfig b/.editorconfig index 58d0d332bb..3e44d1a281 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,9 +9,10 @@ indent_style = space tab_width = 4 # New line preferences -end_of_line = crlf:suggestion +#end_of_line = crlf insert_final_newline = true trim_trailing_whitespace = true +max_line_length = 120 #### .NET Coding Conventions #### @@ -104,7 +105,6 @@ csharp_preferred_modifier_order = public, private, protected, internal, new, abs # 'using' directive preferences csharp_using_directive_placement = outside_namespace:silent -csharp_style_namespace_declarations = file_scoped:suggestion #### C# Formatting Rules #### @@ -337,7 +337,11 @@ dotnet_naming_symbols.type_parameters_symbols.applicable_kinds = type_parameter # ReSharper properties resharper_braces_for_ifelse = required_for_multiline +resharper_csharp_wrap_arguments_style = chop_if_long +resharper_csharp_wrap_parameters_style = chop_if_long resharper_keep_existing_attribute_arrangement = true +resharper_wrap_chained_binary_patterns = chop_if_long +resharper_wrap_chained_method_calls = chop_if_long [*.{csproj,xml,yml,yaml,dll.config,msbuildproj,targets,props}] indent_size = 2 diff --git a/.github/labeler.yml b/.github/labeler.yml index eb01eeecc4..6b87aa2655 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,39 +1,56 @@ "Changes: Audio": - - "**/*.ogg" - + - changed-files: + - any-glob-to-any-file: "**/*.ogg" + "Changes: C#": - - "**/*.cs" + - changed-files: + - any-glob-to-any-file: "**/*.cs" "Changes: Config": - - "**/*.toml" - - "**/*.config" - - "*.json" - - ".github/*.yml" - - ".github/*.json" - - ".vscode/*.json" - - ".editorconfig" +- changed-files: + - any-glob-to-any-file: + - "**/*.toml" + - "**/*.config" + - "*.json" + - ".github/*.yml" + - ".github/*.json" + - ".vscode/*.json" + - ".editorconfig" "Changes: Documentation": - - "**/*.xml" - - "**/*.md" + - changed-files: + - any-glob-to-any-file: + - "**/*.xml" + - "**/*.md" "Changes: Localization": -- 'Resources/Locale/**/*.ftl' + - changed-files: + - any-glob-to-any-file: 'Resources/Locale/**/*.ftl' "Changes: Map": - - "Resources/Maps/**/*.yml" - - "Resources/Prototypes/Maps/**/*.yml" + - changed-files: + - any-glob-to-any-file: + - "Resources/Maps/**/*.yml" + - "Resources/Prototypes/Maps/**/*.yml" "Changes: Sprite": - - "**/*.rsi/*.png" - - "**/*.rsi/*.json" + - changed-files: + - any-glob-to-any-file: + - "**/*.rsi/*.png" + - "**/*.rsi/*.json" "Changes: UI": - - "**/*.xaml*" + - changed-files: + - any-glob-to-any-file: "**/*.xaml*" "Changes: YML": - - any: ["**/*.yml"] - all: ["!Resources/Maps/**/*.yml", "!Resources/Prototypes/Maps/**/*.yml"] + - changed-files: + - any-glob-to-any-file: + - "**/*.yml" + - all-globs-to-all-files: + - "!Resources/Maps/**/*.yml", + - "!Resources/Prototypes/Maps/**/*.yml" "Changes: Workflow": - - ".github/workflows/*.yml" + - changed-files: + - any-glob-to-any-file: ".github/workflows/*.yml" diff --git a/.github/workflows/conflict-labeler.yml b/.github/workflows/conflict-labeler.yml index 152d3a9f3c..1bba677022 100644 --- a/.github/workflows/conflict-labeler.yml +++ b/.github/workflows/conflict-labeler.yml @@ -1,18 +1,20 @@ name: Check Merge Conflicts on: - push: - branches: - - master pull_request_target: + types: + - opened + - synchronize + - reopened + - ready_for_review jobs: Label: - if: github.actor != 'PJBot' && github.actor != 'DeltaV-Bot' && github.actor != 'SimpleStation14' + if: ( github.event.pull_request.draft == false ) && ( github.actor != 'PJBot' && github.actor != 'DeltaV-Bot' && github.actor != 'SimpleStation14' ) runs-on: ubuntu-latest steps: - name: Check for Merge Conflicts - uses: ike709/actions-label-merge-conflict@9eefdd17e10566023c46d2dc6dc04fcb8ec76142 + uses: eps1lon/actions-label-merge-conflict@v3.0.0 with: dirtyLabel: "Status: Merge Conflict" repoToken: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/labeler-pr.yml b/.github/workflows/labeler-pr.yml index efb051f4cc..2fd754b15e 100644 --- a/.github/workflows/labeler-pr.yml +++ b/.github/workflows/labeler-pr.yml @@ -6,8 +6,9 @@ on: jobs: labeler: if: github.actor != 'PJBot' && github.actor != 'DeltaV-Bot' && github.actor != 'SimpleStation14' + permissions: + contents: read + pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v3 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" + - uses: actions/labeler@v5 diff --git a/Content.Client/Access/IdCardSystem.cs b/Content.Client/Access/IdCardSystem.cs index fcf2bf57de..e0c02976f7 100644 --- a/Content.Client/Access/IdCardSystem.cs +++ b/Content.Client/Access/IdCardSystem.cs @@ -2,6 +2,4 @@ namespace Content.Client.Access; -public sealed class IdCardSystem : SharedIdCardSystem -{ -} +public sealed class IdCardSystem : SharedIdCardSystem; diff --git a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs index 73f18aec8d..c3fac8cb92 100644 --- a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs +++ b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs @@ -40,9 +40,9 @@ private void OnJobChanged(string newJob) SendMessage(new AgentIDCardJobChangedMessage(newJob)); } - public void OnJobIconChanged(string newJobIcon) + public void OnJobIconChanged(string newJobIconId) { - SendMessage(new AgentIDCardJobIconChangedMessage(newJobIcon)); + SendMessage(new AgentIDCardJobIconChangedMessage(newJobIconId)); } /// @@ -57,7 +57,7 @@ protected override void UpdateState(BoundUserInterfaceState state) _window.SetCurrentName(cast.CurrentName); _window.SetCurrentJob(cast.CurrentJob); - _window.SetAllowedIcons(cast.Icons); + _window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId); } protected override void Dispose(bool disposing) diff --git a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs index beca0c41ba..9a38c0c485 100644 --- a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs +++ b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs @@ -38,7 +38,7 @@ public AgentIDCardWindow(AgentIDCardBoundUserInterface bui) JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text); } - public void SetAllowedIcons(HashSet icons) + public void SetAllowedIcons(HashSet icons, string currentJobIconId) { IconGrid.DisposeAllChildren(); @@ -79,6 +79,10 @@ public void SetAllowedIcons(HashSet icons) jobIconButton.AddChild(jobIconTexture); jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIcon.ID); IconGrid.AddChild(jobIconButton); + + if (jobIconId.Equals(currentJobIconId)) + jobIconButton.Pressed = true; + i++; } } diff --git a/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs b/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs index 5b7011c195..a321b4121e 100644 --- a/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs +++ b/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs @@ -1,6 +1,5 @@ using Content.Shared.Access; using Content.Shared.Access.Components; -using Content.Shared.Access; using Content.Shared.Access.Systems; using Content.Shared.Containers.ItemSlots; using Content.Shared.CrewManifest; diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index 90158ba81e..0bc65eb935 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -249,7 +249,10 @@ public void TriggerAction(EntityUid actionId, BaseActionComponent action) if (action.ClientExclusive) { if (instantAction.Event != null) + { instantAction.Event.Performer = user; + instantAction.Event.Action = actionId; + } PerformAction(user, actions, actionId, instantAction, instantAction.Event, GameTiming.CurTime); } diff --git a/Content.Client/Administration/Components/HeadstandComponent.cs b/Content.Client/Administration/Components/HeadstandComponent.cs index d95e74576b..a4e3bfc5aa 100644 --- a/Content.Client/Administration/Components/HeadstandComponent.cs +++ b/Content.Client/Administration/Components/HeadstandComponent.cs @@ -3,7 +3,7 @@ namespace Content.Client.Administration.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class HeadstandComponent : SharedHeadstandComponent { diff --git a/Content.Client/Administration/Components/KillSignComponent.cs b/Content.Client/Administration/Components/KillSignComponent.cs index 1cf47b93ff..91c44ef3f2 100644 --- a/Content.Client/Administration/Components/KillSignComponent.cs +++ b/Content.Client/Administration/Components/KillSignComponent.cs @@ -3,6 +3,5 @@ namespace Content.Client.Administration.Components; -[NetworkedComponent, RegisterComponent] -public sealed partial class KillSignComponent : SharedKillSignComponent -{ } +[RegisterComponent] +public sealed partial class KillSignComponent : SharedKillSignComponent; diff --git a/Content.Client/Administration/Managers/ClientAdminManager.cs b/Content.Client/Administration/Managers/ClientAdminManager.cs index fdd62fb6a2..0f740c8104 100644 --- a/Content.Client/Administration/Managers/ClientAdminManager.cs +++ b/Content.Client/Administration/Managers/ClientAdminManager.cs @@ -126,12 +126,15 @@ void IPostInjectInit.PostInject() public AdminData? GetAdminData(EntityUid uid, bool includeDeAdmin = false) { - return uid == _player.LocalEntity ? _adminData : null; + if (uid == _player.LocalEntity && (_adminData?.Active ?? includeDeAdmin)) + return _adminData; + + return null; } public AdminData? GetAdminData(ICommonSession session, bool includeDeAdmin = false) { - if (_player.LocalUser == session.UserId) + if (_player.LocalUser == session.UserId && (_adminData?.Active ?? includeDeAdmin)) return _adminData; return null; diff --git a/Content.Client/Administration/Systems/AdminVerbSystem.cs b/Content.Client/Administration/Systems/AdminVerbSystem.cs index e0f84bc4f0..dced59bbf2 100644 --- a/Content.Client/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Client/Administration/Systems/AdminVerbSystem.cs @@ -1,3 +1,6 @@ +using Content.Shared.Administration; +using Content.Shared.Administration.Managers; +using Content.Shared.Mind.Components; using Content.Shared.Verbs; using Robust.Client.Console; using Robust.Shared.Utility; @@ -11,10 +14,12 @@ sealed class AdminVerbSystem : EntitySystem { [Dependency] private readonly IClientConGroupController _clientConGroupController = default!; [Dependency] private readonly IClientConsoleHost _clientConsoleHost = default!; + [Dependency] private readonly ISharedAdminManager _admin = default!; public override void Initialize() { SubscribeLocalEvent>(AddAdminVerbs); + } private void AddAdminVerbs(GetVerbsEvent args) @@ -33,6 +38,24 @@ private void AddAdminVerbs(GetVerbsEvent args) }; args.Verbs.Add(verb); } + + if (!_admin.IsAdmin(args.User)) + return; + + if (_admin.HasAdminFlag(args.User, AdminFlags.Admin)) + args.ExtraCategories.Add(VerbCategory.Admin); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Fun) && HasComp(args.Target)) + args.ExtraCategories.Add(VerbCategory.Antag); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Debug)) + args.ExtraCategories.Add(VerbCategory.Debug); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Fun)) + args.ExtraCategories.Add(VerbCategory.Smite); + + if (_admin.HasAdminFlag(args.User, AdminFlags.Admin)) + args.ExtraCategories.Add(VerbCategory.Tricks); } } } diff --git a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs index 1f32640f7d..dc263d6055 100644 --- a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs +++ b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs @@ -3,6 +3,7 @@ using System.Net.Sockets; using Content.Client.Administration.UI.CustomControls; using Content.Shared.Administration; +using Content.Shared.CCVar; using Content.Shared.Database; using Content.Shared.Roles; using Robust.Client.AutoGenerated; @@ -11,6 +12,7 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -32,8 +34,11 @@ public sealed partial class BanPanel : DefaultWindow // This is less efficient than just holding a reference to the root control and enumerating children, but you // have to know how the controls are nested, which makes the code more complicated. private readonly List _roleCheckboxes = new(); + private readonly ISawmill _banpanelSawmill; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ILogManager _logManager = default!; private enum TabNumbers { @@ -65,6 +70,7 @@ public BanPanel() { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + _banpanelSawmill = _logManager.GetSawmill("admin.banpanel"); PlayerList.OnSelectionChanged += OnPlayerSelectionChanged; PlayerNameLine.OnFocusExit += _ => OnPlayerNameChanged(); PlayerCheckbox.OnPressed += _ => @@ -104,6 +110,11 @@ public BanPanel() }; SubmitButton.OnPressed += SubmitButtonOnOnPressed; + IpCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanIpBanDefault); + HwidCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanHwidBanDefault); + LastConnCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanUseLastDetails); + EraseCheckbox.Pressed = _cfg.GetCVar(CCVars.ServerBanErasePlayer); + SeverityOption.AddItem(Loc.GetString("admin-note-editor-severity-none"), (int) NoteSeverity.None); SeverityOption.AddItem(Loc.GetString("admin-note-editor-severity-low"), (int) NoteSeverity.Minor); SeverityOption.AddItem(Loc.GetString("admin-note-editor-severity-medium"), (int) NoteSeverity.Medium); @@ -175,6 +186,39 @@ private void CreateRoleGroup(string roleName, IEnumerable roleList, Colo c.Pressed = args.Pressed; } } + + if (args.Pressed) + { + if (!Enum.TryParse(_cfg.GetCVar(CCVars.DepartmentBanDefaultSeverity), true, out NoteSeverity newSeverity)) + { + _banpanelSawmill + .Warning("Departmental role ban severity could not be parsed from config!"); + return; + } + SeverityOption.SelectId((int) newSeverity); + } + else + { + foreach (var childContainer in RolesContainer.Children) + { + if (childContainer is Container) + { + foreach (var child in childContainer.Children) + { + if (child is CheckBox { Pressed: true }) + return; + } + } + } + + if (!Enum.TryParse(_cfg.GetCVar(CCVars.RoleBanDefaultSeverity), true, out NoteSeverity newSeverity)) + { + _banpanelSawmill + .Warning("Role ban severity could not be parsed from config!"); + return; + } + SeverityOption.SelectId((int) newSeverity); + } }; outerContainer.AddChild(innerContainer); foreach (var role in roleList) @@ -353,6 +397,35 @@ private void OnTypeChanged() { TypeOption.ModulateSelfOverride = null; Tabs.SetTabVisible((int) TabNumbers.Roles, TypeOption.SelectedId == (int) Types.Role); + NoteSeverity? newSeverity = null; + switch (TypeOption.SelectedId) + { + case (int)Types.Server: + if (Enum.TryParse(_cfg.GetCVar(CCVars.ServerBanDefaultSeverity), true, out NoteSeverity serverSeverity)) + newSeverity = serverSeverity; + else + { + _banpanelSawmill + .Warning("Server ban severity could not be parsed from config!"); + } + + break; + case (int) Types.Role: + + if (Enum.TryParse(_cfg.GetCVar(CCVars.RoleBanDefaultSeverity), true, out NoteSeverity roleSeverity)) + { + newSeverity = roleSeverity; + } + else + { + _banpanelSawmill + .Warning("Role ban severity could not be parsed from config!"); + } + break; + } + + if (newSeverity != null) + SeverityOption.SelectId((int) newSeverity.Value); } private void UpdateSubmitEnabled() diff --git a/Content.Client/Animations/TrackUserComponent.cs b/Content.Client/Animations/TrackUserComponent.cs new file mode 100644 index 0000000000..374c187398 --- /dev/null +++ b/Content.Client/Animations/TrackUserComponent.cs @@ -0,0 +1,17 @@ +using System.Numerics; + +namespace Content.Client.Animations; + +/// +/// Entities with this component tracks the user's world position every frame. +/// +[RegisterComponent] +public sealed partial class TrackUserComponent : Component +{ + public EntityUid? User; + + /// + /// Offset in the direction of the entity's rotation. + /// + public Vector2 Offset = Vector2.Zero; +} diff --git a/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs b/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs index b105e629cf..b54af3a587 100644 --- a/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs +++ b/Content.Client/Atmos/UI/GasAnalyzerWindow.xaml.cs @@ -163,6 +163,26 @@ private void GenerateGasDisplay(GasMixEntry gasMix, Control parent) parent.AddChild(panel); panel.AddChild(dataContainer); + // Volume label + var volBox = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Horizontal }; + + volBox.AddChild(new Label + { + Text = Loc.GetString("gas-analyzer-window-volume-text") + }); + volBox.AddChild(new Control + { + MinSize = new Vector2(10, 0), + HorizontalExpand = true + }); + volBox.AddChild(new Label + { + Text = Loc.GetString("gas-analyzer-window-volume-val-text", ("volume", $"{gasMix.Volume:0.##}")), + Align = Label.AlignMode.Right, + HorizontalExpand = true + }); + dataContainer.AddChild(volBox); + // Pressure label var presBox = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Horizontal }; diff --git a/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs b/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs index 072730d65d..60fe339069 100644 --- a/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs +++ b/Content.Client/Audio/Jukebox/JukeboxBoundUserInterface.cs @@ -9,7 +9,6 @@ namespace Content.Client.Audio.Jukebox; public sealed class JukeboxBoundUserInterface : BoundUserInterface { - [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; [ViewVariables] diff --git a/Content.Client/Audio/Jukebox/JukeboxSystem.cs b/Content.Client/Audio/Jukebox/JukeboxSystem.cs index 53bde82a78..dd4a5bbb9b 100644 --- a/Content.Client/Audio/Jukebox/JukeboxSystem.cs +++ b/Content.Client/Audio/Jukebox/JukeboxSystem.cs @@ -11,6 +11,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; public override void Initialize() { @@ -35,13 +36,10 @@ private void OnProtoReload(PrototypesReloadedEventArgs obj) var query = AllEntityQuery(); - while (query.MoveNext(out _, out var ui)) + while (query.MoveNext(out var uid, out _, out var ui)) { - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { + if (!_uiSystem.TryGetOpenUi((uid, ui), JukeboxUiKey.Key, out var bui)) continue; - } bui.PopulateMusic(); } @@ -49,15 +47,9 @@ private void OnProtoReload(PrototypesReloadedEventArgs obj) private void OnJukeboxAfterState(Entity ent, ref AfterAutoHandleStateEvent args) { - if (!TryComp(ent, out UserInterfaceComponent? ui)) + if (!_uiSystem.TryGetOpenUi(ent.Owner, JukeboxUiKey.Key, out var bui)) return; - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { - return; - } - bui.Reload(); } diff --git a/Content.Client/CardboardBox/CardboardBoxSystem.cs b/Content.Client/CardboardBox/CardboardBoxSystem.cs index 90a21d8e41..925013db10 100644 --- a/Content.Client/CardboardBox/CardboardBoxSystem.cs +++ b/Content.Client/CardboardBox/CardboardBoxSystem.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.Body.Components; using Content.Shared.CardboardBox; using Content.Shared.CardboardBox.Components; using Content.Shared.Examine; @@ -13,9 +14,14 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; + private EntityQuery _bodyQuery; + public override void Initialize() { base.Initialize(); + + _bodyQuery = GetEntityQuery(); + SubscribeNetworkEvent(OnBoxEffect); } @@ -59,6 +65,10 @@ private void OnBoxEffect(PlayBoxEffectMessage msg) if (!_examine.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) continue; + // no effect for anything too exotic + if (!_bodyQuery.HasComp(mob)) + continue; + var ent = Spawn(box.Effect, mapPos); if (!xformQuery.TryGetComponent(ent, out var entTransform) || !TryComp(ent, out var sprite)) diff --git a/Content.Client/Cargo/UI/BountyEntry.xaml.cs b/Content.Client/Cargo/UI/BountyEntry.xaml.cs index 027d7b3e80..31c417117a 100644 --- a/Content.Client/Cargo/UI/BountyEntry.xaml.cs +++ b/Content.Client/Cargo/UI/BountyEntry.xaml.cs @@ -7,7 +7,6 @@ using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using Serilog; namespace Content.Client.Cargo.UI; diff --git a/Content.Client/Changelog/ChangelogWindow.xaml.cs b/Content.Client/Changelog/ChangelogWindow.xaml.cs index e5f492900c..9b7fd75436 100644 --- a/Content.Client/Changelog/ChangelogWindow.xaml.cs +++ b/Content.Client/Changelog/ChangelogWindow.xaml.cs @@ -87,14 +87,12 @@ private void TabsUpdated() if (!tab.AdminOnly || isAdmin) { Tabs.SetTabVisible(i, true); - tab.Visible = true; visibleTabs++; firstVisible ??= i; } else { Tabs.SetTabVisible(i, false); - tab.Visible = false; } } diff --git a/Content.Client/Chat/UI/EmotesMenu.xaml b/Content.Client/Chat/UI/EmotesMenu.xaml new file mode 100644 index 0000000000..cc4d5bb77e --- /dev/null +++ b/Content.Client/Chat/UI/EmotesMenu.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Content.Client/Chat/UI/EmotesMenu.xaml.cs b/Content.Client/Chat/UI/EmotesMenu.xaml.cs new file mode 100644 index 0000000000..a26d319920 --- /dev/null +++ b/Content.Client/Chat/UI/EmotesMenu.xaml.cs @@ -0,0 +1,112 @@ +using System.Numerics; +using Content.Client.UserInterface.Controls; +using Content.Shared.Chat.Prototypes; +using Content.Shared.Speech; +using Robust.Client.AutoGenerated; +using Robust.Client.GameObjects; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Client.Chat.UI; + +[GenerateTypedNameReferences] +public sealed partial class EmotesMenu : RadialMenu +{ + [Dependency] private readonly EntityManager _entManager = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly ISharedPlayerManager _playerManager = default!; + + private readonly SpriteSystem _spriteSystem; + + public event Action>? OnPlayEmote; + + public EmotesMenu() + { + IoCManager.InjectDependencies(this); + RobustXamlLoader.Load(this); + + _spriteSystem = _entManager.System(); + + var main = FindControl("Main"); + + var emotes = _prototypeManager.EnumeratePrototypes(); + foreach (var emote in emotes) + { + var player = _playerManager.LocalSession?.AttachedEntity; + if (emote.Category == EmoteCategory.Invalid || + emote.ChatTriggers.Count == 0 || + !(player.HasValue && (emote.Whitelist?.IsValid(player.Value, _entManager) ?? true)) || + (emote.Blacklist?.IsValid(player.Value, _entManager) ?? false)) + continue; + + if (!emote.Available && + _entManager.TryGetComponent(player.Value, out var speech) && + !speech.AllowedEmotes.Contains(emote.ID)) + continue; + + var parent = FindControl(emote.Category.ToString()); + + var button = new EmoteMenuButton + { + StyleClasses = { "RadialMenuButton" }, + SetSize = new Vector2(64f, 64f), + ToolTip = Loc.GetString(emote.Name), + ProtoId = emote.ID, + }; + + var tex = new TextureRect + { + VerticalAlignment = VAlignment.Center, + HorizontalAlignment = HAlignment.Center, + Texture = _spriteSystem.Frame0(emote.Icon), + TextureScale = new Vector2(2f, 2f), + }; + + button.AddChild(tex); + parent.AddChild(button); + foreach (var child in main.Children) + { + if (child is not RadialMenuTextureButton castChild) + continue; + + if (castChild.TargetLayer == emote.Category.ToString()) + { + castChild.Visible = true; + break; + } + } + } + + + // Set up menu actions + foreach (var child in Children) + { + if (child is not RadialContainer container) + continue; + AddEmoteClickAction(container); + } + } + + private void AddEmoteClickAction(RadialContainer container) + { + foreach (var child in container.Children) + { + if (child is not EmoteMenuButton castChild) + continue; + + castChild.OnButtonUp += _ => + { + OnPlayEmote?.Invoke(castChild.ProtoId); + Close(); + }; + } + } +} + + +public sealed class EmoteMenuButton : RadialMenuTextureButton +{ + public ProtoId ProtoId { get; set; } +} diff --git a/Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs b/Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs new file mode 100644 index 0000000000..58c5a05894 --- /dev/null +++ b/Content.Client/Chemistry/Components/SolutionItemStatusComponent.cs @@ -0,0 +1,22 @@ +using Content.Client.Chemistry.EntitySystems; +using Content.Client.Chemistry.UI; + +namespace Content.Client.Chemistry.Components; + +/// +/// Exposes a solution container's contents via a basic item status control. +/// +/// +/// Shows the solution volume, max volume, and transfer amount. +/// +/// +/// +[RegisterComponent] +public sealed partial class SolutionItemStatusComponent : Component +{ + /// + /// The ID of the solution that will be shown on the item status control. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string Solution = "default"; +} diff --git a/Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs b/Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs new file mode 100644 index 0000000000..76aab516a7 --- /dev/null +++ b/Content.Client/Chemistry/EntitySystems/SolutionItemStatusSystem.cs @@ -0,0 +1,22 @@ +using Content.Client.Chemistry.Components; +using Content.Client.Chemistry.UI; +using Content.Client.Items; +using Content.Shared.Chemistry.EntitySystems; + +namespace Content.Client.Chemistry.EntitySystems; + +/// +/// Wires up item status logic for . +/// +/// +public sealed class SolutionItemStatusSystem : EntitySystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; + + public override void Initialize() + { + base.Initialize(); + Subs.ItemStatus( + entity => new SolutionStatusControl(entity, EntityManager, _solutionContainerSystem)); + } +} diff --git a/Content.Client/Chemistry/UI/ButtonGrid.cs b/Content.Client/Chemistry/UI/ButtonGrid.cs new file mode 100644 index 0000000000..0abd9ef8a4 --- /dev/null +++ b/Content.Client/Chemistry/UI/ButtonGrid.cs @@ -0,0 +1,119 @@ +using System; +using Robust.Client.Graphics; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.Chemistry.UI; + +/// +/// Creates a grid of buttons given a comma-seperated list of Text +/// +public sealed class ButtonGrid : GridContainer +{ + private string _buttonList = ""; + + /// + /// A comma-seperated list of text to use for each button. These will be inserted sequentially. + /// + public string ButtonList + { + get => _buttonList; + set + { + _buttonList = value; + Update(); + } + } + + public bool RadioGroup { get; set; } = false; + + private string? _selected; + + /// + /// Which button is currently selected. Only matters when is true. + /// + public string? Selected + { + get => _selected; + set + { + _selected = value; + Update(); + } + } + + public Action? OnButtonPressed; + + /// + /// + /// + public new int Columns + { + get => base.Columns; + set + { + base.Columns = value; + Update(); + } + } + + /// + /// + /// + public new int Rows + { + get => base.Rows; + set + { + base.Rows = value; + Update(); + } + } + + private void Update() + { + if (ButtonList == "") + return; + + this.Children.Clear(); + var i = 0; + var list = ButtonList.Split(","); + + var group = new ButtonGroup(); + + foreach (var button in list) + { + var btn = new Button(); + btn.Text = button; + btn.OnPressed += _ => + { + if (RadioGroup) + btn.Pressed = true; + Selected = button; + OnButtonPressed?.Invoke(button); + }; + if (button == Selected) + btn.Pressed = true; + var sep = HSeparationOverride ?? 0; + // ReSharper disable once PossibleLossOfFraction + // btn.SetWidth = (this.PixelWidth - sep * (Columns - 1)) / 3; + btn.Group = group; + + var row = i / Columns; + var col = i % Columns; + var last = i == list.Length - 1; + var lastCol = i == Columns - 1; + var lastRow = row == list.Length / Columns - 1; + + if (row == 0 && (lastCol || last)) + btn.AddStyleClass("OpenLeft"); + else if (col == 0 && lastRow) + btn.AddStyleClass("OpenRight"); + else + btn.AddStyleClass("OpenBoth"); + + this.Children.Add(btn); + + i++; + } + } +} diff --git a/Content.Client/Chemistry/UI/InjectorStatusControl.cs b/Content.Client/Chemistry/UI/InjectorStatusControl.cs index ba1f97cd1e..f9b0d90e20 100644 --- a/Content.Client/Chemistry/UI/InjectorStatusControl.cs +++ b/Content.Client/Chemistry/UI/InjectorStatusControl.cs @@ -32,7 +32,7 @@ protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); - if (!_solutionContainers.TryGetSolution(_parent.Owner, InjectorComponent.SolutionName, out _, out var solution)) + if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.SolutionName, out _, out var solution)) return; // only updates the UI if any of the details are different than they previously were diff --git a/Content.Client/Chemistry/UI/ReagentCardControl.xaml b/Content.Client/Chemistry/UI/ReagentCardControl.xaml new file mode 100644 index 0000000000..966c730140 --- /dev/null +++ b/Content.Client/Chemistry/UI/ReagentCardControl.xaml @@ -0,0 +1,37 @@ + + + + + + + diff --git a/Content.Client/Chemistry/UI/ReagentCardControl.xaml.cs b/Content.Client/Chemistry/UI/ReagentCardControl.xaml.cs new file mode 100644 index 0000000000..60336143fc --- /dev/null +++ b/Content.Client/Chemistry/UI/ReagentCardControl.xaml.cs @@ -0,0 +1,30 @@ +using Content.Shared.Chemistry; +using Robust.Client.AutoGenerated; +using Robust.Client.Graphics; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.Chemistry.UI; + +[GenerateTypedNameReferences] +public sealed partial class ReagentCardControl : Control +{ + public string StorageSlotId { get; } + public Action? OnPressed; + public Action? OnEjectButtonPressed; + + public ReagentCardControl(ReagentInventoryItem item) + { + RobustXamlLoader.Load(this); + + StorageSlotId = item.StorageSlotId; + ColorPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = item.ReagentColor }; + ReagentNameLabel.Text = item.ReagentLabel; + ReagentNameLabel.FontColorOverride = Color.White; + FillLabel.Text = item.StoredAmount; + EjectButtonIcon.Text = Loc.GetString("reagent-dispenser-window-eject-container-button"); + + MainButton.OnPressed += args => OnPressed?.Invoke(StorageSlotId); + EjectButton.OnPressed += args => OnEjectButtonPressed?.Invoke(StorageSlotId); + } +} diff --git a/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs b/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs index 8244e3e6ed..99e5a3d395 100644 --- a/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs +++ b/Content.Client/Chemistry/UI/ReagentDispenserBoundUserInterface.cs @@ -1,3 +1,4 @@ +using Content.Client.Guidebook.Components; using Content.Shared.Chemistry; using Content.Shared.Containers.ItemSlots; using JetBrains.Annotations; @@ -34,6 +35,7 @@ protected override void Open() _window = new() { Title = EntMan.GetComponent(Owner).EntityName, + HelpGuidebookIds = EntMan.GetComponent(Owner).Guides }; _window.OpenCentered(); @@ -42,38 +44,11 @@ protected override void Open() // Setup static button actions. _window.EjectButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(SharedReagentDispenser.OutputSlotName)); _window.ClearButton.OnPressed += _ => SendMessage(new ReagentDispenserClearContainerSolutionMessage()); - _window.DispenseButton1.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U1)); - _window.DispenseButton5.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U5)); - _window.DispenseButton10.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U10)); - _window.DispenseButton15.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U15)); - _window.DispenseButton20.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U20)); - _window.DispenseButton25.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U25)); - _window.DispenseButton30.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U30)); - _window.DispenseButton50.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U50)); - _window.DispenseButton100.OnPressed += _ => SendMessage(new ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount.U100)); - // Setup reagent button actions. - _window.OnDispenseReagentButtonPressed += (args, button) => SendMessage(new ReagentDispenserDispenseReagentMessage(button.ReagentId)); - _window.OnDispenseReagentButtonMouseEntered += (args, button) => - { - if (_lastState is not null) - _window.UpdateContainerInfo(_lastState); - }; - _window.OnDispenseReagentButtonMouseExited += (args, button) => - { - if (_lastState is not null) - _window.UpdateContainerInfo(_lastState); - }; + _window.AmountGrid.OnButtonPressed += s => SendMessage(new ReagentDispenserSetDispenseAmountMessage(s)); - _window.OnEjectJugButtonPressed += (args, button) => SendMessage(new ItemSlotButtonPressedEvent(button.ReagentId)); - _window.OnEjectJugButtonMouseEntered += (args, button) => { - if (_lastState is not null) - _window.UpdateContainerInfo(_lastState); - }; - _window.OnEjectJugButtonMouseExited += (args, button) => { - if (_lastState is not null) - _window.UpdateContainerInfo(_lastState); - }; + _window.OnDispenseReagentButtonPressed += (id) => SendMessage(new ReagentDispenserDispenseReagentMessage(id)); + _window.OnEjectJugButtonPressed += (id) => SendMessage(new ItemSlotButtonPressedEvent(id)); } /// diff --git a/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml b/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml index 3b812ba56b..c900d7ecf2 100644 --- a/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml +++ b/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml @@ -1,53 +1,77 @@ - - - - [GenerateTypedNameReferences] - public sealed partial class ReagentDispenserWindow : DefaultWindow + public sealed partial class ReagentDispenserWindow : FancyWindow { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; - public event Action? OnDispenseReagentButtonPressed; - public event Action? OnDispenseReagentButtonMouseEntered; - public event Action? OnDispenseReagentButtonMouseExited; - - public event Action? OnEjectJugButtonPressed; - public event Action? OnEjectJugButtonMouseEntered; - public event Action? OnEjectJugButtonMouseExited; + public event Action? OnDispenseReagentButtonPressed; + public event Action? OnEjectJugButtonPressed; /// /// Create and initialize the dispenser UI client-side. Creates the basic layout, @@ -35,44 +29,27 @@ public ReagentDispenserWindow() { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); - - var dispenseAmountGroup = new ButtonGroup(); - DispenseButton1.Group = dispenseAmountGroup; - DispenseButton5.Group = dispenseAmountGroup; - DispenseButton10.Group = dispenseAmountGroup; - DispenseButton15.Group = dispenseAmountGroup; - DispenseButton20.Group = dispenseAmountGroup; - DispenseButton25.Group = dispenseAmountGroup; - DispenseButton30.Group = dispenseAmountGroup; - DispenseButton50.Group = dispenseAmountGroup; - DispenseButton100.Group = dispenseAmountGroup; } /// /// Update the button grid of reagents which can be dispensed. /// /// Reagents which can be dispensed by this dispenser - public void UpdateReagentsList(List>> inventory) + public void UpdateReagentsList(List inventory) { - if (ChemicalList == null) + if (ReagentList == null) return; - ChemicalList.Children.Clear(); + ReagentList.Children.Clear(); //Sort inventory by reagentLabel - inventory.Sort((x, y) => x.Value.Key.CompareTo(y.Value.Key)); + inventory.Sort((x, y) => x.ReagentLabel.CompareTo(y.ReagentLabel)); - foreach (KeyValuePair> entry in inventory) + foreach (var item in inventory) { - var button = new DispenseReagentButton(entry.Key, entry.Value.Key, entry.Value.Value); - button.OnPressed += args => OnDispenseReagentButtonPressed?.Invoke(args, button); - button.OnMouseEntered += args => OnDispenseReagentButtonMouseEntered?.Invoke(args, button); - button.OnMouseExited += args => OnDispenseReagentButtonMouseExited?.Invoke(args, button); - ChemicalList.AddChild(button); - var ejectButton = new EjectJugButton(entry.Key); - ejectButton.OnPressed += args => OnEjectJugButtonPressed?.Invoke(args, ejectButton); - ejectButton.OnMouseEntered += args => OnEjectJugButtonMouseEntered?.Invoke(args, ejectButton); - ejectButton.OnMouseExited += args => OnEjectJugButtonMouseExited?.Invoke(args, ejectButton); - ChemicalList.AddChild(ejectButton); + var card = new ReagentCardControl(item); + card.OnPressed += OnDispenseReagentButtonPressed; + card.OnEjectButtonPressed += OnEjectJugButtonPressed; + ReagentList.Children.Add(card); } } @@ -93,36 +70,7 @@ public void UpdateState(BoundUserInterfaceState state) ClearButton.Disabled = castState.OutputContainer is null; EjectButton.Disabled = castState.OutputContainer is null; - switch (castState.SelectedDispenseAmount) - { - case ReagentDispenserDispenseAmount.U1: - DispenseButton1.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U5: - DispenseButton5.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U10: - DispenseButton10.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U15: - DispenseButton15.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U20: - DispenseButton20.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U25: - DispenseButton25.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U30: - DispenseButton30.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U50: - DispenseButton50.Pressed = true; - break; - case ReagentDispenserDispenseAmount.U100: - DispenseButton100.Pressed = true; - break; - } + AmountGrid.Selected = ((int)castState.SelectedDispenseAmount).ToString(); } /// @@ -137,23 +85,15 @@ public void UpdateContainerInfo(ReagentDispenserBoundUserInterfaceState state) if (state.OutputContainer is null) { + ContainerInfoName.Text = ""; + ContainerInfoFill.Text = ""; ContainerInfo.Children.Add(new Label { Text = Loc.GetString("reagent-dispenser-window-no-container-loaded-text") }); return; } - ContainerInfo.Children.Add(new BoxContainer // Name of the container and its fill status (Ex: 44/100u) - { - Orientation = LayoutOrientation.Horizontal, - Children = - { - new Label {Text = $"{state.OutputContainer.DisplayName}: "}, - new Label - { - Text = $"{state.OutputContainer.CurrentVolume}/{state.OutputContainer.MaxVolume}", - StyleClasses = {StyleNano.StyleClassLabelSecondaryColor} - } - } - }); + // Set Name of the container and its fill status (Ex: 44/100u) + ContainerInfoName.Text = state.OutputContainer.DisplayName; + ContainerInfoFill.Text = state.OutputContainer.CurrentVolume + "/" + state.OutputContainer.MaxVolume; foreach (var (reagent, quantity) in state.OutputContainer.Reagents!) { diff --git a/Content.Client/Chemistry/UI/SolutionStatusControl.cs b/Content.Client/Chemistry/UI/SolutionStatusControl.cs new file mode 100644 index 0000000000..1a33ffb0e1 --- /dev/null +++ b/Content.Client/Chemistry/UI/SolutionStatusControl.cs @@ -0,0 +1,59 @@ +using Content.Client.Chemistry.Components; +using Content.Client.Chemistry.EntitySystems; +using Content.Client.Items.UI; +using Content.Client.Message; +using Content.Client.Stylesheets; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.FixedPoint; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.Chemistry.UI; + +/// +/// Displays basic solution information for . +/// +/// +public sealed class SolutionStatusControl : PollingItemStatusControl +{ + private readonly Entity _parent; + private readonly IEntityManager _entityManager; + private readonly SharedSolutionContainerSystem _solutionContainers; + private readonly RichTextLabel _label; + + public SolutionStatusControl( + Entity parent, + IEntityManager entityManager, + SharedSolutionContainerSystem solutionContainers) + { + _parent = parent; + _entityManager = entityManager; + _solutionContainers = solutionContainers; + _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; + AddChild(_label); + } + + protected override Data PollData() + { + if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.Solution, out _, out var solution)) + return default; + + FixedPoint2? transferAmount = null; + if (_entityManager.TryGetComponent(_parent.Owner, out SolutionTransferComponent? transfer)) + transferAmount = transfer.TransferAmount; + + return new Data(solution.Volume, solution.MaxVolume, transferAmount); + } + + protected override void Update(in Data data) + { + var markup = Loc.GetString("solution-status-volume", + ("currentVolume", data.Volume), + ("maxVolume", data.MaxVolume)); + if (data.TransferVolume is { } transferVolume) + markup += "\n" + Loc.GetString("solution-status-transfer", ("volume", transferVolume)); + _label.SetMarkup(markup); + } + + public readonly record struct Data(FixedPoint2 Volume, FixedPoint2 MaxVolume, FixedPoint2? TransferVolume); +} diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index 7e78ac7d70..dd69521f48 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -11,6 +11,7 @@ using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.TypeSerializers.Implementations; using Robust.Shared.Utility; using static Robust.Client.GameObjects.SpriteComponent; @@ -46,6 +47,7 @@ public sealed class ClientClothingSystem : ClothingSystem }; [Dependency] private readonly IResourceCache _cache = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; public override void Initialize() @@ -265,6 +267,7 @@ private void RenderEquipment(EntityUid equipee, EntityUid equipment, string slot // temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a // bookmark to determine where in the list of layers we should insert the clothing layers. bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index); + var displacementData = inventory.Displacements.GetValueOrDefault(slot); // add the new layers foreach (var (key, layerData) in ev.Layers) @@ -308,6 +311,28 @@ private void RenderEquipment(EntityUid equipee, EntityUid equipment, string slot sprite.LayerSetData(index, layerData); layer.Offset += slotDef.Offset; + + if (displacementData != null) + { + if (displacementData.ShaderOverride != null) + sprite.LayerSetShader(index, displacementData.ShaderOverride); + + var displacementKey = $"{key}-displacement"; + if (!revealedLayers.Add(displacementKey)) + { + Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}."); + continue; + } + + var displacementLayer = _serialization.CreateCopy(displacementData.Layer, notNullableOverride: true); + displacementLayer.CopyToShaderParameters!.LayerKey = key; + + // Add before main layer for this item. + sprite.AddLayer(displacementLayer, index); + sprite.LayerMapSet(displacementKey, index); + + revealedLayers.Add(displacementKey); + } } RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true); diff --git a/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs b/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs index 90643e45cf..4d8dd86a4d 100644 --- a/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs +++ b/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs @@ -1,7 +1,9 @@ using Content.Client.UserInterface.Controls; using System.Threading; +using Content.Shared.CCVar; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; using Robust.Shared.Utility; using Timer = Robust.Shared.Timing.Timer; @@ -13,6 +15,8 @@ public sealed partial class CommunicationsConsoleMenu : FancyWindow private CommunicationsConsoleBoundUserInterface Owner { get; set; } private readonly CancellationTokenSource _timerCancelTokenSource = new(); + [Dependency] private readonly IConfigurationManager _cfg = default!; + public CommunicationsConsoleMenu(CommunicationsConsoleBoundUserInterface owner) { IoCManager.InjectDependencies(this); @@ -23,6 +27,22 @@ public CommunicationsConsoleMenu(CommunicationsConsoleBoundUserInterface owner) var loc = IoCManager.Resolve(); MessageInput.Placeholder = new Rope.Leaf(loc.GetString("comms-console-menu-announcement-placeholder")); + var maxAnnounceLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength); + MessageInput.OnTextChanged += (args) => + { + if (args.Control.TextLength > maxAnnounceLength) + { + AnnounceButton.Disabled = true; + AnnounceButton.ToolTip = Loc.GetString("comms-console-message-too-long"); + } + else + { + AnnounceButton.Disabled = !owner.CanAnnounce; + AnnounceButton.ToolTip = null; + + } + }; + AnnounceButton.OnPressed += (_) => Owner.AnnounceButtonPressed(Rope.Collapse(MessageInput.TextRope)); AnnounceButton.Disabled = !owner.CanAnnounce; diff --git a/Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs b/Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs new file mode 100644 index 0000000000..21fccc880d --- /dev/null +++ b/Content.Client/CriminalRecords/Systems/CriminalRecordsHackerSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.CriminalRecords.Systems; + +namespace Content.Client.CriminalRecords.Systems; + +public sealed class CriminalRecordsHackerSystem : SharedCriminalRecordsHackerSystem +{ +} diff --git a/Content.Client/DeviceNetwork/JammerSystem.cs b/Content.Client/DeviceNetwork/JammerSystem.cs new file mode 100644 index 0000000000..c7dbf8c8fe --- /dev/null +++ b/Content.Client/DeviceNetwork/JammerSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Radio.EntitySystems; + +namespace Content.Client.DeviceNetwork; + +public sealed class JammerSystem : SharedJammerSystem +{ + +} diff --git a/Content.Client/DoAfter/DoAfterOverlay.cs b/Content.Client/DoAfter/DoAfterOverlay.cs index 2e23dd44ca..45981159f0 100644 --- a/Content.Client/DoAfter/DoAfterOverlay.cs +++ b/Content.Client/DoAfter/DoAfterOverlay.cs @@ -21,7 +21,7 @@ public sealed class DoAfterOverlay : Overlay private readonly ProgressColorSystem _progressColor; private readonly Texture _barTexture; - private readonly ShaderInstance _shader; + private readonly ShaderInstance _unshadedShader; /// /// Flash time for cancelled DoAfters @@ -45,7 +45,7 @@ public DoAfterOverlay(IEntityManager entManager, IPrototypeManager protoManager, var sprite = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/progress_bar.rsi"), "icon"); _barTexture = _entManager.EntitySysManager.GetEntitySystem().Frame0(sprite); - _shader = protoManager.Index("unshaded").Instance(); + _unshadedShader = protoManager.Index("unshaded").Instance(); } protected override void Draw(in OverlayDrawArgs args) @@ -58,7 +58,6 @@ protected override void Draw(in OverlayDrawArgs args) const float scale = 1f; var scaleMatrix = Matrix3.CreateScale(new Vector2(scale, scale)); var rotationMatrix = Matrix3.CreateRotation(-rotation); - handle.UseShader(_shader); var curTime = _timing.CurTime; @@ -79,6 +78,13 @@ protected override void Draw(in OverlayDrawArgs args) if (!bounds.Contains(worldPosition)) continue; + // shades the do-after bar if the do-after bar belongs to other players + // does not shade do-afters belonging to the local player + if (uid != localEnt) + handle.UseShader(null); + else + handle.UseShader(_unshadedShader); + // If the entity is paused, we will draw the do-after as it was when the entity got paused. var meta = metaQuery.GetComponent(uid); var time = meta.EntityPaused diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index 7f921fc1a6..1ab213ae0a 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -12,10 +12,10 @@ using Content.Client.Input; using Content.Client.IoC; using Content.Client.Launcher; +using Content.Client.Lobby; using Content.Client.MainMenu; using Content.Client.Parallax.Managers; using Content.Client.Players.PlayTimeTracking; -using Content.Client.Preferences; using Content.Client.Radiation.Overlays; using Content.Client.Replay; using Content.Client.Screenshot; @@ -124,6 +124,7 @@ public override void Init() _prototypeManager.RegisterIgnore("alertLevels"); _prototypeManager.RegisterIgnore("nukeopsRole"); _prototypeManager.RegisterIgnore("stationGoal"); + _prototypeManager.RegisterIgnore("ghostRoleRaffleDecider"); _componentFactory.GenerateNetIds(); _adminManager.Initialize(); diff --git a/Content.Client/Extinguisher/FireExtinguisherComponent.cs b/Content.Client/Extinguisher/FireExtinguisherComponent.cs index 126c172924..324b05a93d 100644 --- a/Content.Client/Extinguisher/FireExtinguisherComponent.cs +++ b/Content.Client/Extinguisher/FireExtinguisherComponent.cs @@ -3,7 +3,5 @@ namespace Content.Client.Extinguisher; -[NetworkedComponent, RegisterComponent] -public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent -{ -} +[RegisterComponent] +public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent; diff --git a/Content.Client/Eye/EyeLerpingSystem.cs b/Content.Client/Eye/EyeLerpingSystem.cs index 78e1b851fc..ac32299dca 100644 --- a/Content.Client/Eye/EyeLerpingSystem.cs +++ b/Content.Client/Eye/EyeLerpingSystem.cs @@ -86,7 +86,7 @@ public void RemoveEye(EntityUid uid) private void HandleMapChange(EntityUid uid, LerpingEyeComponent component, ref EntParentChangedMessage args) { // Is this actually a map change? If yes, stop any lerps - if (args.OldMapId != args.Transform.MapID) + if (args.OldMapId != args.Transform.MapUid) component.LastRotation = GetRotation(uid, args.Transform); } diff --git a/Content.Client/Fax/System/FaxVisualsSystem.cs b/Content.Client/Fax/System/FaxVisualsSystem.cs new file mode 100644 index 0000000000..892aec1d95 --- /dev/null +++ b/Content.Client/Fax/System/FaxVisualsSystem.cs @@ -0,0 +1,48 @@ +using Robust.Client.GameObjects; +using Content.Shared.Fax.Components; +using Content.Shared.Fax; +using Robust.Client.Animations; + +namespace Content.Client.Fax.System; + +/// +/// Visualizer for the fax machine which displays the correct sprite based on the inserted entity. +/// +public sealed class FaxVisualsSystem : EntitySystem +{ + [Dependency] private readonly AnimationPlayerSystem _player = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChanged); + } + + private void OnAppearanceChanged(EntityUid uid, FaxMachineComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (_appearance.TryGetData(uid, FaxMachineVisuals.VisualState, out FaxMachineVisualState visuals) && visuals == FaxMachineVisualState.Inserting) + { + _player.Play(uid, new Animation() + { + Length = TimeSpan.FromSeconds(2.4), + AnimationTracks = + { + new AnimationTrackSpriteFlick() + { + LayerKey = FaxMachineVisuals.VisualState, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame(component.InsertingState, 0f), + new AnimationTrackSpriteFlick.KeyFrame("icon", 2.4f), + } + } + } + }, "faxecute"); + } + } +} diff --git a/Content.Client/Fax/UI/FaxBoundUi.cs b/Content.Client/Fax/UI/FaxBoundUi.cs index 9b57595d7b..a95066a3b5 100644 --- a/Content.Client/Fax/UI/FaxBoundUi.cs +++ b/Content.Client/Fax/UI/FaxBoundUi.cs @@ -40,7 +40,7 @@ private async void OnFileButtonPressed() { if (_dialogIsOpen) return; - + _dialogIsOpen = true; var filters = new FileDialogFilters(new FileDialogFilters.Group("txt")); await using var file = await _fileDialogManager.OpenFile(filters); @@ -52,8 +52,27 @@ private async void OnFileButtonPressed() } using var reader = new StreamReader(file); + + var firstLine = await reader.ReadLineAsync(); + string? label = null; var content = await reader.ReadToEndAsync(); - SendMessage(new FaxFileMessage(content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)], _window.OfficePaper)); + + if (firstLine is { }) + { + if (firstLine.StartsWith('#')) + { + label = firstLine[1..].Trim(); + } + else + { + content = firstLine + "\n" + content; + } + } + + SendMessage(new FaxFileMessage( + label?[..Math.Min(label.Length, FaxFileMessageValidation.MaxLabelSize)], + content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)], + _window.OfficePaper)); } private void OnSendButtonPressed() diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs index df709e9444..309db2eb4e 100644 --- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs +++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs @@ -1,3 +1,4 @@ +using Content.Client.Administration.Managers; using Content.Client.Gameplay; using Content.Client.Lobby; using Content.Client.RoundEnd; @@ -6,7 +7,7 @@ using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Client.State; -using Robust.Shared.Utility; +using Robust.Client.UserInterface; namespace Content.Client.GameTicking.Managers { @@ -14,17 +15,14 @@ namespace Content.Client.GameTicking.Managers public sealed class ClientGameTicker : SharedGameTicker { [Dependency] private readonly IStateManager _stateManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IClientAdminManager _admin = default!; + [Dependency] private readonly IClyde _clyde = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; - [ViewVariables] private bool _initialized; private Dictionary> _jobsAvailable = new(); private Dictionary _stationNames = new(); - /// - /// The current round-end window. Could be used to support re-opening the window after closing it. - /// - private RoundEndSummaryWindow? _window; - [ViewVariables] public bool AreWeReady { get; private set; } [ViewVariables] public bool IsGameStarted { get; private set; } [ViewVariables] public string? RestartSound { get; private set; } @@ -44,8 +42,6 @@ public sealed class ClientGameTicker : SharedGameTicker public override void Initialize() { - DebugTools.Assert(!_initialized); - SubscribeNetworkEvent(JoinLobby); SubscribeNetworkEvent(JoinGame); SubscribeNetworkEvent(ConnectionStatus); @@ -53,14 +49,33 @@ public override void Initialize() SubscribeNetworkEvent(LobbyInfo); SubscribeNetworkEvent(LobbyCountdown); SubscribeNetworkEvent(RoundEnd); - SubscribeNetworkEvent(msg => - { - IoCManager.Resolve().RequestWindowAttention(); - }); + SubscribeNetworkEvent(OnAttentionRequest); SubscribeNetworkEvent(LateJoinStatus); SubscribeNetworkEvent(UpdateJobsAvailable); - _initialized = true; + _admin.AdminStatusUpdated += OnAdminUpdated; + OnAdminUpdated(); + } + + public override void Shutdown() + { + _admin.AdminStatusUpdated -= OnAdminUpdated; + base.Shutdown(); + } + + private void OnAdminUpdated() + { + // Hide some map/grid related logs from clients. This is to try prevent some easy metagaming by just + // reading the console. E.g., logs like this one could leak the nuke station/grid: + // > Grid NT-Arrivals 1101 (122/n25896) changed parent. Old parent: map 10 (121/n25895). New parent: FTL (123/n26470) +#if !DEBUG + _map.Log.Level = _admin.IsAdmin() ? LogLevel.Info : LogLevel.Warning; +#endif + } + + private void OnAttentionRequest(RequestWindowAttentionEvent ev) + { + _clyde.RequestWindowAttention(); } private void LateJoinStatus(TickerLateJoinStatusEvent message) @@ -132,12 +147,7 @@ private void RoundEnd(RoundEndMessageEvent message) // Force an update in the event of this song being the same as the last. RestartSound = message.RestartSound; - // Don't open duplicate windows (mainly for replays). - if (_window?.RoundId == message.RoundId) - return; - - //This is not ideal at all, but I don't see an immediately better fit anywhere else. - _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, _entityManager); + _userInterfaceManager.GetUIController().OpenRoundEndSummaryWindow(message); } } } diff --git a/Content.Client/Ghost/Commands/ToggleGhostVisibilityCommand.cs b/Content.Client/Ghost/Commands/ToggleGhostVisibilityCommand.cs new file mode 100644 index 0000000000..480da6ad8d --- /dev/null +++ b/Content.Client/Ghost/Commands/ToggleGhostVisibilityCommand.cs @@ -0,0 +1,26 @@ +using Robust.Shared.Console; + +namespace Content.Client.Ghost.Commands; + +public sealed class ToggleGhostVisibilityCommand : IConsoleCommand +{ + [Dependency] private readonly IEntitySystemManager _entSysMan = default!; + + public string Command => "toggleghostvisibility"; + public string Description => "Toggles ghost visibility on the client."; + public string Help => "toggleghostvisibility [bool]"; + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + var ghostSystem = _entSysMan.GetEntitySystem(); + + if (args.Length != 0 && bool.TryParse(args[0], out var visibility)) + { + ghostSystem.ToggleGhostVisibility(visibility); + } + else + { + ghostSystem.ToggleGhostVisibility(); + } + } +} diff --git a/Content.Client/Ghost/GhostSystem.cs b/Content.Client/Ghost/GhostSystem.cs index 774eae3f02..906a2312be 100644 --- a/Content.Client/Ghost/GhostSystem.cs +++ b/Content.Client/Ghost/GhostSystem.cs @@ -3,7 +3,6 @@ using Content.Shared.Ghost; using Robust.Client.Console; using Robust.Client.GameObjects; -using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; @@ -177,9 +176,9 @@ public void OpenGhostRoles() _console.RemoteExecuteCommand(null, "ghostroles"); } - public void ToggleGhostVisibility() + public void ToggleGhostVisibility(bool? visibility = null) { - GhostVisibility = !GhostVisibility; + GhostVisibility = visibility ?? !GhostVisibility; } public void ReturnToRound() diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs index e2b09386df..537494933b 100644 --- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs @@ -4,6 +4,7 @@ using Content.Client.Guidebook.Richtext; using Content.Client.Message; using Content.Client.UserInterface.ControlExtensions; +using Content.Shared.Body.Prototypes; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using JetBrains.Annotations; @@ -128,7 +129,7 @@ private void GenerateControl(ReagentPrototype reagent) var groupLabel = new RichTextLabel(); groupLabel.SetMarkup(Loc.GetString("guidebook-reagent-effects-metabolism-group-rate", - ("group", group), ("rate", effect.MetabolismRate))); + ("group", _prototype.Index(group).LocalizedName), ("rate", effect.MetabolismRate))); var descriptionLabel = new RichTextLabel { Margin = new Thickness(25, 0, 10, 0) diff --git a/Content.Client/Guidebook/GuideEntry.cs b/Content.Client/Guidebook/GuideEntry.cs index b3c004267d..b7b3b3309e 100644 --- a/Content.Client/Guidebook/GuideEntry.cs +++ b/Content.Client/Guidebook/GuideEntry.cs @@ -42,7 +42,7 @@ public class GuideEntry } [Prototype("guideEntry")] -public sealed class GuideEntryPrototype : GuideEntry, IPrototype +public sealed partial class GuideEntryPrototype : GuideEntry, IPrototype { public string ID => Id; } diff --git a/Content.Client/Guidebook/GuidebookSystem.cs b/Content.Client/Guidebook/GuidebookSystem.cs index cb13d4ca6e..0aa2c85142 100644 --- a/Content.Client/Guidebook/GuidebookSystem.cs +++ b/Content.Client/Guidebook/GuidebookSystem.cs @@ -80,6 +80,11 @@ private void OnGetVerbs(EntityUid uid, GuideHelpComponent component, GetVerbsEve }); } + public void OpenHelp(List guides) + { + OnGuidebookOpen?.Invoke(guides, null, null, true, guides[0]); + } + private void OnInteract(EntityUid uid, GuideHelpComponent component, ActivateInWorldEvent args) { if (!_timing.IsFirstTimePredicted) diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index 0cb3ad144d..fcf6d4551f 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -139,7 +139,7 @@ private void DrawDiagnosticGroups( var groupTitleText = $"{Loc.GetString( "health-analyzer-window-damage-group-text", - ("damageGroup", Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId)), + ("damageGroup", _prototypes.Index(damageGroupId).LocalizedName), ("amount", damageAmount) )}"; @@ -170,7 +170,7 @@ private void DrawDiagnosticGroups( var damageString = Loc.GetString( "health-analyzer-window-damage-type-text", - ("damageType", Loc.GetString("health-analyzer-window-damage-type-" + type)), + ("damageType", _prototypes.Index(type).LocalizedName), ("amount", typeAmount) ); diff --git a/Content.Client/Implants/UI/ImplanterStatusControl.cs b/Content.Client/Implants/UI/ImplanterStatusControl.cs index f3f0cdea7d..e2ffabd17d 100644 --- a/Content.Client/Implants/UI/ImplanterStatusControl.cs +++ b/Content.Client/Implants/UI/ImplanterStatusControl.cs @@ -1,5 +1,6 @@ using Content.Client.Message; using Content.Client.Stylesheets; +using Content.Client.UserInterface.Controls; using Content.Shared.Implants.Components; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; @@ -17,7 +18,7 @@ public ImplanterStatusControl(ImplanterComponent parent) _parent = parent; _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; _label.MaxWidth = 350; - AddChild(_label); + AddChild(new ClipControl { Children = { _label } }); Update(); } @@ -42,17 +43,12 @@ private void Update() _ => Loc.GetString("injector-invalid-injector-toggle-mode") }; - var (implantName, implantDescription) = _parent.ImplanterSlot.HasItem switch - { - false => (Loc.GetString("implanter-empty-text"), ""), - true => (_parent.ImplantData.Item1, _parent.ImplantData.Item2), - }; - + var implantName = _parent.ImplanterSlot.HasItem + ? _parent.ImplantData.Item1 + : Loc.GetString("implanter-empty-text"); _label.SetMarkup(Loc.GetString("implanter-label", ("implantName", implantName), - ("implantDescription", implantDescription), - ("modeString", modeStringLocalized), - ("lineBreak", "\n"))); + ("modeString", modeStringLocalized))); } } diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index c54f5002ec..2b1361208d 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -38,6 +38,7 @@ public static void SetupContexts(IInputContextContainer contexts) common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); common.AddFunction(ContentKeyFunctions.InspectEntity); + common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow); // Not in engine, because engine cannot check for sanbox/admin status before starting placement. common.AddFunction(ContentKeyFunctions.EditorCopyObject); @@ -59,6 +60,7 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.UseItemInHand); human.AddFunction(ContentKeyFunctions.AltUseItemInHand); human.AddFunction(ContentKeyFunctions.OpenCharacterMenu); + human.AddFunction(ContentKeyFunctions.OpenEmotesMenu); human.AddFunction(ContentKeyFunctions.OpenLanguageMenu); human.AddFunction(ContentKeyFunctions.ActivateItemInWorld); human.AddFunction(ContentKeyFunctions.ThrowItemInHand); diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index 7b98513a92..87cea4e3d2 100644 --- a/Content.Client/Inventory/ClientInventorySystem.cs +++ b/Content.Client/Inventory/ClientInventorySystem.cs @@ -199,7 +199,7 @@ public void UIInventoryActivate(string slot) public void UIInventoryStorageActivate(string slot) { - EntityManager.EntityNetManager?.SendSystemNetworkMessage(new OpenSlotStorageNetworkMessage(slot)); + EntityManager.RaisePredictiveEvent(new OpenSlotStorageNetworkMessage(slot)); } public void UIInventoryExamine(string slot, EntityUid uid) @@ -251,6 +251,7 @@ public sealed class SlotData public string SlotGroup => SlotDef.SlotGroup; public string SlotDisplayName => SlotDef.DisplayName; public string TextureName => "Slots/" + SlotDef.TextureName; + public string FullTextureName => SlotDef.FullTextureName; public SlotData(SlotDefinition slotDef, ContainerSlot? container = null, bool highlighted = false, bool blocked = false) diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index 4bb49fecc1..4ccede7f5d 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -222,7 +222,7 @@ private void UpdateEntityIcon(SlotControl button, EntityUid? entity) if (entity == null) { - button.SpriteView.SetEntity(null); + button.SetEntity(null); return; } @@ -234,7 +234,7 @@ private void UpdateEntityIcon(SlotControl button, EntityUid? entity) else return; - button.SpriteView.SetEntity(viewEnt); + button.SetEntity(viewEnt); } } } diff --git a/Content.Client/IoC/ClientContentIoC.cs b/Content.Client/IoC/ClientContentIoC.cs index 01c8f38281..8c2b676c2e 100644 --- a/Content.Client/IoC/ClientContentIoC.cs +++ b/Content.Client/IoC/ClientContentIoC.cs @@ -4,23 +4,20 @@ using Content.Client.Clickable; using Content.Client.DiscordAuth; using Content.Client.JoinQueue; -using Content.Client.Options; using Content.Client.Eui; using Content.Client.GhostKick; using Content.Client.Info; using Content.Client.Launcher; using Content.Client.Parallax.Managers; using Content.Client.Players.PlayTimeTracking; -using Content.Client.Preferences; using Content.Client.Screenshot; using Content.Client.Fullscreen; using Content.Client.Stylesheets; using Content.Client.Viewport; using Content.Client.Voting; -using Content.Shared.Administration; using Content.Shared.Administration.Logs; -using Content.Shared.Module; using Content.Client.Guidebook; +using Content.Client.Lobby; using Content.Client.Replay; using Content.Shared.Administration.Managers; using Content.Shared.Players.PlayTimeTracking; diff --git a/Content.Client/Items/UI/PollingItemStatusControl.cs b/Content.Client/Items/UI/PollingItemStatusControl.cs new file mode 100644 index 0000000000..39cffb06f6 --- /dev/null +++ b/Content.Client/Items/UI/PollingItemStatusControl.cs @@ -0,0 +1,28 @@ +using Robust.Client.UserInterface; +using Robust.Shared.Timing; + +namespace Content.Client.Items.UI; + +/// +/// A base for item status controls that poll data every frame. Avoids UI updates if data didn't change. +/// +/// The full status control data that is polled every frame. +public abstract class PollingItemStatusControl : Control where TData : struct, IEquatable +{ + private TData _lastData; + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + + var newData = PollData(); + if (newData.Equals(_lastData)) + return; + + _lastData = newData; + Update(newData); + } + + protected abstract TData PollData(); + protected abstract void Update(in TData data); +} diff --git a/Content.Client/Labels/EntitySystems/HandLabelerSystem.cs b/Content.Client/Labels/EntitySystems/HandLabelerSystem.cs new file mode 100644 index 0000000000..e956014b2e --- /dev/null +++ b/Content.Client/Labels/EntitySystems/HandLabelerSystem.cs @@ -0,0 +1,18 @@ +using Content.Client.Labels.UI; +using Content.Shared.Labels; +using Content.Shared.Labels.Components; +using Content.Shared.Labels.EntitySystems; + +namespace Content.Client.Labels.EntitySystems; + +public sealed class HandLabelerSystem : SharedHandLabelerSystem +{ + protected override void UpdateUI(Entity ent) + { + if (UserInterfaceSystem.TryGetOpenUi(ent.Owner, HandLabelerUiKey.Key, out var bui) + && bui is HandLabelerBoundUserInterface cBui) + { + cBui.Reload(); + } + } +} diff --git a/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs b/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs index d393c43f93..555f1ff09e 100644 --- a/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs +++ b/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs @@ -1,4 +1,5 @@ using Content.Shared.Labels; +using Content.Shared.Labels.Components; using Robust.Client.GameObjects; namespace Content.Client.Labels.UI @@ -8,11 +9,14 @@ namespace Content.Client.Labels.UI /// public sealed class HandLabelerBoundUserInterface : BoundUserInterface { + [Dependency] private readonly IEntityManager _entManager = default!; + [ViewVariables] private HandLabelerWindow? _window; public HandLabelerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { + IoCManager.InjectDependencies(this); } protected override void Open() @@ -27,24 +31,25 @@ protected override void Open() _window.OnClose += Close; _window.OnLabelChanged += OnLabelChanged; + Reload(); } private void OnLabelChanged(string newLabel) { - SendMessage(new HandLabelerLabelChangedMessage(newLabel)); + // Focus moment + if (_entManager.TryGetComponent(Owner, out HandLabelerComponent? labeler) && + labeler.AssignedLabel.Equals(newLabel)) + return; + + SendPredictedMessage(new HandLabelerLabelChangedMessage(newLabel)); } - /// - /// Update the UI state based on server-sent info - /// - /// - protected override void UpdateState(BoundUserInterfaceState state) + public void Reload() { - base.UpdateState(state); - if (_window == null || state is not HandLabelerBoundUserInterfaceState cast) + if (_window == null || !_entManager.TryGetComponent(Owner, out HandLabelerComponent? component)) return; - _window.SetCurrentLabel(cast.CurrentLabel); + _window.SetCurrentLabel(component.AssignedLabel); } protected override void Dispose(bool disposing) diff --git a/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs b/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs index 7706c31f85..6482cdc1cc 100644 --- a/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs +++ b/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs @@ -9,17 +9,40 @@ public sealed partial class HandLabelerWindow : DefaultWindow { public event Action? OnLabelChanged; + /// + /// Is the user currently entering text into the control? + /// + private bool _focused; + // TODO LineEdit Make this a bool on the LineEdit control + + private string _label = string.Empty; + public HandLabelerWindow() { RobustXamlLoader.Load(this); - LabelLineEdit.OnTextEntered += e => OnLabelChanged?.Invoke(e.Text); - LabelLineEdit.OnFocusExit += e => OnLabelChanged?.Invoke(e.Text); + LabelLineEdit.OnTextEntered += e => + { + _label = e.Text; + OnLabelChanged?.Invoke(_label); + }; + + LabelLineEdit.OnFocusEnter += _ => _focused = true; + LabelLineEdit.OnFocusExit += _ => + { + _focused = false; + LabelLineEdit.Text = _label; + }; } public void SetCurrentLabel(string label) { - LabelLineEdit.Text = label; + if (label == _label) + return; + + _label = label; + if (!_focused) + LabelLineEdit.Text = label; } } } diff --git a/Content.Client/LateJoin/LateJoinGui.cs b/Content.Client/LateJoin/LateJoinGui.cs index 1351aa9e86..1b2a87be72 100644 --- a/Content.Client/LateJoin/LateJoinGui.cs +++ b/Content.Client/LateJoin/LateJoinGui.cs @@ -2,15 +2,14 @@ using System.Numerics; using Content.Client.CrewManifest; using Content.Client.GameTicking.Managers; +using Content.Client.Lobby; using Content.Client.UserInterface.Controls; using Content.Client.Players.PlayTimeTracking; -using Content.Client.Preferences; using Content.Shared.CCVar; using Content.Shared.Customization.Systems; using Content.Shared.Preferences; using Content.Shared.Roles; using Content.Shared.StatusIcon; -using Microsoft.Win32.SafeHandles; using Robust.Client.Console; using Robust.Client.GameObjects; using Robust.Client.UserInterface; diff --git a/Content.Client/Lathe/UI/LatheMenu.xaml.cs b/Content.Client/Lathe/UI/LatheMenu.xaml.cs index ca8d256127..9e15f8239e 100644 --- a/Content.Client/Lathe/UI/LatheMenu.xaml.cs +++ b/Content.Client/Lathe/UI/LatheMenu.xaml.cs @@ -10,6 +10,8 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; +using Robust.Client.ResourceManagement; +using Robust.Client.Graphics; using Robust.Shared.Prototypes; namespace Content.Client.Lathe.UI; @@ -19,6 +21,8 @@ public sealed partial class LatheMenu : DefaultWindow { [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IResourceCache _resources = default!; + private EntityUid _owner; private readonly SpriteSystem _spriteSystem; private readonly LatheSystem _lathe; @@ -104,12 +108,21 @@ public void PopulateRecipes() RecipeList.Children.Clear(); foreach (var prototype in sortedRecipesToShow) { - var icon = prototype.Icon == null - ? _spriteSystem.GetPrototypeIcon(prototype.Result).Default - : _spriteSystem.Frame0(prototype.Icon); + List textures; + if (_prototypeManager.TryIndex(prototype.Result, out EntityPrototype? entityProto) && entityProto != null) + { + textures = SpriteComponent.GetPrototypeTextures(entityProto, _resources).Select(o => o.Default).ToList(); + } + else + { + textures = prototype.Icon == null + ? new List { _spriteSystem.GetPrototypeIcon(prototype.Result).Default } + : new List { _spriteSystem.Frame0(prototype.Icon) }; + } + var canProduce = _lathe.CanProduce(_owner, prototype, quantity); - var control = new RecipeControl(prototype, () => GenerateTooltipText(prototype), canProduce, icon); + var control = new RecipeControl(prototype, () => GenerateTooltipText(prototype), canProduce, textures); control.OnButtonPressed += s => { if (!int.TryParse(AmountLineEdit.Text, out var amount) || amount <= 0) diff --git a/Content.Client/Lathe/UI/RecipeControl.xaml b/Content.Client/Lathe/UI/RecipeControl.xaml index 2e02c8a614..d1371a026a 100644 --- a/Content.Client/Lathe/UI/RecipeControl.xaml +++ b/Content.Client/Lathe/UI/RecipeControl.xaml @@ -5,11 +5,15 @@ Margin="0" StyleClasses="ButtonSquare"> - + CanShrink="true" + /> diff --git a/Content.Client/Lathe/UI/RecipeControl.xaml.cs b/Content.Client/Lathe/UI/RecipeControl.xaml.cs index bf85ff7d93..47b6b5932c 100644 --- a/Content.Client/Lathe/UI/RecipeControl.xaml.cs +++ b/Content.Client/Lathe/UI/RecipeControl.xaml.cs @@ -2,8 +2,8 @@ using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -using Robust.Shared.Graphics; namespace Content.Client.Lathe.UI; @@ -13,12 +13,12 @@ public sealed partial class RecipeControl : Control public Action? OnButtonPressed; public Func TooltipTextSupplier; - public RecipeControl(LatheRecipePrototype recipe, Func tooltipTextSupplier, bool canProduce, Texture? texture = null) + public RecipeControl(LatheRecipePrototype recipe, Func tooltipTextSupplier, bool canProduce, List textures) { RobustXamlLoader.Load(this); RecipeName.Text = recipe.Name; - RecipeTexture.Texture = texture; + RecipeTextures.Textures = textures; Button.Disabled = !canProduce; TooltipTextSupplier = tooltipTextSupplier; Button.TooltipSupplier = SupplyTooltip; diff --git a/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs b/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs index a2a7fb2531..8077406730 100644 --- a/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs +++ b/Content.Client/Light/EntitySystems/ExpendableLightSystem.cs @@ -52,7 +52,7 @@ protected override void OnAppearanceChange(EntityUid uid, ExpendableLightCompone case ExpendableLightState.Lit: _audioSystem.Stop(comp.PlayingStream); comp.PlayingStream = _audioSystem.PlayPvs( - comp.LoopedSound, uid, SharedExpendableLightComponent.LoopedSoundParams)?.Entity; + comp.LoopedSound, uid)?.Entity; if (args.Sprite.LayerMapTryGet(ExpendableLightVisualLayers.Overlay, out var layerIdx, true)) { diff --git a/Content.Client/Preferences/ClientPreferencesManager.cs b/Content.Client/Lobby/ClientPreferencesManager.cs similarity index 99% rename from Content.Client/Preferences/ClientPreferencesManager.cs rename to Content.Client/Lobby/ClientPreferencesManager.cs index aca7159504..2926968657 100644 --- a/Content.Client/Preferences/ClientPreferencesManager.cs +++ b/Content.Client/Lobby/ClientPreferencesManager.cs @@ -10,7 +10,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; -namespace Content.Client.Preferences +namespace Content.Client.Lobby { /// /// Receives and from the server during the initial diff --git a/Content.Client/Preferences/IClientPreferencesManager.cs b/Content.Client/Lobby/IClientPreferencesManager.cs similarity index 94% rename from Content.Client/Preferences/IClientPreferencesManager.cs rename to Content.Client/Lobby/IClientPreferencesManager.cs index e55d6b600c..1b72593ad0 100644 --- a/Content.Client/Preferences/IClientPreferencesManager.cs +++ b/Content.Client/Lobby/IClientPreferencesManager.cs @@ -1,7 +1,7 @@ using System; using Content.Shared.Preferences; -namespace Content.Client.Preferences +namespace Content.Client.Lobby { public interface IClientPreferencesManager { diff --git a/Content.Client/Lobby/LobbyState.cs b/Content.Client/Lobby/LobbyState.cs index bed52217a9..2e728f552a 100644 --- a/Content.Client/Lobby/LobbyState.cs +++ b/Content.Client/Lobby/LobbyState.cs @@ -3,8 +3,6 @@ using Content.Client.LateJoin; using Content.Client.Lobby.UI; using Content.Client.Message; -using Content.Client.Preferences; -using Content.Client.Preferences.UI; using Content.Client.UserInterface.Systems.Chat; using Content.Client.Voting; using Robust.Client; @@ -12,8 +10,6 @@ using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; -using Robust.Shared.Configuration; -using Robust.Shared.Prototypes; using Robust.Shared.Timing; @@ -25,59 +21,39 @@ public sealed class LobbyState : Robust.Client.State.State [Dependency] private readonly IClientConsoleHost _consoleHost = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; - [Dependency] private readonly IClientPreferencesManager _preferencesManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IVoteManager _voteManager = default!; - [Dependency] private readonly IConfigurationManager _configurationManager = default!; - - [ViewVariables] private CharacterSetupGui? _characterSetup; private ClientGameTicker _gameTicker = default!; private ContentAudioSystem _contentAudioSystem = default!; protected override Type? LinkedScreenType { get; } = typeof(LobbyGui); - private LobbyGui? _lobby; + public LobbyGui? Lobby; protected override void Startup() { if (_userInterfaceManager.ActiveScreen == null) return; - _lobby = (LobbyGui) _userInterfaceManager.ActiveScreen; + Lobby = (LobbyGui) _userInterfaceManager.ActiveScreen; var chatController = _userInterfaceManager.GetUIController(); _gameTicker = _entityManager.System(); _contentAudioSystem = _entityManager.System(); _contentAudioSystem.LobbySoundtrackChanged += UpdateLobbySoundtrackInfo; - _characterSetup = new CharacterSetupGui(_entityManager, _resourceCache, _preferencesManager, - _prototypeManager, _configurationManager); - LayoutContainer.SetAnchorPreset(_characterSetup, LayoutContainer.LayoutPreset.Wide); - _lobby.CharacterSetupState.AddChild(_characterSetup); chatController.SetMainChat(true); - _voteManager.SetPopupContainer(_lobby.VoteContainer); - - _characterSetup.CloseButton.OnPressed += _ => - { - _lobby.SwitchState(LobbyGui.LobbyGuiState.Default); - }; + _voteManager.SetPopupContainer(Lobby.VoteContainer); + LayoutContainer.SetAnchorPreset(Lobby, LayoutContainer.LayoutPreset.Wide); + Lobby.ServerName.Text = _baseClient.GameInfo?.ServerName; // The eye of refactor gazes upon you... - _characterSetup.SaveButton.OnPressed += _ => - { - _characterSetup.Save(); - _userInterfaceManager.GetUIController().UpdateCharacterUI(); - }; - - LayoutContainer.SetAnchorPreset(_lobby, LayoutContainer.LayoutPreset.Wide); - _lobby.ServerName.Text = _baseClient.GameInfo?.ServerName; //The eye of refactor gazes upon you... UpdateLobbyUi(); - _lobby.CharacterPreview.CharacterSetupButton.OnPressed += OnSetupPressed; - _lobby.ReadyButton.OnPressed += OnReadyPressed; - _lobby.ReadyButton.OnToggled += OnReadyToggled; + Lobby.CharacterPreview.CharacterSetupButton.OnPressed += OnSetupPressed; + Lobby.ReadyButton.OnPressed += OnReadyPressed; + Lobby.ReadyButton.OnToggled += OnReadyToggled; _gameTicker.InfoBlobUpdated += UpdateLobbyUi; _gameTicker.LobbyStatusUpdated += LobbyStatusUpdated; @@ -95,20 +71,23 @@ protected override void Shutdown() _voteManager.ClearPopupContainer(); - _lobby!.CharacterPreview.CharacterSetupButton.OnPressed -= OnSetupPressed; - _lobby!.ReadyButton.OnPressed -= OnReadyPressed; - _lobby!.ReadyButton.OnToggled -= OnReadyToggled; + Lobby!.CharacterPreview.CharacterSetupButton.OnPressed -= OnSetupPressed; + Lobby!.ReadyButton.OnPressed -= OnReadyPressed; + Lobby!.ReadyButton.OnToggled -= OnReadyToggled; - _lobby = null; + Lobby = null; + } - _characterSetup?.Dispose(); - _characterSetup = null; + public void SwitchState(LobbyGui.LobbyGuiState state) + { + // Yeah I hate this but LobbyState contains all the badness for now + Lobby?.SwitchState(state); } private void OnSetupPressed(BaseButton.ButtonEventArgs args) { SetReady(false); - _lobby!.SwitchState(LobbyGui.LobbyGuiState.CharacterSetup); + Lobby?.SwitchState(LobbyGui.LobbyGuiState.CharacterSetup); } private void OnReadyPressed(BaseButton.ButtonEventArgs args) @@ -128,20 +107,20 @@ public override void FrameUpdate(FrameEventArgs e) { if (_gameTicker.IsGameStarted) { - _lobby!.StartTime.Text = string.Empty; + Lobby!.StartTime.Text = string.Empty; var roundTime = _gameTiming.CurTime.Subtract(_gameTicker.RoundStartTimeSpan); - _lobby!.StationTime.Text = Loc.GetString("lobby-state-player-status-round-time", ("hours", roundTime.Hours), ("minutes", roundTime.Minutes)); + Lobby!.StationTime.Text = Loc.GetString("lobby-state-player-status-round-time", ("hours", roundTime.Hours), ("minutes", roundTime.Minutes)); return; } - _lobby!.StationTime.Text = Loc.GetString("lobby-state-player-status-round-not-started"); + Lobby!.StationTime.Text = Loc.GetString("lobby-state-player-status-round-not-started"); string text; if (_gameTicker.Paused) text = Loc.GetString("lobby-state-paused"); else if (_gameTicker.StartTime < _gameTiming.CurTime) { - _lobby!.StartTime.Text = Loc.GetString("lobby-state-soon"); + Lobby!.StartTime.Text = Loc.GetString("lobby-state-soon"); return; } else @@ -156,7 +135,7 @@ public override void FrameUpdate(FrameEventArgs e) text = $"{difference.Minutes}:{difference.Seconds:D2}"; } - _lobby!.StartTime.Text = Loc.GetString("lobby-state-round-start-countdown-text", ("timeLeft", text)); + Lobby!.StartTime.Text = Loc.GetString("lobby-state-round-start-countdown-text", ("timeLeft", text)); } private void LobbyStatusUpdated() @@ -167,36 +146,36 @@ private void LobbyStatusUpdated() private void LobbyLateJoinStatusUpdated() { - _lobby!.ReadyButton.Disabled = _gameTicker.DisallowedLateJoin; + Lobby!.ReadyButton.Disabled = _gameTicker.DisallowedLateJoin; } private void UpdateLobbyUi() { if (_gameTicker.IsGameStarted) { - _lobby!.ReadyButton.Text = Loc.GetString("lobby-state-ready-button-join-state"); - _lobby!.ReadyButton.ToggleMode = false; - _lobby!.ReadyButton.Pressed = false; - _lobby!.ObserveButton.Disabled = false; + Lobby!.ReadyButton.Text = Loc.GetString("lobby-state-ready-button-join-state"); + Lobby!.ReadyButton.ToggleMode = false; + Lobby!.ReadyButton.Pressed = false; + Lobby!.ObserveButton.Disabled = false; } else { - _lobby!.StartTime.Text = string.Empty; - _lobby!.ReadyButton.Text = Loc.GetString(_lobby!.ReadyButton.Pressed ? "lobby-state-player-status-ready": "lobby-state-player-status-not-ready"); - _lobby!.ReadyButton.ToggleMode = true; - _lobby!.ReadyButton.Disabled = false; - _lobby!.ReadyButton.Pressed = _gameTicker.AreWeReady; - _lobby!.ObserveButton.Disabled = true; + Lobby!.StartTime.Text = string.Empty; + Lobby!.ReadyButton.Text = Loc.GetString(Lobby!.ReadyButton.Pressed ? "lobby-state-player-status-ready": "lobby-state-player-status-not-ready"); + Lobby!.ReadyButton.ToggleMode = true; + Lobby!.ReadyButton.Disabled = false; + Lobby!.ReadyButton.Pressed = _gameTicker.AreWeReady; + Lobby!.ObserveButton.Disabled = true; } if (_gameTicker.ServerInfoBlob != null) - _lobby!.ServerInfo.SetInfoBlob(_gameTicker.ServerInfoBlob); + Lobby!.ServerInfo.SetInfoBlob(_gameTicker.ServerInfoBlob); } private void UpdateLobbySoundtrackInfo(LobbySoundtrackChangedEvent ev) { if (ev.SoundtrackFilename == null) - _lobby!.LobbySong.SetMarkup(Loc.GetString("lobby-state-song-no-song-text")); + Lobby!.LobbySong.SetMarkup(Loc.GetString("lobby-state-song-no-song-text")); else if (ev.SoundtrackFilename != null && _resourceCache.TryGetResource(ev.SoundtrackFilename, out var lobbySongResource)) { @@ -214,16 +193,16 @@ private void UpdateLobbySoundtrackInfo(LobbySoundtrackChangedEvent ev) ("songTitle", title), ("songArtist", artist)); - _lobby!.LobbySong.SetMarkup(markup); + Lobby!.LobbySong.SetMarkup(markup); } } private void UpdateLobbyBackground() { if (_gameTicker.LobbyBackground != null) - _lobby!.Background.Texture = _resourceCache.GetResource(_gameTicker.LobbyBackground); + Lobby!.Background.Texture = _resourceCache.GetResource(_gameTicker.LobbyBackground); else - _lobby!.Background.Texture = null; + Lobby!.Background.Texture = null; } diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs index 47ab651c10..ccefbb0aa4 100644 --- a/Content.Client/Lobby/LobbyUIController.cs +++ b/Content.Client/Lobby/LobbyUIController.cs @@ -3,156 +3,250 @@ using Content.Client.Inventory; using Content.Client.Lobby.UI; using Content.Client.Players.PlayTimeTracking; -using Content.Client.Preferences; -using Content.Client.Preferences.UI; +using Content.Shared.CCVar; +using Content.Shared.Clothing.Loadouts.Prototypes; using Content.Shared.Clothing.Loadouts.Systems; using Content.Shared.GameTicking; -using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; using Content.Shared.Roles; +using Content.Shared.Traits; +using Robust.Client.Player; +using Robust.Client.ResourceManagement; using Robust.Client.State; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; +using Robust.Shared.Configuration; using Robust.Shared.Map; using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using static Content.Shared.Humanoid.SharedHumanoidAppearanceSystem; +using CharacterSetupGui = Content.Client.Lobby.UI.CharacterSetupGui; +using HumanoidProfileEditor = Content.Client.Lobby.UI.HumanoidProfileEditor; namespace Content.Client.Lobby; public sealed class LobbyUIController : UIController, IOnStateEntered, IOnStateExited { [Dependency] private readonly IClientPreferencesManager _preferencesManager = default!; - [Dependency] private readonly IStateManager _stateManager = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly IFileDialogManager _dialogManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + [Dependency] private readonly IStateManager _stateManager = default!; + [Dependency] private readonly JobRequirementsManager _requirements = default!; + [Dependency] private readonly MarkingManager _markings = default!; [Dependency] private readonly JobRequirementsManager _jobRequirements = default!; [UISystemDependency] private readonly HumanoidAppearanceSystem _humanoid = default!; [UISystemDependency] private readonly ClientInventorySystem _inventory = default!; [UISystemDependency] private readonly LoadoutSystem _loadouts = default!; - private LobbyCharacterPanel? _previewPanel; + private CharacterSetupGui? _characterSetup; private HumanoidProfileEditor? _profileEditor; - /* - * Each character profile has its own dummy. There is also a dummy for the lobby screen + character editor - * that is shared too. - */ + /// This is the character preview panel in the chat. This should only update if their character updates + private LobbyCharacterPreviewPanel? PreviewPanel => GetLobbyPreview(); - /// - /// Preview dummy for role gear. - /// - private EntityUid? _previewDummy; + /// This is the modified profile currently being edited + private HumanoidCharacterProfile? EditedProfile => _profileEditor?.Profile; + private int? EditedSlot => _profileEditor?.CharacterSlot; - [Access(typeof(HumanoidProfileEditor))] - public bool UpdateClothes = true; - [Access(typeof(HumanoidProfileEditor))] - public bool ShowClothes = true; - [Access(typeof(HumanoidProfileEditor))] - public bool ShowLoadouts = true; - - // TODO: Load the species directly and don't update entity ever. - public event Action? PreviewDummyUpdated; public override void Initialize() { base.Initialize(); + _prototypeManager.PrototypesReloaded += OnPrototypesReloaded; _preferencesManager.OnServerDataLoaded += PreferencesDataLoaded; - } + _requirements.Updated += OnRequirementsUpdated; - private void PreferencesDataLoaded() - { - if (_previewDummy != null) - EntityManager.DeleteEntity(_previewDummy); + _configurationManager.OnValueChanged(CCVars.FlavorText, _ => _profileEditor?.RefreshFlavorText()); + _configurationManager.OnValueChanged(CCVars.GameRoleTimers, + _ => + { + _profileEditor?.RefreshAntags(); + _profileEditor?.RefreshJobs(); + }); - UpdateCharacterUI(); + _preferencesManager.OnServerDataLoaded += PreferencesDataLoaded; } public void OnStateEntered(LobbyState state) { + PreviewPanel?.SetLoaded(_preferencesManager.ServerDataLoaded); + ReloadCharacterSetup(); } public void OnStateExited(LobbyState state) { - EntityManager.DeleteEntity(_previewDummy); - _previewDummy = null; + PreviewPanel?.SetLoaded(false); + _characterSetup?.Dispose(); + _profileEditor?.Dispose(); + _characterSetup = null; + _profileEditor = null; } - public void SetPreviewPanel(LobbyCharacterPanel? panel) + + private void PreferencesDataLoaded() { - _previewPanel = panel; - UpdateCharacterUI(); + PreviewPanel?.SetLoaded(true); + + if (_stateManager.CurrentState is not LobbyState) + return; + + ReloadCharacterSetup(); } - public void SetProfileEditor(HumanoidProfileEditor? editor) + private LobbyCharacterPreviewPanel? GetLobbyPreview() { - _profileEditor = editor; - UpdateCharacterUI(); + return _stateManager.CurrentState is LobbyState lobby ? lobby.Lobby?.CharacterPreview : null; } - public void UpdateCharacterUI() + private void OnRequirementsUpdated() { - // Test moment - if (_stateManager.CurrentState is not LobbyState) + if (_profileEditor == null) return; - if (!_preferencesManager.ServerDataLoaded) - { - _previewPanel?.SetLoaded(false); + _profileEditor.RefreshAntags(); + _profileEditor.RefreshJobs(); + } + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs obj) + { + if (_profileEditor == null) return; - } - var maybeProfile = _profileEditor?.Profile ?? (HumanoidCharacterProfile) _preferencesManager.Preferences!.SelectedCharacter; + if (obj.WasModified()) + _profileEditor.RefreshSpecies(); + + if (obj.WasModified()) + _profileEditor.RefreshAntags(); + + if (obj.WasModified() + || obj.WasModified()) + _profileEditor.RefreshJobs(); + + if (obj.WasModified()) + _profileEditor.UpdateTraits(null, true); + + if (obj.WasModified()) + _profileEditor.UpdateLoadouts(null, true); + } + + + /// Reloads every single character setup control + public void ReloadCharacterSetup() + { + RefreshLobbyPreview(); + var (characterGui, profileEditor) = EnsureGui(); + characterGui.ReloadCharacterPickers(); + profileEditor.SetProfile( + (HumanoidCharacterProfile?) _preferencesManager.Preferences?.SelectedCharacter, + _preferencesManager.Preferences?.SelectedCharacterIndex); + } + + /// Refreshes the character preview in the lobby chat + private void RefreshLobbyPreview() + { + if (PreviewPanel == null) + return; - if (_previewDummy == null - || maybeProfile.Species != EntityManager.GetComponent(_previewDummy.Value).Species) + // Get selected character, load it, then set it + var character = _preferencesManager.Preferences?.SelectedCharacter; + + if (character is not HumanoidCharacterProfile humanoid) { - RespawnDummy(maybeProfile); - _previewPanel?.SetSprite(_previewDummy!.Value); + PreviewPanel.SetSprite(EntityUid.Invalid); + PreviewPanel.SetSummaryText(string.Empty); + return; } - _previewPanel?.SetLoaded(true); + var dummy = LoadProfileEntity(humanoid, true); + PreviewPanel.SetSprite(dummy); + PreviewPanel.SetSummaryText(humanoid.Summary); + } + + private void SaveProfile() + { + DebugTools.Assert(EditedProfile != null); - if (_previewDummy == null) + if (EditedProfile == null || EditedSlot == null) return; - _previewPanel?.SetSummaryText(maybeProfile.Summary); - _humanoid.LoadProfile(_previewDummy.Value, maybeProfile); + var selected = _preferencesManager.Preferences?.SelectedCharacterIndex; + if (selected == null) + return; + _preferencesManager.UpdateCharacter(EditedProfile, EditedSlot.Value); + ReloadCharacterSetup(); + } - if (UpdateClothes) + private (CharacterSetupGui, HumanoidProfileEditor) EnsureGui() + { + if (_characterSetup != null && _profileEditor != null) { - RemoveDummyClothes(_previewDummy.Value); - if (ShowClothes) - GiveDummyJobClothes(_previewDummy.Value, GetPreferredJob(maybeProfile), maybeProfile); - if (ShowLoadouts) - _loadouts.ApplyCharacterLoadout(_previewDummy.Value, GetPreferredJob(maybeProfile), maybeProfile, - _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted()); - UpdateClothes = false; + _characterSetup.Visible = true; + _profileEditor.Visible = true; + return (_characterSetup, _profileEditor); } - PreviewDummyUpdated?.Invoke(_previewDummy.Value); - } + _profileEditor = new HumanoidProfileEditor( + _preferencesManager, + _configurationManager, + EntityManager, + _dialogManager, + _playerManager, + _prototypeManager, + _requirements, + _markings); + _characterSetup = new CharacterSetupGui(EntityManager, _prototypeManager, _resourceCache, _preferencesManager, _profileEditor); - public void RespawnDummy(HumanoidCharacterProfile profile) - { - if (_previewDummy != null) - RemoveDummyClothes(_previewDummy.Value); + _characterSetup.CloseButton.OnPressed += _ => + { + // Reset sliders etc. + _profileEditor.SetProfile(null, null); + _profileEditor.Visible = false; + if (_stateManager.CurrentState is LobbyState lobbyGui) + { + lobbyGui.SwitchState(LobbyGui.LobbyGuiState.Default); + } + }; + + _profileEditor.Save += SaveProfile; + + _characterSetup.SelectCharacter += args => + { + _preferencesManager.SelectCharacter(args); + ReloadCharacterSetup(); + }; + + _characterSetup.DeleteCharacter += args => + { + _preferencesManager.DeleteCharacter(args); - EntityManager.DeleteEntity(_previewDummy); - _previewDummy = EntityManager.SpawnEntity( - _prototypeManager.Index(profile.Species).DollPrototype, MapCoordinates.Nullspace); + if (EditedSlot == args) + // Reload everything + ReloadCharacterSetup(); + else + // Only need to reload character pickers + _characterSetup?.ReloadCharacterPickers(); + }; - UpdateClothes = true; + if (_stateManager.CurrentState is LobbyState lobby) + lobby.Lobby?.CharacterSetupState.AddChild(_characterSetup); + + return (_characterSetup, _profileEditor); } - /// - /// Gets the highest priority job for the profile. - /// + #region Helpers + + /// Gets the highest priority job for the profile. public JobPrototype GetPreferredJob(HumanoidCharacterProfile profile) { var highPriorityJob = profile.JobPriorities.FirstOrDefault(p => p.Value == JobPriority.High).Key; - // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract (what is ReSharper smoking?) return _prototypeManager.Index(highPriorityJob ?? SharedGameTicker.FallbackOverflowJob); } @@ -166,9 +260,7 @@ public void RemoveDummyClothes(EntityUid dummy) EntityManager.DeleteEntity(unequippedItem.Value); } - /// - /// Applies the highest priority job's clothes and loadouts to the dummy. - /// + /// Applies the highest priority job's clothes and loadouts to the dummy. public void GiveDummyJobClothesLoadout(EntityUid dummy, HumanoidCharacterProfile profile) { var job = GetPreferredJob(profile); @@ -176,9 +268,7 @@ public void GiveDummyJobClothesLoadout(EntityUid dummy, HumanoidCharacterProfile _loadouts.ApplyCharacterLoadout(dummy, job, profile, _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted()); } - /// - /// Applies the specified job's clothes to the dummy. - /// + /// Applies the specified job's clothes to the dummy. public void GiveDummyJobClothes(EntityUid dummy, JobPrototype job, HumanoidCharacterProfile profile) { if (!_inventory.TryGetSlots(dummy, out var slots) @@ -202,8 +292,28 @@ public void GiveDummyJobClothes(EntityUid dummy, JobPrototype job, HumanoidChara } } - public EntityUid? GetPreviewDummy() + /// Loads the profile onto a dummy entity + public EntityUid LoadProfileEntity(HumanoidCharacterProfile? humanoid, bool jobClothes) { - return _previewDummy; + EntityUid dummyEnt; + + if (humanoid is not null) + { + var dummy = _prototypeManager.Index(humanoid.Species).DollPrototype; + dummyEnt = EntityManager.SpawnEntity(dummy, MapCoordinates.Nullspace); + } + else + dummyEnt = EntityManager.SpawnEntity( + _prototypeManager.Index(DefaultSpecies).DollPrototype, + MapCoordinates.Nullspace); + + _humanoid.LoadProfile(dummyEnt, humanoid); + + if (humanoid != null && jobClothes) + GiveDummyJobClothesLoadout(dummyEnt, humanoid); + + return dummyEnt; } + + #endregion } diff --git a/Content.Client/Lobby/UI/CharacterPickerButton.xaml b/Content.Client/Lobby/UI/CharacterPickerButton.xaml new file mode 100644 index 0000000000..fa428b9b61 --- /dev/null +++ b/Content.Client/Lobby/UI/CharacterPickerButton.xaml @@ -0,0 +1,11 @@ + + + + + [GenerateTypedNameReferences] + public sealed partial class CharacterSetupGui : Control + { + private readonly IClientPreferencesManager _preferencesManager; + private readonly IEntityManager _entManager; + private readonly IPrototypeManager _protomanager; + + private readonly Button _createNewCharacterButton; + + public event Action? SelectCharacter; + public event Action? DeleteCharacter; + + public CharacterSetupGui( + IEntityManager entManager, + IPrototypeManager protoManager, + IResourceCache resourceCache, + IClientPreferencesManager preferencesManager, + HumanoidProfileEditor profileEditor) + { + RobustXamlLoader.Load(this); + _preferencesManager = preferencesManager; + _entManager = entManager; + _protomanager = protoManager; + + var panelTex = resourceCache.GetTexture("/Textures/Interface/Nano/button.svg.96dpi.png"); + var back = new StyleBoxTexture + { + Texture = panelTex, + Modulate = new Color(37, 37, 42) + }; + back.SetPatchMargin(StyleBox.Margin.All, 10); + + BackgroundPanel.PanelOverride = back; + + _createNewCharacterButton = new Button + { + Text = Loc.GetString("character-setup-gui-create-new-character-button"), + }; + + _createNewCharacterButton.OnPressed += args => + { + preferencesManager.CreateCharacter(HumanoidCharacterProfile.Random()); + ReloadCharacterPickers(); + args.Event.Handle(); + }; + + CharEditor.AddChild(profileEditor); + RulesButton.OnPressed += _ => new RulesAndInfoWindow().Open(); + + StatsButton.OnPressed += _ => new PlaytimeStatsWindow().OpenCentered(); + } + + /// + /// Disposes and reloads all character picker buttons from the preferences data. + /// + public void ReloadCharacterPickers() + { + _createNewCharacterButton.Orphan(); + Characters.DisposeAllChildren(); + + var numberOfFullSlots = 0; + var characterButtonsGroup = new ButtonGroup(); + + if (!_preferencesManager.ServerDataLoaded) + { + return; + } + + _createNewCharacterButton.ToolTip = + Loc.GetString("character-setup-gui-create-new-character-button-tooltip", + ("maxCharacters", _preferencesManager.Settings!.MaxCharacterSlots)); + + var selectedSlot = _preferencesManager.Preferences?.SelectedCharacterIndex; + + foreach (var (slot, character) in _preferencesManager.Preferences!.Characters) + { + numberOfFullSlots++; + var characterPickerButton = new CharacterPickerButton(_entManager, + _protomanager, + characterButtonsGroup, + character, + slot == selectedSlot); + + Characters.AddChild(characterPickerButton); + + characterPickerButton.OnPressed += args => + { + SelectCharacter?.Invoke(slot); + }; + + characterPickerButton.OnDeletePressed += () => + { + DeleteCharacter?.Invoke(slot); + }; + } + + _createNewCharacterButton.Disabled = numberOfFullSlots >= _preferencesManager.Settings.MaxCharacterSlots; + Characters.AddChild(_createNewCharacterButton); + } + } +} diff --git a/Content.Client/Preferences/UI/HighlightedContainer.xaml b/Content.Client/Lobby/UI/HighlightedContainer.xaml similarity index 100% rename from Content.Client/Preferences/UI/HighlightedContainer.xaml rename to Content.Client/Lobby/UI/HighlightedContainer.xaml diff --git a/Content.Client/Preferences/UI/HighlightedContainer.xaml.cs b/Content.Client/Lobby/UI/HighlightedContainer.xaml.cs similarity index 88% rename from Content.Client/Preferences/UI/HighlightedContainer.xaml.cs rename to Content.Client/Lobby/UI/HighlightedContainer.xaml.cs index 68294d0f05..084c1c3709 100644 --- a/Content.Client/Preferences/UI/HighlightedContainer.xaml.cs +++ b/Content.Client/Lobby/UI/HighlightedContainer.xaml.cs @@ -2,7 +2,7 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -namespace Content.Client.Preferences.UI; +namespace Content.Client.Lobby.UI; [GenerateTypedNameReferences] public sealed partial class HighlightedContainer : PanelContainer diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml similarity index 72% rename from Content.Client/Preferences/UI/HumanoidProfileEditor.xaml rename to Content.Client/Lobby/UI/HumanoidProfileEditor.xaml index 3440c16b82..df364546ba 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml @@ -1,8 +1,8 @@ @@ -17,12 +17,12 @@ public AlignRCDConstruction(PlacementManager pMan) : base(pMan) { - var dependencies = IoCManager.Instance!; - _entityManager = dependencies.Resolve(); - _mapManager = dependencies.Resolve(); - _playerManager = dependencies.Resolve(); - _stateManager = dependencies.Resolve(); - + IoCManager.InjectDependencies(this); _mapSystem = _entityManager.System(); _rcdSystem = _entityManager.System(); _transformSystem = _entityManager.System(); diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs index 2ee7e30ec9..d00e319eed 100644 --- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs +++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs @@ -195,9 +195,16 @@ private void OnParentChanged(EntityUid uid, ReplaySpectatorComponent component, if (uid != _player.LocalEntity) return; - if (args.Transform.MapUid != null || args.OldMapId == MapId.Nullspace) + if (args.Transform.MapUid != null || args.OldMapId == null) return; + if (_spectatorData != null) + { + // Currently scrubbing/setting the replay tick + // the observer will get respawned once the state was applied + return; + } + // The entity being spectated from was moved to null-space. // This was probably because they were spectating some entity in a client-side replay that left PVS range. // Simple respawn the ghost. diff --git a/Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs b/Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs new file mode 100644 index 0000000000..0219c965cd --- /dev/null +++ b/Content.Client/Robotics/Systems/RoboticsConsoleSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Robotics.Systems; + +namespace Content.Client.Robotics.Systems; + +public sealed class RoboticsConsoleSystem : SharedRoboticsConsoleSystem +{ +} diff --git a/Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs b/Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs new file mode 100644 index 0000000000..6185979eee --- /dev/null +++ b/Content.Client/Robotics/UI/RoboticsConsoleBoundUserInterface.cs @@ -0,0 +1,50 @@ +using Content.Shared.Robotics; +using Robust.Client.GameObjects; + +namespace Content.Client.Robotics.UI; + +public sealed class RoboticsConsoleBoundUserInterface : BoundUserInterface +{ + [ViewVariables] + public RoboticsConsoleWindow _window = default!; + + public RoboticsConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _window = new RoboticsConsoleWindow(Owner); + _window.OnDisablePressed += address => + { + SendMessage(new RoboticsConsoleDisableMessage(address)); + }; + _window.OnDestroyPressed += address => + { + SendMessage(new RoboticsConsoleDestroyMessage(address)); + }; + _window.OnClose += Close; + + _window.OpenCentered(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (state is not RoboticsConsoleState cast) + return; + + _window?.UpdateState(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + _window?.Dispose(); + } +} diff --git a/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml b/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml new file mode 100644 index 0000000000..a3b3978790 --- /dev/null +++ b/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml @@ -0,0 +1,40 @@ + + + + + + + + + +