From d24b6bf89459c7d6e8a1703a73ab697bfebaf722 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:23:14 +1000 Subject: [PATCH] Make the sentient plant mutation non-copyable to other plantholders (#29133) make the sentient plant mutation not propagate by clipping, using the seed extractor or cryoxadone --- .../Botany/Systems/MutationSystem.cs | 8 +++---- .../Botany/Systems/PlantHolderSystem.cs | 22 ++++++++++++++++--- .../Botany/Systems/SeedExtractorSystem.cs | 11 ++++++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index 5283f1ff95..435c87d050 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -38,7 +38,7 @@ public sealed class MutationSystem : EntitySystem } // Add up everything in the bits column and put the number here. - const int totalbits = 285; + const int totalbits = 272; #pragma warning disable IDE0055 // disable formatting warnings because this looks more readable // Tolerances (55) @@ -65,10 +65,10 @@ public sealed class MutationSystem : EntitySystem // Kill the plant (30) MutateBool(ref seed.Viable , false, 30, totalbits, severity); - // Fun (100) + // Fun (82) MutateBool(ref seed.Seedless , true , 10, totalbits, severity); MutateBool(ref seed.Slip , true , 10, totalbits, severity); - MutateBool(ref seed.Sentient , true , 10, totalbits, severity); + MutateBool(ref seed.Sentient , true , 2, totalbits, severity); MutateBool(ref seed.Ligneous , true , 10, totalbits, severity); MutateBool(ref seed.Teleporting , true , 10, totalbits, severity); MutateBool(ref seed.Bioluminescent, true , 10, totalbits, severity); @@ -116,10 +116,10 @@ public sealed class MutationSystem : EntitySystem CrossFloat(ref result.Production, a.Production); CrossFloat(ref result.Potency, a.Potency); + // we do not transfer Sentient to another plant to avoid ghost role spam CrossBool(ref result.Seedless, a.Seedless); CrossBool(ref result.Viable, a.Viable); CrossBool(ref result.Slip, a.Slip); - CrossBool(ref result.Sentient, a.Sentient); CrossBool(ref result.Ligneous, a.Ligneous); CrossBool(ref result.Teleporting, a.Teleporting); CrossBool(ref result.Bioluminescent, a.Bioluminescent); diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index b4e9049133..da6d0afd79 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -299,8 +299,17 @@ public sealed class PlantHolderSystem : EntitySystem { healthOverride = component.Health; } - component.Seed.Unique = false; - var seed = _botany.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates, args.User, healthOverride); + var packetSeed = component.Seed; + if (packetSeed.Sentient) + { + packetSeed = packetSeed.Clone(); // clone before modifying the seed + packetSeed.Sentient = false; + } + else + { + packetSeed.Unique = false; + } + var seed = _botany.SpawnSeedPacket(packetSeed, Transform(args.User).Coordinates, args.User, healthOverride); _randomHelper.RandomOffset(seed, 0.25f); var displayName = Loc.GetString(component.Seed.DisplayName); _popup.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message", @@ -627,8 +636,15 @@ public sealed class PlantHolderSystem : EntitySystem } else if (component.Age < 0) // Revert back to seed packet! { + var packetSeed = component.Seed; + if (packetSeed.Sentient) + { + if (!packetSeed.Unique) // clone if necessary before modifying the seed + packetSeed = packetSeed.Clone(); + packetSeed.Sentient = false; // remove Sentient to avoid ghost role spam + } // will put it in the trays hands if it has any, please do not try doing this - _botany.SpawnSeedPacket(component.Seed, Transform(uid).Coordinates, uid); + _botany.SpawnSeedPacket(packetSeed, Transform(uid).Coordinates, uid); RemovePlant(uid, component); component.ForceUpdate = true; Update(uid, component); diff --git a/Content.Server/Botany/Systems/SeedExtractorSystem.cs b/Content.Server/Botany/Systems/SeedExtractorSystem.cs index ec9d329642..05c99a601e 100644 --- a/Content.Server/Botany/Systems/SeedExtractorSystem.cs +++ b/Content.Server/Botany/Systems/SeedExtractorSystem.cs @@ -45,12 +45,19 @@ public sealed class SeedExtractorSystem : EntitySystem var amount = (int) _random.NextFloat(seedExtractor.BaseMinSeeds, seedExtractor.BaseMaxSeeds + 1) * seedExtractor.SeedAmountMultiplier; var coords = Transform(uid).Coordinates; + var packetSeed = seed; + if (packetSeed.Sentient) + { + if (!packetSeed.Unique) // clone if necessary before modifying the seed + packetSeed = packetSeed.Clone(); + packetSeed.Sentient = false; // remove Sentient to avoid ghost role spam + } if (amount > 1) - seed.Unique = false; + packetSeed.Unique = false; for (var i = 0; i < amount; i++) { - _botanySystem.SpawnSeedPacket(seed, coords, args.User); + _botanySystem.SpawnSeedPacket(packetSeed, coords, args.User); } }