From 2261ec8f5faf70922b2f448aaed6fe6377b081ca Mon Sep 17 00:00:00 2001 From: Aera Aulin Date: Thu, 13 Mar 2025 11:28:14 -0700 Subject: [PATCH] merge master and hope things don't break --- Content.Benchmarks/DynamicTreeBenchmark.cs | 2 +- .../UI/Bwoink/BwoinkControl.xaml.cs | 42 +- .../UI/Bwoink/BwoinkWindow.xaml.cs | 7 +- .../Systems/SpeakOnUIClosedSystem.cs | 5 + .../SolutionContainerVisualsSystem.cs | 1 - .../Controls/GuideReagentReaction.xaml | 52 +- .../Humanoid/HumanoidAppearanceSystem.cs | 53 + Content.Client/Lathe/UI/LatheMenu.xaml | 1 + Content.Client/Lathe/UI/LatheMenu.xaml.cs | 2 + .../Light/AfterLightTargetOverlay.cs | 2 +- .../Light/EntitySystems/PlanetLightSystem.cs | 2 + .../Light/EntitySystems/SunShadowSystem.cs | 92 + Content.Client/Light/LightCycleSystem.cs | 11 + Content.Client/Light/RoofOverlay.cs | 6 +- Content.Client/Light/SunShadowOverlay.cs | 154 + .../Options/UI/Tabs/AccessibilityTab.xaml | 5 + .../Options/UI/Tabs/AccessibilityTab.xaml.cs | 2 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 45 + .../UserInterface/Controls/ListContainer.cs | 6 +- .../DamageOverlayUiController.cs | 32 +- .../DamageOverlays/Overlays/DamageOverlay.cs | 16 +- .../UI/VendingMachineItem.xaml.cs | 5 + .../UI/VendingMachineMenu.xaml.cs | 69 +- .../VendingMachineBoundUserInterface.cs | 15 +- .../VendingMachines/VendingMachineSystem.cs | 70 +- .../Construction/Interaction/CraftingTests.cs | 3 + .../Tests/ContrabandTest.cs | 27 +- .../Interaction/InteractionTest.Helpers.cs | 5 +- .../Tests/MagazineVisualsSpriteTest.cs | 75 +- .../Tests/_DV/MetempsychosisTest.cs | 55 - Content.Server/Access/Systems/IdCardSystem.cs | 7 +- .../Commands/ForceGhostCommand.cs | 61 + .../Administration/Systems/AdminSystem.cs | 9 +- .../EntitySystems/SpeakOnUIClosedSystem.cs | 19 +- .../Arcade/BlockGame/BlockGameArcadeSystem.cs | 6 +- .../SpaceVillainArcadeSystem.cs | 26 +- .../Body/Systems/BloodstreamSystem.cs | 22 +- Content.Server/Cloning/AcceptCloningEui.cs | 8 +- .../Cloning/CloningConsoleSystem.cs | 10 +- Content.Server/Cloning/CloningPodSystem.cs | 330 ++ Content.Server/Cloning/CloningSystem.cs | 459 +-- .../Components/RandomCloneSpawnerComponent.cs | 17 + .../Cloning/RandomCloneSpawnerSystem.cs | 47 + .../EntitySystems/TriggerSystem.Voice.cs | 12 + .../Forensics/Systems/ForensicsSystem.cs | 65 +- Content.Server/Ghost/GhostCommand.cs | 2 +- Content.Server/Ghost/GhostSystem.cs | 11 +- Content.Server/Ghost/Roles/GhostRoleSystem.cs | 2 +- .../Implants/SubdermalImplantSystem.cs | 16 +- .../Light/EntitySystems/LightCycleSystem.cs | 4 +- .../Light/EntitySystems/SunShadowSystem.cs | 8 + .../Components/MedicalScannerComponent.cs | 3 - .../Components/NPCRangedCombatComponent.cs | 7 + Content.Server/NPC/HTN/HTNComponent.cs | 8 +- Content.Server/NPC/HTN/HTNSystem.cs | 38 +- .../Preconditions/TargetInLOSPrecondition.cs | 7 +- .../Operators/Combat/Ranged/GunOperator.cs | 8 + .../Considerations/TargetTargetingCon.cs | 12 + .../NPC/Systems/NPCCombatSystem.Ranged.cs | 5 +- .../NPC/Systems/NPCUtilitySystem.cs | 10 + Content.Server/Objectives/ObjectivesSystem.cs | 23 +- Content.Server/Parallax/BiomeSystem.cs | 3 + .../Components/SinguloFoodComponent.cs | 18 +- .../EntitySystems/SingularitySystem.cs | 7 +- .../EntitySystems/AddAccentClothingSystem.cs | 2 + .../Store/Systems/StoreSystem.Listings.cs | 16 +- .../Store/Systems/StoreSystem.Ui.cs | 2 +- .../Traits/Assorted/UnrevivableSystem.cs | 20 + .../VendingMachines/VendingMachineSystem.cs | 244 +- .../StorageVoiceControlComponent.cs | 19 + .../VoiceTrigger/StorageVoiceControlSystem.cs | 98 + .../Zombies/ZombieSystem.Transform.cs | 13 +- Content.Server/Zombies/ZombieSystem.cs | 31 +- .../_DV/Chapel/SacrificialAltarSystem.cs | 3 +- .../Cloning/CloningSystem.Metempsychosis.cs | 172 - .../Cloning/MetempsychosisKarmaComponent.cs | 11 - .../Cloning/MetempsychoticMachineComponent.cs | 27 - .../Components/ParadoxClonerRuleComponent.cs | 9 +- .../StationEvents/Events/ParadoxClonerRule.cs | 38 +- .../_DV/VendingMachines/ShopVendorSystem.cs | 10 - .../Medical/Surgery/GhettoSurgerySystem.cs | 7 +- .../_Shitmed/Medical/Surgery/SurgerySystem.cs | 14 +- Content.Shared/Access/AccessLevelPrototype.cs | 8 +- .../Components/SpeakOnUIClosedComponent.cs | 8 +- .../Systems/SharedSpeakOnUIClosedSystem.cs | 16 + Content.Shared/CCVar/CCVars.Accessibility.cs | 12 + Content.Shared/CCVar/CCVars.Game.cs | 6 + .../SolutionContainerVisualsComponent.cs | 3 - Content.Shared/Cloning/CloningEvents.cs | 13 + Content.Shared/Cloning/CloningPodComponent.cs | 38 +- .../Cloning/CloningSettingsPrototype.cs | 60 + .../Damage/Components/DamageableComponent.cs | 7 + .../FingerprintReaderComponent.cs | 35 + .../FingerprintReaderSystem.cs | 100 + Content.Shared/Foldable/FoldableSystem.cs | 7 +- .../Forensics/Components/DnaComponent.cs | 2 +- Content.Shared/Forensics/Events.cs | 2 +- .../Humanoid/HumanoidAppearanceComponent.cs | 11 +- .../Humanoid/HumanoidVisualLayers.cs | 5 +- .../Humanoid/Markings/MarkingCategories.cs | 8 +- .../Humanoid/Markings/MarkingColoring.cs | 6 +- Content.Shared/Humanoid/NamingSystem.cs | 11 +- .../Humanoid/Prototypes/SpeciesPrototype.cs | 6 +- .../SharedHumanoidAppearanceSystem.cs | 4 - .../Light/Components/IsRoofComponent.cs | 9 + .../Components/SunShadowCastComponent.cs | 25 + .../Light/Components/SunShadowComponent.cs | 25 + .../Components/SunShadowCycleComponent.cs | 35 + .../EntitySystems}/SharedLightCycleSystem.cs | 20 +- .../Light/EntitySystems/SharedRoofSystem.cs | 36 + .../EntitySystems/SharedSunShadowSystem.cs | 39 + .../EntitySystems/NameModifierSystem.cs | 12 + .../SharedEntityStorageComponent.cs | 11 +- .../SharedEntityStorageSystem.cs | 92 +- .../EntitySystems/SharedStorageSystem.cs | 2 +- Content.Shared/Storage/StorageComponent.cs | 7 + .../Traits/Assorted/UnrevivableComponent.cs | 6 + .../Turrets/TurretTargetSettingsComponent.cs | 19 + .../Turrets/TurretTargetSettingsSystem.cs | 126 + .../SharedVendingMachineSystem.Restock.cs | 2 +- .../SharedVendingMachineSystem.cs | 269 +- .../VendingMachineComponent.cs | 100 +- .../_DV/Physics/CollidingVisualsComponent.cs | 42 + .../_DV/Physics/CollidingVisualsSystem.cs | 64 + .../VendingMachines/SharedShopVendorSystem.cs | 10 +- .../_DV/Whitelist/AiDetectableComponent.cs | 9 + Resources/Changelog/Admin.yml | 21 + Resources/Changelog/Changelog.yml | 322 +- Resources/Changelog/DeltaVChangelog.yml | 99 +- Resources/ConfigPresets/Build/debug.toml | 1 + .../ConfigPresets/Build/development.toml | 1 + Resources/ConfigPresets/DeltaV/deltav.toml | 1 + .../customobjectivesummary.ftl | 2 - .../en-US/_DV/datasets/names/chitinid.ftl | 68 + .../Locale/en-US/_DV/datasets/names/oni.ftl | 83 + .../en-US/_DV/datasets/names/rodentia.ftl | 431 +++ .../en-US/_DV/datasets/names/vulpkanin.ftl | 947 ++++++ .../_DV/guidebook/chemistry/conditions.ftl | 1 + .../Locale/en-US/_DV/markings/felinid.ftl | 17 + .../_DV/navmap-beacons/station-beacons.ftl | 2 +- .../_DV/preferences/ui/markings-picker.ftl | 2 - .../entities/objects/misc/pet_carrier.ftl | 2 + .../en-US/_DV/reagents/meta/medicine.ftl | 3 + .../en-US/_DV/research/technologies.ftl | 3 + .../Locale/en-US/_DV/species/namepreset.ftl | 1 + .../Locale/en-US/_DV/species/species.ftl | 2 + .../en-US/_DV/store/uplink/deception.ftl | 4 + Resources/Locale/en-US/_DV/tips.ftl | 15 +- .../Locale/en-US/_EE/datasets/ipc-names.ftl | 1104 +++++++ .../_Impstation/datasets/names/thaven.ftl | 76 + .../en-US/_Impstation/markings/undershirt.ftl | 9 - .../en-US/_Impstation/markings/underwear.ftl | 6 - .../administration/commands/forceghost.ftl | 6 + .../storage-voice-control-component.ftl | 1 + .../en-US/datasets/names/arachnid_first.ftl | 73 + .../en-US/datasets/names/arachnid_last.ftl | 68 + Resources/Locale/en-US/datasets/names/atv.ftl | 16 + .../Locale/en-US/datasets/names/autoborg.ftl | 50 + .../Locale/en-US/datasets/names/borg.ftl | 43 + .../en-US/datasets/names/cargo_shuttle.ftl | 8 + .../Locale/en-US/datasets/names/clown.ftl | 52 + .../en-US/datasets/names/cookie_fortune.ftl | 79 + .../en-US/datasets/names/death_commando.ftl | 59 + .../en-US/datasets/names/diona_first.ftl | 89 + .../en-US/datasets/names/diona_last.ftl | 128 + .../en-US/datasets/names/fake_human_first.ftl | 43 + .../en-US/datasets/names/fake_human_last.ftl | 78 + .../Locale/en-US/datasets/names/first.ftl | 1395 +++++++++ .../en-US/datasets/names/first_female.ftl | 771 +++++ .../en-US/datasets/names/first_male.ftl | 666 ++++ .../Locale/en-US/datasets/names/golem.ftl | 1336 ++++++++ .../Locale/en-US/datasets/names/hologram.ftl | 14 + .../Locale/en-US/datasets/names/last.ftl | 553 ++++ .../en-US/datasets/names/military_first.ftl | 3 + .../datasets/names/military_first_leader.ftl | 4 + .../en-US/datasets/names/military_last.ftl | 42 + .../datasets/names/moth_first_female.ftl | 93 + .../en-US/datasets/names/moth_first_male.ftl | 94 + .../Locale/en-US/datasets/names/moth_last.ftl | 59 + .../en-US/datasets/names/mushman_first.ftl | 54 + .../en-US/datasets/names/mushman_last.ftl | 97 + .../Locale/en-US/datasets/names/ninja.ftl | 39 + .../en-US/datasets/names/ninja_title.ftl | 46 + .../en-US/datasets/names/operation_prefix.ftl | 102 + .../en-US/datasets/names/operation_suffix.ftl | 102 + .../en-US/datasets/names/regalrat_kingdom.ftl | 15 + .../en-US/datasets/names/regalrat_title.ftl | 17 + .../en-US/datasets/names/reptilian_female.ftl | 163 + .../en-US/datasets/names/reptilian_male.ftl | 328 ++ .../datasets/names/revenant_adjective.ftl | 18 + .../en-US/datasets/names/revenant_theme.ftl | 18 + .../en-US/datasets/names/revenant_type.ftl | 8 + .../Locale/en-US/datasets/names/rollie.ftl | 37 + .../en-US/datasets/names/skeleton_first.ftl | 28 + .../en-US/datasets/names/syndicate_elite.ftl | 23 + .../en-US/datasets/names/syndicate_normal.ftl | 25 + .../en-US/datasets/names/syndicate_prefix.ftl | 2 + Resources/Locale/en-US/datasets/names/vox.ftl | 2761 ++++++++++++++++ .../en-US/datasets/names/wizard_first.ftl | 30 + .../en-US/datasets/names/wizard_last.ftl | 46 + .../en-US/escape-menu/ui/options-menu.ftl | 46 + .../fingerprint-reader/fingerprint-reader.ftl | 2 + .../Locale/en-US/lathe/ui/lathe-menu.ftl | 4 + Resources/Locale/en-US/markings/scars.ftl | 15 + .../Locale/en-US/markings/undergarment.ftl | 21 + .../components/cloning-console-component.ftl | 3 +- .../nyanotrasen/research/technologies.ftl | 2 - .../en-US/nyanotrasen/species/namepreset.ftl | 1 - .../en-US/nyanotrasen/species/species.ftl | 2 - .../en-US/preferences/ui/markings-picker.ftl | 2 + .../en-US/prototypes/access/accesses.ftl | 4 + .../Locale/en-US/store/uplink-catalog.ftl | 2 +- Resources/Maps/Shuttles/trading_outpost.yml | 163 +- .../_DV/Shuttles/roboneuroticist_ship.yml | 188 +- Resources/Migrations/deltaMigrations.yml | 4 + Resources/Prototypes/Access/command.yml | 12 +- Resources/Prototypes/Access/silicon.yml | 21 + .../Catalog/Fills/Lockers/security.yml | 10 +- .../VendingMachines/Inventories/pride.yml | 2 + Resources/Prototypes/Damage/modifier_sets.yml | 1 - .../Datasets/Names/Operation_prefix.yml | 105 - .../Datasets/Names/Operation_suffix.yml | 105 - .../Prototypes/Datasets/Names/arachnid.yml | 11 + .../Datasets/Names/arachnid_first.yml | 76 - .../Datasets/Names/arachnid_last.yml | 71 - Resources/Prototypes/Datasets/Names/atv.yml | 22 +- .../Prototypes/Datasets/Names/autoborg.yml | 56 +- Resources/Prototypes/Datasets/Names/base.yml | 11 + .../Datasets/Names/base_gendered.yml | 11 + Resources/Prototypes/Datasets/Names/borg.yml | 49 +- .../Datasets/Names/cargo_shuttle.yml | 14 +- Resources/Prototypes/Datasets/Names/clown.yml | 58 +- .../Datasets/Names/death_commando.yml | 65 +- Resources/Prototypes/Datasets/Names/diona.yml | 227 +- .../Prototypes/Datasets/Names/fake_human.yml | 11 + .../Datasets/Names/fake_human_first.yml | 46 - .../Datasets/Names/fake_human_last.yml | 81 - Resources/Prototypes/Datasets/Names/first.yml | 1398 --------- .../Datasets/Names/first_female.yml | 774 ----- .../Prototypes/Datasets/Names/first_male.yml | 669 ---- .../Prototypes/Datasets/Names/fortunes.yml | 85 +- Resources/Prototypes/Datasets/Names/golem.yml | 1342 +------- .../Prototypes/Datasets/Names/hologram.yml | 20 +- Resources/Prototypes/Datasets/Names/last.yml | 557 ---- .../Prototypes/Datasets/Names/military.yml | 71 +- Resources/Prototypes/Datasets/Names/moth.yml | 17 + .../Datasets/Names/moth_first_female.yml | 49 - .../Datasets/Names/moth_first_male.yml | 50 - .../Prototypes/Datasets/Names/moth_last.yml | 37 - .../Datasets/Names/mushman_first.yml | 60 +- .../Datasets/Names/mushman_last.yml | 103 +- Resources/Prototypes/Datasets/Names/ninja.yml | 51 +- .../Prototypes/Datasets/Names/ninja_title.yml | 49 - .../Prototypes/Datasets/Names/operation.yml | 11 + .../Prototypes/Datasets/Names/regalrat.yml | 44 +- .../Datasets/Names/reptilian_female.yml | 169 +- .../Datasets/Names/reptilian_male.yml | 334 +- .../Prototypes/Datasets/Names/revenant.yml | 62 +- .../Prototypes/Datasets/Names/rollie.yml | 45 +- .../Datasets/Names/skeleton_first.yml | 33 +- .../Prototypes/Datasets/Names/syndicate.yml | 68 +- Resources/Prototypes/Datasets/Names/vox.yml | 2767 +---------------- .../Prototypes/Datasets/Names/wizard.yml | 11 + .../Datasets/Names/wizard_first.yml | 33 - .../Prototypes/Datasets/Names/wizard_last.yml | 49 - Resources/Prototypes/Datasets/ion_storm.yml | 2 +- Resources/Prototypes/Datasets/tips.yml | 2 +- .../Prototypes/DeviceLinking/source_ports.yml | 2 + .../Entities/Clothing/Head/specific.yml | 31 + .../Entities/Clothing/Neck/cloaks.yml | 9 + .../Entities/Clothing/Neck/pins.yml | 11 + .../Entities/Clothing/Neck/scarfs.yml | 11 + .../Markers/Spawners/Random/maintenance.yml | 2 + .../Mobs/Customization/Markings/scars.yml | 49 + .../Customization/Markings/undergarments.yml | 223 ++ .../Mobs/Cyborgs/base_borg_chassis.yml | 6 +- .../Entities/Mobs/NPCs/regalrat.yml | 4 +- .../Entities/Mobs/NPCs/revenant.yml | 6 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 3 + .../Mobs/Player/ShuttleRoles/settings.yml | 34 +- .../Entities/Mobs/Player/admin_ghost.yml | 1 + .../Prototypes/Entities/Mobs/Player/clone.yml | 96 + .../Entities/Mobs/Player/guardian.yml | 2 +- .../Prototypes/Entities/Mobs/Player/human.yml | 6 +- .../Entities/Mobs/Player/humanoid.yml | 66 +- .../Entities/Mobs/Player/silicon.yml | 4 +- .../Entities/Mobs/Species/arachnid.yml | 7 +- .../Prototypes/Entities/Mobs/Species/base.yml | 8 +- .../Entities/Mobs/Species/dwarf.yml | 4 +- .../Prototypes/Entities/Mobs/Species/moth.yml | 6 +- .../Entities/Mobs/Species/reptilian.yml | 2 + .../Prototypes/Entities/Mobs/Species/vox.yml | 8 +- .../Objects/Consumable/Food/Baked/pizza.yml | 6 - .../Objects/Consumable/Food/ingredients.yml | 2 +- .../Objects/Consumable/Food/snacks.yml | 2 +- .../Smokeables/Cigarettes/joints.yml | 4 +- .../Entities/Objects/Devices/pda.yml | 2 +- .../Objects/Materials/Sheets/metal.yml | 8 + .../Objects/Materials/Sheets/other.yml | 5 +- .../Entities/Objects/Misc/arabianlamp.yml | 1 - .../Objects/Misc/identification_cards.yml | 1 + .../Entities/Objects/Misc/paper.yml | 109 +- .../Prototypes/Entities/Objects/Misc/pen.yml | 14 + .../Entities/Objects/Misc/pet_carrier.yml | 7 +- .../Objects/Specific/Medical/morgue.yml | 4 + .../Objects/Tools/access_configurator.yml | 18 +- .../Entities/Objects/Tools/decoys.yml | 2 +- .../Structures/Machines/artifact_analyzer.yml | 3 + .../Power/Generation/PA/particles.yml | 1 + .../Structures/Specific/Anomaly/anomalies.yml | 3 - .../Entities/Structures/Walls/meteor.yml | 3 - .../Entities/Structures/Walls/walls.yml | 1 + Resources/Prototypes/Flavors/flavors.yml | 2 +- Resources/Prototypes/GameRules/events.yml | 10 +- Resources/Prototypes/GameRules/roundstart.yml | 14 +- .../Prototypes/GameRules/subgamemodes.yml | 4 +- .../Loadouts/Miscellaneous/trinkets.yml | 6 + .../Prototypes/Loadouts/loadout_groups.yml | 1 + Resources/Prototypes/NPCs/root.yml | 33 + Resources/Prototypes/NPCs/utility_queries.yml | 4 + .../Nyanotrasen/Datasets/Names/oni_female.yml | 21 - .../Datasets/Names/oni_location.yml | 31 - .../Nyanotrasen/Datasets/Names/oni_male.yml | 20 - .../Markers/Spawners/Random/devices.yml | 1 - .../Devices/CircuitBoards/production.yml | 18 +- .../Machines/metempsychoticMachine.yml | 25 - .../Recipes/Lathes/electronics.yml | 5 - .../Nyanotrasen/Research/experimental.yml | 16 - .../Nyanotrasen/metempsychoticHumanoids.yml | 16 - .../metempsychoticNonHumanoids.yml | 10 - Resources/Prototypes/Reagents/medicine.yml | 42 +- .../Prototypes/Recipes/Reactions/food.yml | 2 +- Resources/Prototypes/Species/arachnid.yml | 18 +- Resources/Prototypes/Species/diona.yml | 24 +- Resources/Prototypes/Species/gingerbread.yml | 2 - Resources/Prototypes/Species/human.yml | 18 +- Resources/Prototypes/Species/moth.yml | 24 +- Resources/Prototypes/Species/reptilian.yml | 22 +- Resources/Prototypes/Species/skeleton.yml | 4 +- Resources/Prototypes/Species/slime.yml | 12 +- Resources/Prototypes/Species/vox.yml | 14 +- .../_DV/Catalog/Cargo/cargo_vending.yml | 2 +- .../_DV/Catalog/Fills/Crates/food.yml | 37 + .../_DV/Catalog/Uplink/deception.yml | 29 + .../Prototypes/_DV/Catalog/uplink_catalog.yml | 14 - .../Datasets/Names/chitinid_first_female.yml | 35 +- .../Datasets/Names/chitinid_first_male.yml | 37 +- .../_DV/Datasets/Names/oni_female.yml | 5 + .../_DV/Datasets/Names/oni_location.yml | 5 + .../_DV/Datasets/Names/oni_male.yml | 5 + .../_DV/Datasets/Names/rodentia_female.yml | 170 +- .../_DV/Datasets/Names/rodentia_last.yml | 90 +- .../_DV/Datasets/Names/rodentia_male.yml | 178 +- .../_DV/Datasets/Names/vulpkanin_female.yml | 349 +-- .../_DV/Datasets/Names/vulpkanin_last.yml | 256 +- .../_DV/Datasets/Names/vulpkanin_male.yml | 349 +-- .../Mobs/Customization/Markings/felinid.yml | 72 + .../_DV/Entities/Mobs/Species/chitinid.yml | 6 +- .../_DV/Entities/Mobs/Species/feroxi.yml | 4 +- .../_DV/Entities/Mobs/Species/harpy.yml | 8 +- .../_DV/Entities/Mobs/Species/rodentia.yml | 4 +- .../_DV/Entities/Mobs/Species/vulpkanin.yml | 4 +- .../Objects/Devices/station_beacon.yml | 2 +- .../Objects/Specific/Robotics/id_chips.yml | 7 + .../Entities/Objects/Tools/ai_detector.yml | 57 + .../Prototypes/_DV/Reagents/medicine.yml | 25 + .../_DV/Recipes/Lathes/Packs/medical.yml | 3 +- .../_DV/Recipes/Reactions/medicine.yml | 13 + .../Prototypes/_DV/Research/experimental.yml | 16 + .../_DV/Roles/Jobs/requirement_overrides.yml | 8 + .../{Nyanotrasen => _DV}/Species/Oni.yml | 6 - Resources/Prototypes/_DV/Species/chitinid.yml | 10 +- .../{Nyanotrasen => _DV}/Species/felinid.yml | 8 +- Resources/Prototypes/_DV/Species/feroxi.yml | 8 +- Resources/Prototypes/_DV/Species/harpy.yml | 10 +- Resources/Prototypes/_DV/Species/rodentia.yml | 10 +- .../Prototypes/_DV/Species/vulpkanin.yml | 10 +- .../Prototypes/_DV/Traits/disabilities.yml | 8 - .../Prototypes/_EE/Datasets/ipc_names.yml | 1108 +------ .../_Impstation/Datasets/Names/thaven.yml | 82 +- .../Customization/Markings/undershirt.yml | 84 +- .../Mobs/Customization/Markings/underwear.yml | 54 +- .../Prototypes/_Impstation/Species/thaven.yml | 6 +- .../Entities/Surgery/surgery_steps.yml | 9 +- Resources/ServerInfo/Guidebook/Mobs/IPCs.xml | 5 +- .../ServerInfo/Guidebook/Mobs/SlimePerson.xml | 2 +- .../equipped-EYES-arachnid.png | Bin 0 -> 3090 bytes .../commandglasses.rsi/equipped-EYES-moth.png | Bin 0 -> 3086 bytes .../Eyes/Glasses/commandglasses.rsi/meta.json | 10 +- .../gar.rsi/alt-equipped-EYES-arachnid.png | Bin 0 -> 3036 bytes .../gar.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3054 bytes .../Clothing/Eyes/Glasses/gar.rsi/meta.json | 14 +- .../gar.rsi/super-equipped-EYES-arachnid.png | Bin 0 -> 3046 bytes .../glasses.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3185 bytes .../glasses.rsi/equipped-EYES-moth.png | Bin 0 -> 3097 bytes .../Eyes/Glasses/glasses.rsi/meta.json | 10 +- .../jamjar.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3176 bytes .../Glasses/jamjar.rsi/equipped-EYES-moth.png | Bin 0 -> 3190 bytes .../Eyes/Glasses/jamjar.rsi/meta.json | 10 +- .../jensen.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3186 bytes .../Glasses/jensen.rsi/equipped-EYES-moth.png | Bin 0 -> 3140 bytes .../Eyes/Glasses/jensen.rsi/meta.json | 10 +- .../equipped-EYES-arachnid.png | Bin 0 -> 3168 bytes .../mercglasses.rsi/equipped-EYES-moth.png | Bin 0 -> 3124 bytes .../Eyes/Glasses/mercglasses.rsi/meta.json | 10 +- .../meson.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3207 bytes .../Glasses/meson.rsi/equipped-EYES-moth.png | Bin 0 -> 3157 bytes .../Clothing/Eyes/Glasses/meson.rsi/meta.json | 10 +- .../ninjavisor.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3186 bytes .../Eyes/Glasses/ninjavisor.rsi/meta.json | 6 +- .../equipped-EYES-arachnid.png | Bin 0 -> 3268 bytes .../outlawglasses.rsi/equipped-EYES-moth.png | Bin 0 -> 3201 bytes .../Eyes/Glasses/outlawglasses.rsi/meta.json | 10 +- .../science.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3174 bytes .../science.rsi/equipped-EYES-moth.png | Bin 0 -> 3146 bytes .../Eyes/Glasses/science.rsi/meta.json | 10 +- .../secglasses.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3095 bytes .../secglasses.rsi/equipped-EYES-moth.png | Bin 0 -> 3067 bytes .../Eyes/Glasses/secglasses.rsi/meta.json | 10 +- .../sunglasses.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3089 bytes .../sunglasses.rsi/equipped-EYES-moth.png | Bin 0 -> 3080 bytes .../Eyes/Glasses/sunglasses.rsi/meta.json | 10 +- .../thermal.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3151 bytes .../thermal.rsi/equipped-EYES-moth.png | Bin 0 -> 3148 bytes .../Eyes/Glasses/thermal.rsi/meta.json | 10 +- .../equipped-EYES-arachnid.png | Bin 0 -> 3136 bytes .../beergoggles.rsi/equipped-EYES-moth.png | Bin 0 -> 3096 bytes .../Eyes/Hud/beergoggles.rsi/inhand-left.png | Bin 0 -> 375 bytes .../Eyes/Hud/beergoggles.rsi/inhand-right.png | Bin 0 -> 379 bytes .../Eyes/Hud/beergoggles.rsi/meta.json | 18 +- .../Hud/beerpatch.rsi/equipped-EYES-moth.png | Bin 0 -> 3076 bytes .../Clothing/Eyes/Hud/beerpatch.rsi/meta.json | 6 +- .../command.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3112 bytes .../Hud/command.rsi/equipped-EYES-moth.png | Bin 0 -> 3108 bytes .../Clothing/Eyes/Hud/command.rsi/meta.json | 10 +- .../Hud/diag.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3113 bytes .../Eyes/Hud/diag.rsi/equipped-EYES-moth.png | Bin 0 -> 3111 bytes .../Clothing/Eyes/Hud/diag.rsi/meta.json | 10 +- .../Hud/diagpatch.rsi/equipped-EYES-moth.png | Bin 0 -> 3074 bytes .../Clothing/Eyes/Hud/diagpatch.rsi/meta.json | 6 +- .../friedonion.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3286 bytes .../Hud/friedonion.rsi/equipped-EYES-moth.png | Bin 0 -> 3215 bytes .../Eyes/Hud/friedonion.rsi/meta.json | 10 +- .../Hud/med.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3101 bytes .../Eyes/Hud/med.rsi/equipped-EYES-moth.png | Bin 0 -> 3109 bytes .../Clothing/Eyes/Hud/med.rsi/meta.json | 10 +- .../medonion.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3303 bytes .../Hud/medonion.rsi/equipped-EYES-moth.png | Bin 0 -> 3217 bytes .../Clothing/Eyes/Hud/medonion.rsi/meta.json | 10 +- .../equipped-EYES-arachnid.png | Bin 0 -> 3319 bytes .../Eyes/Hud/medonionbeer.rsi/inhand-left.png | Bin 0 -> 583 bytes .../Hud/medonionbeer.rsi/inhand-right.png | Bin 0 -> 591 bytes .../Eyes/Hud/medonionbeer.rsi/meta.json | 14 +- .../Hud/medpatch.rsi/equipped-EYES-moth.png | Bin 0 -> 3072 bytes .../Clothing/Eyes/Hud/medpatch.rsi/meta.json | 6 +- .../Hud/medsec.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3180 bytes .../Hud/medsec.rsi/equipped-EYES-moth.png | Bin 0 -> 3189 bytes .../Eyes/Hud/medsec.rsi/inhand-left.png | Bin 0 -> 481 bytes .../Eyes/Hud/medsec.rsi/inhand-right.png | Bin 0 -> 488 bytes .../Clothing/Eyes/Hud/medsec.rsi/meta.json | 18 +- .../medsecengi.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3242 bytes .../Hud/medsecengi.rsi/equipped-EYES-moth.png | Bin 0 -> 3233 bytes .../Eyes/Hud/medsecengi.rsi/inhand-left.png | Bin 0 -> 509 bytes .../Eyes/Hud/medsecengi.rsi/inhand-right.png | Bin 0 -> 517 bytes .../Eyes/Hud/medsecengi.rsi/meta.json | 18 +- .../Hud/omni.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3294 bytes .../Eyes/Hud/omni.rsi/inhand-left.png | Bin 0 -> 584 bytes .../Eyes/Hud/omni.rsi/inhand-right.png | Bin 0 -> 594 bytes .../Clothing/Eyes/Hud/omni.rsi/meta.json | 14 +- .../onionbeer.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3256 bytes .../Hud/onionbeer.rsi/equipped-EYES-moth.png | Bin 0 -> 3192 bytes .../Clothing/Eyes/Hud/onionbeer.rsi/meta.json | 10 +- .../Hud/sec.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3108 bytes .../Eyes/Hud/sec.rsi/equipped-EYES-moth.png | Bin 0 -> 3107 bytes .../Clothing/Eyes/Hud/sec.rsi/meta.json | 10 +- .../Hud/secpatch.rsi/equipped-EYES-moth.png | Bin 0 -> 3075 bytes .../Clothing/Eyes/Hud/secpatch.rsi/meta.json | 6 +- .../Hud/synd.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3133 bytes .../Clothing/Eyes/Hud/synd.rsi/meta.json | 6 +- .../syndagent.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3126 bytes .../Clothing/Eyes/Hud/syndagent.rsi/meta.json | 6 +- .../blindfold.rsi/equipped-EYES-arachnid.png | Bin 0 -> 3138 bytes .../Misc/blindfold.rsi/equipped-EYES-moth.png | Bin 0 -> 3121 bytes .../Eyes/Misc/blindfold.rsi/meta.json | 10 +- .../Misc/eyepatch.rsi/equipped-EYES-moth.png | Bin 0 -> 3056 bytes .../Clothing/Eyes/Misc/eyepatch.rsi/meta.json | 6 +- .../Neck/Cloaks/aroace.rsi/equipped-NECK.png | Bin 0 -> 928 bytes .../Clothing/Neck/Cloaks/aroace.rsi/icon.png | Bin 0 -> 594 bytes .../Neck/Cloaks/aroace.rsi/inhand-left.png | Bin 0 -> 681 bytes .../Neck/Cloaks/aroace.rsi/inhand-right.png | Bin 0 -> 678 bytes .../Clothing/Neck/Cloaks/aroace.rsi/meta.json | 26 + .../Misc/pins.rsi/aroace-equipped-NECK.png | Bin 0 -> 423 bytes .../Clothing/Neck/Misc/pins.rsi/aroace.png | Bin 0 -> 518 bytes .../Clothing/Neck/Misc/pins.rsi/meta.json | 9 +- .../PrideScarfs/aroace.rsi/equipped-NECK.png | Bin 0 -> 634 bytes .../Scarfs/PrideScarfs/aroace.rsi/icon.png | Bin 0 -> 636 bytes .../PrideScarfs/aroace.rsi/inhand-left.png | Bin 0 -> 527 bytes .../PrideScarfs/aroace.rsi/inhand-right.png | Bin 0 -> 518 bytes .../Scarfs/PrideScarfs/aroace.rsi/meta.json | 26 + .../Markers/paradox_clone.rsi/meta.json | 14 + .../Markers/paradox_clone.rsi/preview.png | Bin 0 -> 1440 bytes .../Mobs/Customization/scars.rsi/meta.json | 22 +- .../scars.rsi/scar_chest_bullets.png | Bin 0 -> 508 bytes .../Customization/scars.rsi/scar_face_1.png | Bin 0 -> 560 bytes .../Customization/scars.rsi/scar_face_2.png | Bin 0 -> 499 bytes .../Customization/scars.rsi/scar_neck.png | Bin 0 -> 438 bytes .../scars.rsi/scar_stomach_bullets.png | Bin 0 -> 451 bytes .../undergarments.rsi/binder.png | Bin 0 -> 18549 bytes .../undergarments.rsi/binder_vox.png | Bin 0 -> 18528 bytes .../undergarments.rsi/boxers.png | Bin 0 -> 16324 bytes .../undergarments.rsi/boxers_reptilian.png | Bin 0 -> 16324 bytes .../undergarments.rsi/boxers_vox.png | Bin 0 -> 17029 bytes .../undergarments.rsi/briefs.png | Bin 0 -> 16302 bytes .../undergarments.rsi/briefs_reptilian.png | Bin 0 -> 16290 bytes .../undergarments.rsi/briefs_vox.png | Bin 0 -> 16927 bytes .../undergarments.rsi/classic.png | Bin 0 -> 16315 bytes .../undergarments.rsi/classic_vox.png | Bin 0 -> 16701 bytes .../Customization/undergarments.rsi/meta.json | 79 + .../Customization/undergarments.rsi/satin.png | Bin 0 -> 15723 bytes .../undergarments.rsi/satin_reptilian.png | Bin 0 -> 15700 bytes .../undergarments.rsi/satin_vox.png | Bin 0 -> 15717 bytes .../undergarments.rsi/sports.png | Bin 0 -> 16337 bytes .../undergarments.rsi/sports_vox.png | Bin 0 -> 16821 bytes .../undergarments.rsi/tanktop.png | Bin 0 -> 18589 bytes .../undergarments.rsi/tanktop_vox.png | Bin 0 -> 18818 bytes .../Devices/tablets.rsi/inhand-left.png | Bin 0 -> 882 bytes .../Devices/tablets.rsi/inhand-right.png | Bin 0 -> 887 bytes .../Objects/Devices/tablets.rsi/meta.json | 10 +- .../Textures/Objects/Misc/pens.rsi/meta.json | 5 +- .../Objects/Misc/pens.rsi/pen_wizard.png | Bin 0 -> 523 bytes .../felinid_limbs.rsi/furred_l_arm.png | Bin 0 -> 390 bytes .../felinid_limbs.rsi/furred_l_foot.png | Bin 0 -> 411 bytes .../felinid_limbs.rsi/furred_l_hand.png | Bin 0 -> 390 bytes .../felinid_limbs.rsi/furred_l_leg.png | Bin 0 -> 426 bytes .../felinid_limbs.rsi/furred_r_arm.png | Bin 0 -> 384 bytes .../felinid_limbs.rsi/furred_r_foot.png | Bin 0 -> 426 bytes .../felinid_limbs.rsi/furred_r_hand.png | Bin 0 -> 381 bytes .../felinid_limbs.rsi/furred_r_leg.png | Bin 0 -> 432 bytes .../Felinid/felinid_limbs.rsi/meta.json | 43 + RobustToolbox | 2 +- 540 files changed, 17903 insertions(+), 14800 deletions(-) create mode 100644 Content.Client/Advertise/Systems/SpeakOnUIClosedSystem.cs create mode 100644 Content.Client/Light/EntitySystems/SunShadowSystem.cs create mode 100644 Content.Client/Light/SunShadowOverlay.cs delete mode 100644 Content.IntegrationTests/Tests/_DV/MetempsychosisTest.cs create mode 100644 Content.Server/Administration/Commands/ForceGhostCommand.cs create mode 100644 Content.Server/Cloning/CloningPodSystem.cs create mode 100644 Content.Server/Cloning/Components/RandomCloneSpawnerComponent.cs create mode 100644 Content.Server/Cloning/RandomCloneSpawnerSystem.cs create mode 100644 Content.Server/Light/EntitySystems/SunShadowSystem.cs create mode 100644 Content.Server/NPC/Queries/Considerations/TargetTargetingCon.cs create mode 100644 Content.Server/Traits/Assorted/UnrevivableSystem.cs create mode 100644 Content.Server/VoiceTrigger/StorageVoiceControlComponent.cs create mode 100644 Content.Server/VoiceTrigger/StorageVoiceControlSystem.cs delete mode 100644 Content.Server/_DV/Cloning/CloningSystem.Metempsychosis.cs delete mode 100644 Content.Server/_DV/Cloning/MetempsychosisKarmaComponent.cs delete mode 100644 Content.Server/_DV/Cloning/MetempsychoticMachineComponent.cs rename {Content.Server => Content.Shared}/Advertise/Components/SpeakOnUIClosedComponent.cs (80%) create mode 100644 Content.Shared/Advertise/Systems/SharedSpeakOnUIClosedSystem.cs create mode 100644 Content.Shared/Cloning/CloningEvents.cs create mode 100644 Content.Shared/Cloning/CloningSettingsPrototype.cs create mode 100644 Content.Shared/FingerprintReader/FingerprintReaderComponent.cs create mode 100644 Content.Shared/FingerprintReader/FingerprintReaderSystem.cs create mode 100644 Content.Shared/Light/Components/SunShadowCastComponent.cs create mode 100644 Content.Shared/Light/Components/SunShadowComponent.cs create mode 100644 Content.Shared/Light/Components/SunShadowCycleComponent.cs rename Content.Shared/{ => Light/EntitySystems}/SharedLightCycleSystem.cs (90%) create mode 100644 Content.Shared/Light/EntitySystems/SharedSunShadowSystem.cs create mode 100644 Content.Shared/Turrets/TurretTargetSettingsComponent.cs create mode 100644 Content.Shared/Turrets/TurretTargetSettingsSystem.cs create mode 100644 Content.Shared/_DV/Physics/CollidingVisualsComponent.cs create mode 100644 Content.Shared/_DV/Physics/CollidingVisualsSystem.cs create mode 100644 Content.Shared/_DV/Whitelist/AiDetectableComponent.cs create mode 100644 Resources/Locale/en-US/_DV/datasets/names/chitinid.ftl create mode 100644 Resources/Locale/en-US/_DV/datasets/names/oni.ftl create mode 100644 Resources/Locale/en-US/_DV/datasets/names/rodentia.ftl create mode 100644 Resources/Locale/en-US/_DV/datasets/names/vulpkanin.ftl create mode 100644 Resources/Locale/en-US/_DV/guidebook/chemistry/conditions.ftl delete mode 100644 Resources/Locale/en-US/_DV/preferences/ui/markings-picker.ftl create mode 100644 Resources/Locale/en-US/_DV/prototypes/entities/objects/misc/pet_carrier.ftl create mode 100644 Resources/Locale/en-US/_DV/store/uplink/deception.ftl create mode 100644 Resources/Locale/en-US/_EE/datasets/ipc-names.ftl create mode 100644 Resources/Locale/en-US/_Impstation/datasets/names/thaven.ftl create mode 100644 Resources/Locale/en-US/administration/commands/forceghost.ftl create mode 100644 Resources/Locale/en-US/components/storage-voice-control-component.ftl create mode 100644 Resources/Locale/en-US/datasets/names/arachnid_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/arachnid_last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/atv.ftl create mode 100644 Resources/Locale/en-US/datasets/names/autoborg.ftl create mode 100644 Resources/Locale/en-US/datasets/names/borg.ftl create mode 100644 Resources/Locale/en-US/datasets/names/cargo_shuttle.ftl create mode 100644 Resources/Locale/en-US/datasets/names/clown.ftl create mode 100644 Resources/Locale/en-US/datasets/names/cookie_fortune.ftl create mode 100644 Resources/Locale/en-US/datasets/names/death_commando.ftl create mode 100644 Resources/Locale/en-US/datasets/names/diona_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/diona_last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/fake_human_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/fake_human_last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/first_female.ftl create mode 100644 Resources/Locale/en-US/datasets/names/first_male.ftl create mode 100644 Resources/Locale/en-US/datasets/names/golem.ftl create mode 100644 Resources/Locale/en-US/datasets/names/hologram.ftl create mode 100644 Resources/Locale/en-US/datasets/names/last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/military_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/military_first_leader.ftl create mode 100644 Resources/Locale/en-US/datasets/names/military_last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/moth_first_female.ftl create mode 100644 Resources/Locale/en-US/datasets/names/moth_first_male.ftl create mode 100644 Resources/Locale/en-US/datasets/names/moth_last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/mushman_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/mushman_last.ftl create mode 100644 Resources/Locale/en-US/datasets/names/ninja.ftl create mode 100644 Resources/Locale/en-US/datasets/names/ninja_title.ftl create mode 100644 Resources/Locale/en-US/datasets/names/operation_prefix.ftl create mode 100644 Resources/Locale/en-US/datasets/names/operation_suffix.ftl create mode 100644 Resources/Locale/en-US/datasets/names/regalrat_kingdom.ftl create mode 100644 Resources/Locale/en-US/datasets/names/regalrat_title.ftl create mode 100644 Resources/Locale/en-US/datasets/names/reptilian_female.ftl create mode 100644 Resources/Locale/en-US/datasets/names/reptilian_male.ftl create mode 100644 Resources/Locale/en-US/datasets/names/revenant_adjective.ftl create mode 100644 Resources/Locale/en-US/datasets/names/revenant_theme.ftl create mode 100644 Resources/Locale/en-US/datasets/names/revenant_type.ftl create mode 100644 Resources/Locale/en-US/datasets/names/rollie.ftl create mode 100644 Resources/Locale/en-US/datasets/names/skeleton_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/syndicate_elite.ftl create mode 100644 Resources/Locale/en-US/datasets/names/syndicate_normal.ftl create mode 100644 Resources/Locale/en-US/datasets/names/syndicate_prefix.ftl create mode 100644 Resources/Locale/en-US/datasets/names/vox.ftl create mode 100644 Resources/Locale/en-US/datasets/names/wizard_first.ftl create mode 100644 Resources/Locale/en-US/datasets/names/wizard_last.ftl create mode 100644 Resources/Locale/en-US/fingerprint-reader/fingerprint-reader.ftl create mode 100644 Resources/Locale/en-US/markings/undergarment.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/species/namepreset.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/species/species.ftl create mode 100644 Resources/Prototypes/Access/silicon.yml delete mode 100644 Resources/Prototypes/Datasets/Names/Operation_prefix.yml delete mode 100644 Resources/Prototypes/Datasets/Names/Operation_suffix.yml create mode 100644 Resources/Prototypes/Datasets/Names/arachnid.yml delete mode 100644 Resources/Prototypes/Datasets/Names/arachnid_first.yml delete mode 100644 Resources/Prototypes/Datasets/Names/arachnid_last.yml create mode 100644 Resources/Prototypes/Datasets/Names/base.yml create mode 100644 Resources/Prototypes/Datasets/Names/base_gendered.yml create mode 100644 Resources/Prototypes/Datasets/Names/fake_human.yml delete mode 100644 Resources/Prototypes/Datasets/Names/fake_human_first.yml delete mode 100644 Resources/Prototypes/Datasets/Names/fake_human_last.yml delete mode 100644 Resources/Prototypes/Datasets/Names/first.yml delete mode 100644 Resources/Prototypes/Datasets/Names/first_female.yml delete mode 100644 Resources/Prototypes/Datasets/Names/first_male.yml delete mode 100644 Resources/Prototypes/Datasets/Names/last.yml create mode 100644 Resources/Prototypes/Datasets/Names/moth.yml delete mode 100644 Resources/Prototypes/Datasets/Names/moth_first_female.yml delete mode 100644 Resources/Prototypes/Datasets/Names/moth_first_male.yml delete mode 100644 Resources/Prototypes/Datasets/Names/moth_last.yml delete mode 100644 Resources/Prototypes/Datasets/Names/ninja_title.yml create mode 100644 Resources/Prototypes/Datasets/Names/operation.yml create mode 100644 Resources/Prototypes/Datasets/Names/wizard.yml delete mode 100644 Resources/Prototypes/Datasets/Names/wizard_first.yml delete mode 100644 Resources/Prototypes/Datasets/Names/wizard_last.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/Markings/undergarments.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Player/clone.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_female.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_location.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_male.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/metempsychoticHumanoids.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/metempsychoticNonHumanoids.yml create mode 100644 Resources/Prototypes/_DV/Catalog/Uplink/deception.yml create mode 100644 Resources/Prototypes/_DV/Datasets/Names/oni_female.yml create mode 100644 Resources/Prototypes/_DV/Datasets/Names/oni_location.yml create mode 100644 Resources/Prototypes/_DV/Datasets/Names/oni_male.yml create mode 100644 Resources/Prototypes/_DV/Entities/Objects/Tools/ai_detector.yml create mode 100644 Resources/Prototypes/_DV/Research/experimental.yml rename Resources/Prototypes/{Nyanotrasen => _DV}/Species/Oni.yml (89%) rename Resources/Prototypes/{Nyanotrasen => _DV}/Species/felinid.yml (83%) create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/commandglasses.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/commandglasses.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/gar.rsi/alt-equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/gar.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/gar.rsi/super-equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/glasses.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/glasses.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/jamjar.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/jamjar.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/jensen.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/jensen.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/mercglasses.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/mercglasses.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/meson.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/meson.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/ninjavisor.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/outlawglasses.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/outlawglasses.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/science.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/science.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/secglasses.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/secglasses.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/sunglasses.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/sunglasses.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/thermal.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Glasses/thermal.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/beergoggles.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/beergoggles.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/beergoggles.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/beergoggles.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/beerpatch.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/command.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/command.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/diag.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/diag.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/diagpatch.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/friedonion.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/friedonion.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/med.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/med.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medonion.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medonion.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medonionbeer.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medonionbeer.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medonionbeer.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medpatch.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsec.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsec.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsec.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsec.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsecengi.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsecengi.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsecengi.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/medsecengi.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/omni.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/omni.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/omni.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/onionbeer.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/onionbeer.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/sec.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/sec.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/secpatch.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/synd.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Hud/syndagent.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Misc/blindfold.rsi/equipped-EYES-arachnid.png create mode 100644 Resources/Textures/Clothing/Eyes/Misc/blindfold.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Eyes/Misc/eyepatch.rsi/equipped-EYES-moth.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/aroace.rsi/equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/aroace.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/aroace.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/aroace.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Neck/Cloaks/aroace.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Neck/Misc/pins.rsi/aroace-equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Misc/pins.rsi/aroace.png create mode 100644 Resources/Textures/Clothing/Neck/Scarfs/PrideScarfs/aroace.rsi/equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Scarfs/PrideScarfs/aroace.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Neck/Scarfs/PrideScarfs/aroace.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Neck/Scarfs/PrideScarfs/aroace.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Neck/Scarfs/PrideScarfs/aroace.rsi/meta.json create mode 100644 Resources/Textures/Markers/paradox_clone.rsi/meta.json create mode 100644 Resources/Textures/Markers/paradox_clone.rsi/preview.png create mode 100644 Resources/Textures/Mobs/Customization/scars.rsi/scar_chest_bullets.png create mode 100644 Resources/Textures/Mobs/Customization/scars.rsi/scar_face_1.png create mode 100644 Resources/Textures/Mobs/Customization/scars.rsi/scar_face_2.png create mode 100644 Resources/Textures/Mobs/Customization/scars.rsi/scar_neck.png create mode 100644 Resources/Textures/Mobs/Customization/scars.rsi/scar_stomach_bullets.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/binder.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/binder_vox.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/boxers.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_reptilian.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/boxers_vox.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/briefs.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_reptilian.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/briefs_vox.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/classic.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/classic_vox.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/satin.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/satin_reptilian.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/satin_vox.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/sports.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/sports_vox.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop.png create mode 100644 Resources/Textures/Mobs/Customization/undergarments.rsi/tanktop_vox.png create mode 100644 Resources/Textures/Objects/Devices/tablets.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/tablets.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/pens.rsi/pen_wizard.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_l_arm.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_l_foot.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_l_hand.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_l_leg.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_r_arm.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_r_foot.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_r_hand.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/furred_r_leg.png create mode 100644 Resources/Textures/_DV/Mobs/Customization/Felinid/felinid_limbs.rsi/meta.json diff --git a/Content.Benchmarks/DynamicTreeBenchmark.cs b/Content.Benchmarks/DynamicTreeBenchmark.cs index 4f3dad4073..9086b4d3ac 100644 --- a/Content.Benchmarks/DynamicTreeBenchmark.cs +++ b/Content.Benchmarks/DynamicTreeBenchmark.cs @@ -44,7 +44,7 @@ namespace Content.Benchmarks for (var i = 0; i < Aabbs1.Length; i++) { var aabb = Aabbs1[i]; - _b2Tree.CreateProxy(aabb, i); + _b2Tree.CreateProxy(aabb, uint.MaxValue, i); _tree.Add(i); } } diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs index 3e05018c10..973f1a090b 100644 --- a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs +++ b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs @@ -36,6 +36,9 @@ namespace Content.Client.Administration.UI.Bwoink RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + var newPlayerThreshold = 0; + _cfg.OnValueChanged(CCVars.NewPlayerThreshold, (val) => { newPlayerThreshold = val; }, true); + var uiController = _ui.GetUIController(); if (uiController.UIHelper is not AdminAHelpUIHandler helper) return; @@ -59,9 +62,9 @@ namespace Content.Client.Administration.UI.Bwoink var sb = new StringBuilder(); if (info.Connected) - sb.Append('●'); + sb.Append(info.ActiveThisRound ? '⚫' : '◐'); else - sb.Append(info.ActiveThisRound ? '○' : '·'); + sb.Append(info.ActiveThisRound ? '⭘' : '·'); sb.Append(' '); if (AHelpHelper.TryGetChannel(info.SessionId, out var panel) && panel.Unread > 0) @@ -73,10 +76,12 @@ namespace Content.Client.Administration.UI.Bwoink sb.Append(' '); } + // Mark antagonists with symbol if (info.Antag && info.ActiveThisRound) sb.Append(new Rune(0x1F5E1)); // 🗡 - if (info.OverallPlaytime <= TimeSpan.FromMinutes(_cfg.GetCVar(CCVars.NewPlayerThreshold))) + // Mark new players with symbol + if (IsNewPlayer(info)) sb.Append(new Rune(0x23F2)); // ⏲ sb.AppendFormat("\"{0}\"", text); @@ -84,6 +89,19 @@ namespace Content.Client.Administration.UI.Bwoink return sb.ToString(); }; + // + // Returns true if the player's overall playtime is under the set threshold + // + bool IsNewPlayer(PlayerInfo info) + { + // Don't show every disconnected player as new, don't show 0-minute players as new if threshold is + if (newPlayerThreshold <= 0 || info.OverallPlaytime is null && !info.Connected) + return false; + + return (info.OverallPlaytime is null + || info.OverallPlaytime < TimeSpan.FromMinutes(newPlayerThreshold)); + } + ChannelSelector.Comparison = (a, b) => { var ach = AHelpHelper.EnsurePanel(a.SessionId); @@ -93,31 +111,37 @@ namespace Content.Client.Administration.UI.Bwoink if (a.IsPinned != b.IsPinned) return a.IsPinned ? -1 : 1; - // First, sort by unread. Any chat with unread messages appears first. + // Then, any chat with unread messages. var aUnread = ach.Unread > 0; var bUnread = bch.Unread > 0; if (aUnread != bUnread) return aUnread ? -1 : 1; - // Sort by recent messages during the current round. + // Then, any chat with recent messages from the current round var aRecent = a.ActiveThisRound && ach.LastMessage != DateTime.MinValue; var bRecent = b.ActiveThisRound && bch.LastMessage != DateTime.MinValue; if (aRecent != bRecent) return aRecent ? -1 : 1; - // Next, sort by connection status. Any disconnected players are grouped towards the end. + // Sort by connection status. Disconnected players will be last. if (a.Connected != b.Connected) return a.Connected ? -1 : 1; - // Sort connected players by New Player status, then by Antag status + // Sort connected players by whether they have joined the round, then by New Player status, then by Antag status if (a.Connected && b.Connected) { - var aNewPlayer = a.OverallPlaytime <= TimeSpan.FromMinutes(_cfg.GetCVar(CCVars.NewPlayerThreshold)); - var bNewPlayer = b.OverallPlaytime <= TimeSpan.FromMinutes(_cfg.GetCVar(CCVars.NewPlayerThreshold)); + var aNewPlayer = IsNewPlayer(a); + var bNewPlayer = IsNewPlayer(b); + // Players who have joined the round will be listed before players in the lobby + if (a.ActiveThisRound != b.ActiveThisRound) + return a.ActiveThisRound ? -1 : 1; + + // Within both the joined group and lobby group, new players will be grouped and listed first if (aNewPlayer != bNewPlayer) return aNewPlayer ? -1 : 1; + // Within all four previous groups, antagonists will be listed first. if (a.Antag != b.Antag) return a.Antag ? -1 : 1; } diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs b/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs index e8653843c7..e6cd4942a6 100644 --- a/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs +++ b/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs @@ -22,12 +22,9 @@ namespace Content.Client.Administration.UI.Bwoink return; } - Title = $"{sel.CharacterName} / {sel.Username}"; + Title = $"{sel.CharacterName} / {sel.Username} | {Loc.GetString("generic-playtime-title")}: "; - if (sel.OverallPlaytime != null) - { - Title += $" | {Loc.GetString("generic-playtime-title")}: {sel.PlaytimeString}"; - } + Title += sel.OverallPlaytime != null ? sel.PlaytimeString : Loc.GetString("generic-unknown-title"); }; OnOpen += () => diff --git a/Content.Client/Advertise/Systems/SpeakOnUIClosedSystem.cs b/Content.Client/Advertise/Systems/SpeakOnUIClosedSystem.cs new file mode 100644 index 0000000000..4e82ec4d00 --- /dev/null +++ b/Content.Client/Advertise/Systems/SpeakOnUIClosedSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Advertise.Systems; + +namespace Content.Client.Advertise.Systems; + +public sealed class SpeakOnUIClosedSystem : SharedSpeakOnUIClosedSystem; diff --git a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs index 010bfb3184..0ba537e455 100644 --- a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs +++ b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs @@ -28,7 +28,6 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem - - - - - - - - - + + + + + + + + + + + + diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index d735e264ce..1bffc1e5b2 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -1,8 +1,10 @@ +using Content.Shared.CCVar; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; using Robust.Client.GameObjects; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Utility; using System.Numerics; // CD - Character Records @@ -14,12 +16,15 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnHandleState); + Subs.CVar(_configurationManager, CCVars.AccessibilityClientCensorNudity, OnCvarChanged, true); + Subs.CVar(_configurationManager, CCVars.AccessibilityServerCensorNudity, OnCvarChanged, true); } private void OnHandleState(EntityUid uid, HumanoidAppearanceComponent component, ref AfterAutoHandleStateEvent args) @@ -27,6 +32,15 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem UpdateSprite(component, Comp(uid)); } + private void OnCvarChanged(bool value) + { + var humanoidQuery = EntityManager.AllEntityQueryEnumerator(); + while (humanoidQuery.MoveNext(out var _, out var humanoidComp, out var spriteComp)) + { + UpdateSprite(humanoidComp, spriteComp); + } + } + private void UpdateSprite(HumanoidAppearanceComponent component, SpriteComponent sprite) { UpdateLayers(component, sprite); @@ -219,16 +233,30 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem // Really, markings should probably be a separate component altogether. ClearAllMarkings(humanoid, sprite); + var censorNudity = _configurationManager.GetCVar(CCVars.AccessibilityClientCensorNudity) || + _configurationManager.GetCVar(CCVars.AccessibilityServerCensorNudity); + // The reason we're splitting this up is in case the character already has undergarment equipped in that slot. + var applyUndergarmentTop = censorNudity; + var applyUndergarmentBottom = censorNudity; + foreach (var markingList in humanoid.MarkingSet.Markings.Values) { foreach (var marking in markingList) { if (_markingManager.TryGetMarking(marking, out var markingPrototype)) + { ApplyMarking(markingPrototype, marking.MarkingColors, marking.Visible, humanoid, sprite); + if (markingPrototype.BodyPart == HumanoidVisualLayers.UndergarmentTop) + applyUndergarmentTop = false; + else if (markingPrototype.BodyPart == HumanoidVisualLayers.UndergarmentBottom) + applyUndergarmentBottom = false; + } } } humanoid.ClientOldMarkings = new MarkingSet(humanoid.MarkingSet); + + AddUndergarments(humanoid, sprite, applyUndergarmentTop, applyUndergarmentBottom); } private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteComponent sprite) @@ -276,6 +304,31 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem spriteComp.RemoveLayer(index); } } + + private void AddUndergarments(HumanoidAppearanceComponent humanoid, SpriteComponent sprite, bool undergarmentTop, bool undergarmentBottom) + { + if (undergarmentTop && humanoid.UndergarmentTop != null) + { + var marking = new Marking(humanoid.UndergarmentTop, new List { new Color() }); + if (_markingManager.TryGetMarking(marking, out var prototype)) + { + // Markings are added to ClientOldMarkings because otherwise it causes issues when toggling the feature on/off. + humanoid.ClientOldMarkings.Markings.Add(MarkingCategories.UndergarmentTop, new List{ marking }); + ApplyMarking(prototype, null, true, humanoid, sprite); + } + } + + if (undergarmentBottom && humanoid.UndergarmentBottom != null) + { + var marking = new Marking(humanoid.UndergarmentBottom, new List { new Color() }); + if (_markingManager.TryGetMarking(marking, out var prototype)) + { + humanoid.ClientOldMarkings.Markings.Add(MarkingCategories.UndergarmentBottom, new List{ marking }); + ApplyMarking(prototype, null, true, humanoid, sprite); + } + } + } + private void ApplyMarking(MarkingPrototype markingPrototype, IReadOnlyList? colors, bool visible, diff --git a/Content.Client/Lathe/UI/LatheMenu.xaml b/Content.Client/Lathe/UI/LatheMenu.xaml index d84449ce43..f541c8ebd2 100644 --- a/Content.Client/Lathe/UI/LatheMenu.xaml +++ b/Content.Client/Lathe/UI/LatheMenu.xaml @@ -59,6 +59,7 @@ PlaceHolder="0" Text="1" HorizontalExpand="True" /> +