From bdf87d104e4b3d9555c6df80bd5fb3736dd36750 Mon Sep 17 00:00:00 2001 From: SplikZerys <136282037+SplikZerys@users.noreply.github.com> Date: Fri, 28 Feb 2025 13:28:18 +0300 Subject: [PATCH] BODYTYPES (#1493) Co-authored-by: lunarica --- .../Clothing/ClientClothingSystem.cs | 58 +- .../Humanoid/HumanoidAppearanceSystem.cs | 8 +- .../Lobby/UI/HumanoidProfileEditor.xaml | 7 + .../Lobby/UI/HumanoidProfileEditor.xaml.cs | 50 + .../Tests/Preferences/ServerDbSqliteTests.cs | 1 + .../20250211154217_BodyType.Designer.cs | 2122 +++++++++++++++++ .../Postgres/20250211154217_BodyType.cs | 29 + .../PostgresServerDbContextModelSnapshot.cs | 7 +- .../20250211154155_BodyType.Designer.cs | 2046 ++++++++++++++++ .../Sqlite/20250211154155_BodyType.cs | 29 + .../SqliteServerDbContextModelSnapshot.cs | 7 +- Content.Server.Database/Model.cs | 3 + Content.Server/Database/ServerDbBase.cs | 2 + .../HumanoidAppearanceSystem.Modifier.cs | 3 + .../FleshCult/FleshCultSystem.Abilities.cs | 5 +- .../FleshCult/FleshCultSystem.Heart.cs | 5 +- .../Medical/Surgery/SurgerySystem.Steps.cs | 5 +- .../Humanoid/HumanoidAppearanceComponent.cs | 4 + .../Humanoid/Markings/MarkingManager.cs | 8 +- .../Prototypes/HumanoidSpritePrototypes.cs | 4 +- .../Humanoid/Prototypes/SpeciesPrototype.cs | 3 + .../SharedHumanoidAppearanceSystem.cs | 26 + .../SharedHumanoidMarkingModifierSystem.cs | 3 + .../Preferences/HumanoidCharacterProfile.cs | 19 + Content.Shared/_Sunrise/BodyType.cs | 20 + Resources/Locale/ru-RU/_strings/bodytypes.ftl | 3 + .../Entities/Mobs/Species/dwarf.yml | 80 + .../Entities/Mobs/Species/human.yml | 80 + Resources/Prototypes/Species/arachnid.yml | 116 +- Resources/Prototypes/Species/diona.yml | 8 +- Resources/Prototypes/Species/dwarf.yml | 4 +- Resources/Prototypes/Species/gingerbread.yml | 8 +- Resources/Prototypes/Species/human.yml | 103 +- Resources/Prototypes/Species/moth.yml | 113 +- Resources/Prototypes/Species/reptilian.yml | 103 +- Resources/Prototypes/Species/skeleton.yml | 8 +- Resources/Prototypes/Species/slime.yml | 115 +- Resources/Prototypes/Species/terminator.yml | 8 +- Resources/Prototypes/Species/vox.yml | 8 +- .../Entities/Mobs/Species/felinid.yml | 40 + .../Prototypes/_Sunrise/Species/demon.yml | 105 +- .../Prototypes/_Sunrise/Species/felinid.yml | 4 +- .../_Sunrise/Species/humanoid_xeno.yml | 8 +- .../Prototypes/_Sunrise/Species/predator.yml | 8 +- .../Prototypes/_Sunrise/Species/swine.yml | 8 +- .../Prototypes/_Sunrise/Species/tajaran.yml | 106 +- .../Prototypes/_Sunrise/Species/vulpkanin.yml | 105 +- .../Mobs/Species/Human/parts.rsi/full.png | Bin 2700 -> 486 bytes .../Mobs/Species/Human/parts.rsi/head.png | Bin 0 -> 606 bytes .../Mobs/Species/Human/parts.rsi/head_f.png | Bin 616 -> 442 bytes .../Mobs/Species/Human/parts.rsi/head_m.png | Bin 606 -> 435 bytes .../Species/Human/parts.rsi/head_slim.png | Bin 0 -> 1751 bytes .../Species/Human/parts.rsi/head_slim_f.png | Bin 0 -> 1456 bytes .../Mobs/Species/Human/parts.rsi/l_arm.png | Bin 373 -> 266 bytes .../Species/Human/parts.rsi/l_arm_slim.png | Bin 0 -> 502 bytes .../Mobs/Species/Human/parts.rsi/l_foot.png | Bin 438 -> 398 bytes .../Species/Human/parts.rsi/l_foot_slim.png | Bin 0 -> 1217 bytes .../Mobs/Species/Human/parts.rsi/l_hand.png | Bin 322 -> 257 bytes .../Species/Human/parts.rsi/l_hand_slim.png | Bin 0 -> 1173 bytes .../Mobs/Species/Human/parts.rsi/l_leg.png | Bin 517 -> 6361 bytes .../Species/Human/parts.rsi/l_leg_slim.png | Bin 0 -> 1389 bytes .../Mobs/Species/Human/parts.rsi/meta.json | 175 +- .../Mobs/Species/Human/parts.rsi/r_arm.png | Bin 383 -> 276 bytes .../Species/Human/parts.rsi/r_arm_slim.png | Bin 0 -> 1276 bytes .../Mobs/Species/Human/parts.rsi/r_foot.png | Bin 443 -> 398 bytes .../Species/Human/parts.rsi/r_foot_slim.png | Bin 0 -> 1226 bytes .../Mobs/Species/Human/parts.rsi/r_hand.png | Bin 331 -> 261 bytes .../Species/Human/parts.rsi/r_hand_slim.png | Bin 0 -> 1167 bytes .../Mobs/Species/Human/parts.rsi/r_leg.png | Bin 486 -> 6343 bytes .../Species/Human/parts.rsi/r_leg_slim.png | Bin 0 -> 1391 bytes .../Mobs/Species/Human/parts.rsi/torso.png | Bin 0 -> 3239 bytes .../Mobs/Species/Human/parts.rsi/torso_f.png | Bin 4292 -> 785 bytes .../Mobs/Species/Human/parts.rsi/torso_m.png | Bin 3239 -> 682 bytes .../Species/Human/parts.rsi/torso_slim.png | Bin 0 -> 2030 bytes .../Species/Human/parts.rsi/torso_slim_f.png | Bin 0 -> 1987 bytes .../Mobs/Species/Slim/arachnid.rsi/eyes.png | Bin 0 -> 151 bytes .../Species/Slim/arachnid.rsi/head_slim.png | Bin 0 -> 413 bytes .../Species/Slim/arachnid.rsi/head_slim_f.png | Bin 0 -> 413 bytes .../Species/Slim/arachnid.rsi/l_arm_slim.png | Bin 0 -> 445 bytes .../Species/Slim/arachnid.rsi/l_foot_slim.png | Bin 0 -> 401 bytes .../Species/Slim/arachnid.rsi/l_hand_slim.png | Bin 0 -> 363 bytes .../Species/Slim/arachnid.rsi/l_leg_slim.png | Bin 0 -> 563 bytes .../Mobs/Species/Slim/arachnid.rsi/meta.json | 63 + .../Species/Slim/arachnid.rsi/r_arm_slim.png | Bin 0 -> 504 bytes .../Species/Slim/arachnid.rsi/r_foot_slim.png | Bin 0 -> 397 bytes .../Species/Slim/arachnid.rsi/r_hand_slim.png | Bin 0 -> 364 bytes .../Species/Slim/arachnid.rsi/r_leg_slim.png | Bin 0 -> 552 bytes .../Species/Slim/arachnid.rsi/torso_slim.png | Bin 0 -> 1173 bytes .../Slim/arachnid.rsi/torso_slim_f.png | Bin 0 -> 884 bytes .../Mobs/Species/Slim/demon.rsi/head_slim.png | Bin 0 -> 867 bytes .../Species/Slim/demon.rsi/head_slim_f.png | Bin 0 -> 648 bytes .../Species/Slim/demon.rsi/l_arm_slim.png | Bin 0 -> 547 bytes .../Species/Slim/demon.rsi/l_foot_slim.png | Bin 0 -> 398 bytes .../Species/Slim/demon.rsi/l_hand_slim.png | Bin 0 -> 347 bytes .../Species/Slim/demon.rsi/l_leg_slim.png | Bin 0 -> 624 bytes .../Mobs/Species/Slim/demon.rsi/meta.json | 59 + .../Species/Slim/demon.rsi/r_arm_slim.png | Bin 0 -> 511 bytes .../Species/Slim/demon.rsi/r_foot_slim.png | Bin 0 -> 405 bytes .../Species/Slim/demon.rsi/r_hand_slim.png | Bin 0 -> 390 bytes .../Species/Slim/demon.rsi/r_leg_slim.png | Bin 0 -> 580 bytes .../Species/Slim/demon.rsi/torso_slim.png | Bin 0 -> 1360 bytes .../Species/Slim/demon.rsi/torso_slim_f.png | Bin 0 -> 1211 bytes .../Species/Slim/lizard.rsi/head_slim.png | Bin 0 -> 695 bytes .../Species/Slim/lizard.rsi/head_slim_f.png | Bin 0 -> 456 bytes .../Species/Slim/lizard.rsi/l_arm_slim.png | Bin 0 -> 485 bytes .../Species/Slim/lizard.rsi/l_foot_slim.png | Bin 0 -> 455 bytes .../Species/Slim/lizard.rsi/l_hand_slim.png | Bin 0 -> 212 bytes .../Species/Slim/lizard.rsi/l_leg_slim.png | Bin 0 -> 595 bytes .../Mobs/Species/Slim/lizard.rsi/meta.json | 59 + .../Species/Slim/lizard.rsi/r_arm_slim.png | Bin 0 -> 498 bytes .../Species/Slim/lizard.rsi/r_foot_slim.png | Bin 0 -> 462 bytes .../Species/Slim/lizard.rsi/r_hand_slim.png | Bin 0 -> 359 bytes .../Species/Slim/lizard.rsi/r_leg_slim.png | Bin 0 -> 584 bytes .../Species/Slim/lizard.rsi/torso_slim.png | Bin 0 -> 1200 bytes .../Species/Slim/lizard.rsi/torso_slim_f.png | Bin 0 -> 890 bytes .../Mobs/Species/Slim/moth.rsi/eyes.png | Bin 0 -> 151 bytes .../Mobs/Species/Slim/moth.rsi/head_slim.png | Bin 0 -> 415 bytes .../Species/Slim/moth.rsi/head_slim_f.png | Bin 0 -> 550 bytes .../Mobs/Species/Slim/moth.rsi/l_arm_slim.png | Bin 0 -> 491 bytes .../Species/Slim/moth.rsi/l_foot_slim.png | Bin 0 -> 419 bytes .../Species/Slim/moth.rsi/l_hand_slim.png | Bin 0 -> 367 bytes .../Mobs/Species/Slim/moth.rsi/l_leg_slim.png | Bin 0 -> 559 bytes .../Mobs/Species/Slim/moth.rsi/meta.json | 63 + .../Mobs/Species/Slim/moth.rsi/r_arm_slim.png | Bin 0 -> 464 bytes .../Species/Slim/moth.rsi/r_foot_slim.png | Bin 0 -> 418 bytes .../Species/Slim/moth.rsi/r_hand_slim.png | Bin 0 -> 352 bytes .../Mobs/Species/Slim/moth.rsi/r_leg_slim.png | Bin 0 -> 555 bytes .../Mobs/Species/Slim/moth.rsi/torso_slim.png | Bin 0 -> 1332 bytes .../Species/Slim/moth.rsi/torso_slim_f.png | Bin 0 -> 1071 bytes .../Mobs/Species/Slim/slime.rsi/head_slim.png | Bin 0 -> 301 bytes .../Species/Slim/slime.rsi/head_slim_f.png | Bin 0 -> 301 bytes .../Species/Slim/slime.rsi/l_arm_slim.png | Bin 0 -> 260 bytes .../Species/Slim/slime.rsi/l_foot_slim.png | Bin 0 -> 201 bytes .../Species/Slim/slime.rsi/l_hand_slim.png | Bin 0 -> 190 bytes .../Species/Slim/slime.rsi/l_leg_slim.png | Bin 0 -> 243 bytes .../Mobs/Species/Slim/slime.rsi/meta.json | 59 + .../Species/Slim/slime.rsi/r_arm_slim.png | Bin 0 -> 272 bytes .../Species/Slim/slime.rsi/r_foot_slim.png | Bin 0 -> 201 bytes .../Mobs/Species/Slim/slime.rsi/r_hand.png | Bin 0 -> 261 bytes .../Species/Slim/slime.rsi/r_hand_slim.png | Bin 0 -> 178 bytes .../Species/Slim/slime.rsi/r_leg_slim.png | Bin 0 -> 246 bytes .../Mobs/Species/Slim/slime.rsi/slime.png | Bin 0 -> 1002 bytes .../Species/Slim/slime.rsi/torso_slim.png | Bin 0 -> 454 bytes .../Species/Slim/slime.rsi/torso_slim_f.png | Bin 0 -> 551 bytes .../Species/Slim/tajaran.rsi/head_slim.png | Bin 0 -> 727 bytes .../Species/Slim/tajaran.rsi/head_slim_f.png | Bin 0 -> 763 bytes .../Species/Slim/tajaran.rsi/l_arm_slim.png | Bin 0 -> 505 bytes .../Species/Slim/tajaran.rsi/l_foot_slim.png | Bin 0 -> 308 bytes .../Species/Slim/tajaran.rsi/l_hand_slim.png | Bin 0 -> 368 bytes .../Species/Slim/tajaran.rsi/l_leg_slim.png | Bin 0 -> 527 bytes .../Mobs/Species/Slim/tajaran.rsi/meta.json | 59 + .../Species/Slim/tajaran.rsi/r_arm_slim.png | Bin 0 -> 514 bytes .../Species/Slim/tajaran.rsi/r_foot_slim.png | Bin 0 -> 359 bytes .../Species/Slim/tajaran.rsi/r_hand_slim.png | Bin 0 -> 363 bytes .../Species/Slim/tajaran.rsi/r_leg_slim.png | Bin 0 -> 505 bytes .../Species/Slim/tajaran.rsi/torso_slim.png | Bin 0 -> 1089 bytes .../Species/Slim/tajaran.rsi/torso_slim_f.png | Bin 0 -> 1060 bytes .../Mobs/Species/Slim/vulpa.rsi/head_slim.png | Bin 0 -> 589 bytes .../Species/Slim/vulpa.rsi/head_slim_f.png | Bin 0 -> 755 bytes .../Species/Slim/vulpa.rsi/l_arm_slim.png | Bin 0 -> 505 bytes .../Species/Slim/vulpa.rsi/l_foot_slim.png | Bin 0 -> 308 bytes .../Species/Slim/vulpa.rsi/l_hand_slim.png | Bin 0 -> 368 bytes .../Species/Slim/vulpa.rsi/l_leg_slim.png | Bin 0 -> 527 bytes .../Mobs/Species/Slim/vulpa.rsi/meta.json | 59 + .../Species/Slim/vulpa.rsi/r_arm_slim.png | Bin 0 -> 514 bytes .../Species/Slim/vulpa.rsi/r_foot_slim.png | Bin 0 -> 359 bytes .../Species/Slim/vulpa.rsi/r_hand_slim.png | Bin 0 -> 363 bytes .../Species/Slim/vulpa.rsi/r_leg_slim.png | Bin 0 -> 505 bytes .../Species/Slim/vulpa.rsi/torso_slim.png | Bin 0 -> 1089 bytes .../Species/Slim/vulpa.rsi/torso_slim_f.png | Bin 0 -> 1060 bytes .../Woman/pants.rsi/female_christmas.png | Bin 653 -> 298 bytes .../fishnet.rsi/fishnet_full-body-slim.png | Bin 0 -> 505 bytes .../Clothing/Socks/fishnet.rsi/meta.json | 4 + .../Clothing/Socks/pantyhose.rsi/meta.json | 4 + .../pantyhose.rsi/pantyhose-body-slim.png | Bin 0 -> 373 bytes .../thigh.rsi/fishnet_thigh-body-slim.png | Bin 0 -> 375 bytes .../Clothing/Socks/thigh.rsi/meta.json | 8 + .../Socks/thigh.rsi/thin_thigh-body-slim.png | Bin 0 -> 313 bytes .../Species/Human/displacement.rsi/bra.png | Bin 0 -> 363 bytes .../Species/Human/displacement.rsi/gloves.png | Bin 0 -> 311 bytes .../Human/displacement.rsi/hardsuit.png | Bin 0 -> 444 bytes .../Human/displacement.rsi/jumpsuit.png | Bin 0 -> 653 bytes .../Species/Human/displacement.rsi/meta.json | 44 + .../Species/Human/displacement.rsi/outer.png | Bin 0 -> 602 bytes .../Human/displacement.rsi/panties.png | Bin 0 -> 440 bytes .../Species/Human/displacement.rsi/shoes.png | Bin 0 -> 310 bytes .../Species/Human/displacement.rsi/socks.png | Bin 0 -> 452 bytes 187 files changed, 6119 insertions(+), 152 deletions(-) create mode 100644 Content.Server.Database/Migrations/Postgres/20250211154217_BodyType.Designer.cs create mode 100644 Content.Server.Database/Migrations/Postgres/20250211154217_BodyType.cs create mode 100644 Content.Server.Database/Migrations/Sqlite/20250211154155_BodyType.Designer.cs create mode 100644 Content.Server.Database/Migrations/Sqlite/20250211154155_BodyType.cs create mode 100644 Content.Shared/_Sunrise/BodyType.cs create mode 100644 Resources/Locale/ru-RU/_strings/bodytypes.ftl create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/head.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/torso.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/arachnid.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/demon.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/lizard.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/moth.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/slime.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/slime.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/tajaran.rsi/torso_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/head_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/head_slim_f.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/l_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/l_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/l_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/l_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/r_arm_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/r_foot_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/r_hand_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/r_leg_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/torso_slim.png create mode 100644 Resources/Textures/Mobs/Species/Slim/vulpa.rsi/torso_slim_f.png create mode 100644 Resources/Textures/_Sunrise/Clothing/Socks/fishnet.rsi/fishnet_full-body-slim.png create mode 100644 Resources/Textures/_Sunrise/Clothing/Socks/pantyhose.rsi/pantyhose-body-slim.png create mode 100644 Resources/Textures/_Sunrise/Clothing/Socks/thigh.rsi/fishnet_thigh-body-slim.png create mode 100644 Resources/Textures/_Sunrise/Clothing/Socks/thigh.rsi/thin_thigh-body-slim.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/bra.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/gloves.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/hardsuit.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/jumpsuit.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/meta.json create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/outer.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/panties.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/shoes.png create mode 100644 Resources/Textures/_Sunrise/Mobs/Species/Human/displacement.rsi/socks.png diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index e05732ed51..1472e807e6 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Numerics; using Content.Client.DisplacementMap; using Content.Client.Inventory; +using Content.Shared._Sunrise; using Content.Shared.Clothing; using Content.Shared.Clothing.Components; using Content.Shared.Clothing.EntitySystems; @@ -11,9 +12,11 @@ using Content.Shared.Humanoid; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Item; +using Content.Shared.Tag; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.TypeSerializers.Implementations; using Robust.Shared.Utility; @@ -55,6 +58,8 @@ public sealed class ClientClothingSystem : ClothingSystem [Dependency] private readonly IResourceCache _cache = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly DisplacementMapSystem _displacement = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; public override void Initialize() { @@ -108,6 +113,12 @@ public sealed class ClientClothingSystem : ClothingSystem List? layers = null; + if (TryComp(args.Equipee, out HumanoidAppearanceComponent? humanoid)) + { + var bodyTypeName = _prototype.Index(humanoid.BodyType).Name; + item.ClothingVisuals.TryGetValue($"{args.Slot}-{bodyTypeName}", out layers); + } + // first attempt to get species specific data. if (inventory.SpeciesId != null) item.ClothingVisuals.TryGetValue($"{args.Slot}-{inventory.SpeciesId}", out layers); @@ -116,7 +127,7 @@ public sealed class ClientClothingSystem : ClothingSystem if (layers == null && !item.ClothingVisuals.TryGetValue(args.Slot, out layers)) { // No generic data either. Attempt to generate defaults from the item's RSI & item-prefixes - if (!TryGetDefaultVisuals(uid, item, args.Slot, inventory.SpeciesId, out layers)) + if (!TryGetDefaultVisuals(uid, item, args.Slot, inventory.SpeciesId, args.Equipee, out layers)) return; } @@ -144,6 +155,7 @@ public sealed class ClientClothingSystem : ClothingSystem /// Useful for lazily adding clothing sprites without modifying yaml. And for backwards compatibility. /// private bool TryGetDefaultVisuals(EntityUid uid, ClothingComponent clothing, string slot, string? speciesId, + EntityUid target, [NotNullWhen(true)] out List? layers) { layers = null; @@ -171,6 +183,13 @@ public sealed class ClientClothingSystem : ClothingSystem if (clothing.EquippedState != null) state = $"{clothing.EquippedState}"; + if (TryComp(target, out HumanoidAppearanceComponent? humanoid)) + { + var bodyTypeName = _prototype.Index(humanoid.BodyType).Name; + if (rsi.TryGetState($"{state}-{bodyTypeName}", out _)) + state = $"{state}-{bodyTypeName}"; + } + // species specific if (speciesId != null && rsi.TryGetState($"{state}-{speciesId}", out _)) state = $"{state}-{speciesId}"; @@ -276,18 +295,42 @@ public sealed class ClientClothingSystem : ClothingSystem // Select displacement maps var displacementData = inventory.Displacements.GetValueOrDefault(slot); //Default unsexed map - var equipeeSex = CompOrNull(equipee)?.Sex; - if (equipeeSex != null) + string? bodyTypeName = null; + if (TryComp(equipee, out HumanoidAppearanceComponent? humanoid)) { - switch (equipeeSex) + bodyTypeName = _prototype.Index(humanoid.BodyType).Name; + + var hardsuitKey = $"hardsuit-{bodyTypeName}"; + + switch (humanoid.Sex) { case Sex.Male: if (inventory.MaleDisplacements.Count > 0) - displacementData = inventory.MaleDisplacements.GetValueOrDefault(slot); + { + displacementData = inventory.MaleDisplacements.GetValueOrDefault($"{slot}-{bodyTypeName}") + ?? inventory.MaleDisplacements.GetValueOrDefault(slot); + + if (_tagSystem.HasTag(equipment, "Hardsuit")) + { + displacementData = inventory.MaleDisplacements.GetValueOrDefault(hardsuitKey) + ?? inventory.Displacements.GetValueOrDefault(slot); + } + } + break; case Sex.Female: if (inventory.FemaleDisplacements.Count > 0) - displacementData = inventory.FemaleDisplacements.GetValueOrDefault(slot); + { + displacementData = inventory.FemaleDisplacements.GetValueOrDefault($"{slot}-{bodyTypeName}") + ?? inventory.FemaleDisplacements.GetValueOrDefault(slot); + + if (_tagSystem.HasTag(equipment, "Hardsuit")) + { + displacementData = inventory.FemaleDisplacements.GetValueOrDefault(hardsuitKey) + ?? inventory.FemaleDisplacements.GetValueOrDefault(slot); + } + } + break; } } @@ -334,7 +377,8 @@ public sealed class ClientClothingSystem : ClothingSystem if (displacementData is not null) { //Checking that the state is not tied to the current race. In this case we don't need to use the displacement maps. - if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId)) + if (layerData.State is not null && (inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId) + || bodyTypeName is not null && layerData.State.EndsWith(bodyTypeName))) continue; if (_displacement.TryAddDisplacement(displacementData, sprite, index, key, revealedLayers)) diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index 262bedc523..ea3a5825cc 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared._Sunrise; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; @@ -41,10 +42,8 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem var oldLayers = new HashSet(component.BaseLayers.Keys); component.BaseLayers.Clear(); - // add default species layers - var speciesProto = _prototypeManager.Index(component.Species); - var baseSprites = _prototypeManager.Index(speciesProto.SpriteSet); - foreach (var (key, id) in baseSprites.Sprites) + var bodyTypeProto = _prototypeManager.Index(component.BodyType); + foreach (var (key, id) in bodyTypeProto.Sprites) { oldLayers.Remove(key); if (!component.CustomBaseLayers.ContainsKey(key)) @@ -194,6 +193,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem humanoid.Sex = profile.Sex; humanoid.Gender = profile.Gender; humanoid.Age = profile.Age; + humanoid.BodyType = profile.BodyType; humanoid.Species = profile.Species; humanoid.SkinColor = profile.Appearance.SkinColor; humanoid.EyeColor = profile.Appearance.EyeColor; diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml index 68bb3eb262..c59af66693 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml @@ -61,6 +61,13 @@ ToolTip="{Loc 'humanoid-profile-editor-guidebook-button-tooltip'}"/> + + + +