From 880d68254f9309c912ef8573dc499de3dbda677a Mon Sep 17 00:00:00 2001 From: Soragy-bot Date: Fri, 20 Mar 2026 03:12:05 +0300 Subject: [PATCH 1/3] feat: add DNA data to semen puddles for forensics --- .../InteractionsPanel.Interactions.cs | 26 ++++++++++++++----- .../Prototypes/_Lust/ERP/Other/semen.yml | 1 + 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs index 1039edef301..34061601314 100644 --- a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs +++ b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs @@ -8,9 +8,11 @@ using Content.Shared._Sunrise.InteractionsPanel.Data.UI; using Content.Shared.Chat; using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; using Content.Shared.Clothing; using Content.Shared.Database; using Content.Shared.FixedPoint; +using Content.Shared.Forensics.Components; using Content.Shared.Hands; using Content.Shared.Humanoid; using Content.Shared.Input; @@ -358,13 +360,23 @@ private void TryLoseVirginity(EntityUid ent, string type) } } - private void SpawnSemen(string prototype, EntityCoordinates coordinates) + private void SpawnSemen(EntityUid source, string prototype, EntityCoordinates coordinates) { - _puddle.TrySpillAt( - coordinates, - new Solution(prototype, 4f), - out _, - false); + var solution = new Solution(); + solution.AddReagent(new ReagentId(prototype, GetSemenDnaData(source)), 4f); + _puddle.TrySpillAt(coordinates, solution, out _, false); + } + + private List GetSemenDnaData(EntityUid source) + { + var dnaData = new DnaData(); + + if (TryComp(source, out var dnaComp) && dnaComp.DNA != null) + dnaData.DNA = dnaComp.DNA; + else + dnaData.DNA = Loc.GetString("forensics-dna-unknown"); + + return [dnaData]; } private void HandleCustomInteraction( @@ -488,7 +500,7 @@ private void TryOrgasm(EntityUid uid) _chatSystem.TryEmoteWithChat(uid, "Moan"); if (TryComp(uid, out var humanoidAppearanceComponent) && humanoidAppearanceComponent.Sex == Sex.Male) - SpawnSemen("Semen", Transform(uid).Coordinates); + SpawnSemen(uid, "Semen", Transform(uid).Coordinates); SetCooldown(uid, "orgasm", TimeSpan.FromSeconds(OrgasmCooldownSeconds)); Dirty(uid, comp); diff --git a/Resources/Prototypes/_Lust/ERP/Other/semen.yml b/Resources/Prototypes/_Lust/ERP/Other/semen.yml index dfa0d119ead..0568ee55ccd 100644 --- a/Resources/Prototypes/_Lust/ERP/Other/semen.yml +++ b/Resources/Prototypes/_Lust/ERP/Other/semen.yml @@ -21,3 +21,4 @@ reagents: - ReagentId: Semen Quantity: 2 + - type: DnaSubstanceTrace From 20b2630f1d2bde4f0cf57c21edfff4bce89b0b4a Mon Sep 17 00:00:00 2001 From: Soragy-bot Date: Mon, 23 Mar 2026 15:55:18 +0300 Subject: [PATCH 2/3] chore: mark Lust add in InteractionsPanel.Interactions.cs --- .../InteractionsPanel.Interactions.cs | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs index 34061601314..26c8acd6e5d 100644 --- a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs +++ b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs @@ -1,20 +1,26 @@ using System.Numerics; using Content.Server._Sunrise.PlayerCache; using Content.Server.Chat.Systems; -using Content.Server.Fluids.EntitySystems; +// Lust-Start +using Content.Server.Fluids.EntitySystems; using Content.Shared._Sunrise.Aphrodisiac; +// Lust-End using Content.Shared._Sunrise.InteractionsPanel.Data.Components; using Content.Shared._Sunrise.InteractionsPanel.Data.Prototypes; using Content.Shared._Sunrise.InteractionsPanel.Data.UI; using Content.Shared.Chat; +// Lust-Start using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; +// Lust-End using Content.Shared.Clothing; using Content.Shared.Database; +// Lust-Start using Content.Shared.FixedPoint; using Content.Shared.Forensics.Components; +// Lust-End using Content.Shared.Hands; -using Content.Shared.Humanoid; +using Content.Shared.Humanoid; // Lust-Edit using Content.Shared.Input; using Content.Shared.Verbs; using Robust.Shared.Audio; @@ -29,10 +35,12 @@ namespace Content.Server._Sunrise.InteractionsPanel; public partial class InteractionsPanel { [Dependency] private readonly PlayerCacheManager _playerCacheManager = default!; + // Lust-Start [Dependency] private readonly PuddleSystem _puddle = default!; private const float LoveDecayRate = 0.5f; private const float OrgasmCooldownSeconds = 15f; + // Lust-End private void InitializeInteractions() { @@ -40,7 +48,7 @@ private void InitializeInteractions() subs => { subs.Event(OnInteractionMessageReceived); - subs.Event(OnUndressMessageReceived); + subs.Event(OnUndressMessageReceived); // Lust-Edit }); SubscribeLocalEvent>(AddInteractionsVerb); @@ -57,6 +65,7 @@ private void InitializeInteractions() .Register(); } + // Lust-Start private void OnUndressMessageReceived(Entity ent, ref RequestUndressMessage args) { if (_inventory.TryGetSlots(ent, out var slots)) @@ -67,6 +76,7 @@ private void OnUndressMessageReceived(Entity ent, ref Req } } } + // Lust-End private void TryAutoInteraction(ICommonSession? session) { @@ -256,6 +266,7 @@ private void OnInteractionMessageReceived(Entity ent, ref SetCooldown(ent.Owner, args.InteractionId, interactionPrototype.Cooldown); } + // Lust-Start if (interactionPrototype.LoveUser > 0) ModifyLove(ent.Owner, interactionPrototype.LoveUser); @@ -266,11 +277,13 @@ private void OnInteractionMessageReceived(Entity ent, ref TryEmitMoan(ent.Owner, interactionPrototype.LoveUser, interactionPrototype.UserMoanChance); TryEmitMoan(target.Value, interactionPrototype.LoveTarget, interactionPrototype.TargetMoanChance); + // Lust-End _log.Add(LogType.Interactions, LogImpact.Medium, $"[InteractionsPanel] {ToPretty(ent.Owner)} использует \"{interactionPrototype.ID}\" на {ToPretty(target.Value)}"); } + // Lust-Start private void TryEmitMoan(EntityUid uid, FixedPoint2 loveGain, float chance) { if (!_gameTiming.IsFirstTimePredicted) @@ -378,6 +391,7 @@ private List GetSemenDnaData(EntityUid source) return [dnaData]; } + // Lust-End private void HandleCustomInteraction( EntityUid user, @@ -447,13 +461,14 @@ private void UpdateInteractions(float frameTime) base.Update(frameTime); var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp)) + while (query.MoveNext(out var uid, out var comp)) // Lust-Edit { UpdateCooldowns(uid); - UpdateLove(uid, comp, frameTime); + UpdateLove(uid, comp, frameTime); // Lust-Edit } } + // Lust-Start private void UpdateLove(EntityUid uid, InteractionsComponent comp, float frameTime) { if (comp.LoveAmount <= 0) @@ -540,6 +555,7 @@ public void ModifyLove(EntityUid uid, FixedPoint2 amount) RemComp(uid); } } + // Lust-End private bool IsOnCooldown(EntityUid user, string interactionId) { From ea193778bcd4ed9e91e8b7ee2dd9155c101480b3 Mon Sep 17 00:00:00 2001 From: Soragy-bot Date: Fri, 31 Jul 2026 13:14:27 +0300 Subject: [PATCH 3/3] refactor: move InteractionsPanel Lust logic into _Lust partial Extract love/DNA/undress Lust code from _Sunrise to reduce upstream merge conflicts. --- .../InteractionsPanel.Lust.cs | 243 +++++++++++++++++ .../InteractionsPanel.Interactions.cs | 244 +----------------- 2 files changed, 244 insertions(+), 243 deletions(-) create mode 100644 Content.Server/_Lust/InteractionsPanel/InteractionsPanel.Lust.cs diff --git a/Content.Server/_Lust/InteractionsPanel/InteractionsPanel.Lust.cs b/Content.Server/_Lust/InteractionsPanel/InteractionsPanel.Lust.cs new file mode 100644 index 00000000000..9d80d958362 --- /dev/null +++ b/Content.Server/_Lust/InteractionsPanel/InteractionsPanel.Lust.cs @@ -0,0 +1,243 @@ +using Content.Server.Fluids.EntitySystems; +using Content.Shared._Sunrise.Aphrodisiac; +using Content.Shared._Sunrise.InteractionsPanel.Data.Components; +using Content.Shared._Sunrise.InteractionsPanel.Data.Prototypes; +using Content.Shared._Sunrise.InteractionsPanel.Data.UI; +using Content.Shared.Chat; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Content.Shared.Forensics.Components; +using Content.Shared.Humanoid; +using Robust.Shared.Map; +using Robust.Shared.Random; + +namespace Content.Server._Sunrise.InteractionsPanel; + +public partial class InteractionsPanel +{ + [Dependency] private readonly PuddleSystem _puddle = default!; + + private const float LoveDecayRate = 0.5f; + private const float OrgasmCooldownSeconds = 15f; + + private void OnUndressMessageReceived(Entity ent, ref RequestUndressMessage args) + { + if (_inventory.TryGetSlots(ent, out var slots)) + { + foreach (var slot in slots) + { + _inventory.TryUnequip(ent, slot.Name, true, false, false); + } + } + } + + private void ProcessInteractionLustEffects(EntityUid user, EntityUid target, InteractionPrototype interactionPrototype) + { + if (interactionPrototype.LoveUser > 0) + ModifyLove(user, interactionPrototype.LoveUser); + + if (interactionPrototype.LoveTarget > 0) + ModifyLove(target, interactionPrototype.LoveTarget); + + ProcessVirginityLoss(user, target, interactionPrototype); + + TryEmitMoan(user, interactionPrototype.LoveUser, interactionPrototype.UserMoanChance); + TryEmitMoan(target, interactionPrototype.LoveTarget, interactionPrototype.TargetMoanChance); + } + + private void TryEmitMoan(EntityUid uid, FixedPoint2 loveGain, float chance) + { + if (!_gameTiming.IsFirstTimePredicted) + return; + + if (!_random.Prob(chance)) + return; + + if (!TryComp(uid, out var component)) + return; + + var now = _gameTiming.CurTime; + if (now < component.LastMoanTime + TimeSpan.FromSeconds(5)) + return; + + component.LastMoanTime = now; + Dirty(uid, component); + + _chatSystem.TryEmoteWithChat(uid, "Moan"); + } + + private void ProcessVirginityLoss(EntityUid user, EntityUid target, InteractionPrototype proto) + { + TryLoseVirginity(user, proto.UserVirginityLoss); + TryLoseVirginity(target, proto.TargetVirginityLoss); + } + + private void TryLoseVirginity(EntityUid ent, string type) + { + if (!TryComp(ent, out var comp)) + return; + + if (string.IsNullOrWhiteSpace(type) || type == "none") + return; + + var sex = TryComp(ent, out var humanoid) + ? humanoid.Sex.ToString().ToLowerInvariant() + : "unknown"; + + switch (type.ToLowerInvariant()) + { + case "anal": + if (comp.AnalVirginity == Virginity.Yes) + { + comp.AnalVirginity = Virginity.No; + Dirty(ent, comp); + _chatSystem.TrySendInGameICMessage(ent, "теряет анальную девственность", InGameICChatType.Emote, false); + } + break; + + case "vaginal": + case "female": + if (comp.Virginity == Virginity.Yes && sex == "female") + { + comp.Virginity = Virginity.No; + Dirty(ent, comp); + _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); + } + break; + + case "male": + if (comp.Virginity == Virginity.Yes && sex == "male") + { + comp.Virginity = Virginity.No; + Dirty(ent, comp); + _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); + } + break; + + case "futanari": + if (comp.Virginity == Virginity.Yes && sex == "futanari") + { + comp.Virginity = Virginity.No; + Dirty(ent, comp); + _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); + } + break; + + case "any": + if (comp.Virginity == Virginity.Yes) + { + comp.Virginity = Virginity.No; + Dirty(ent, comp); + _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); + } + break; + } + } + + private void SpawnSemen(EntityUid source, string prototype, EntityCoordinates coordinates) + { + var solution = new Solution(); + solution.AddReagent(new ReagentId(prototype, GetSemenDnaData(source)), 4f); + _puddle.TrySpillAt(coordinates, solution, out _, false); + } + + private List GetSemenDnaData(EntityUid source) + { + var dnaData = new DnaData(); + + if (TryComp(source, out var dnaComp) && dnaComp.DNA != null) + dnaData.DNA = dnaComp.DNA; + else + dnaData.DNA = Loc.GetString("forensics-dna-unknown"); + + return [dnaData]; + } + + private void UpdateLove(EntityUid uid, InteractionsComponent comp, float frameTime) + { + if (comp.LoveAmount <= 0) + { + if (TryComp(uid, out var loveVisionComp) && loveVisionComp.FromLoveSystem) + { + RemComp(uid); + } + return; + } + + comp.LoveAmount -= LoveDecayRate * frameTime; + if (comp.LoveAmount < 0) + comp.LoveAmount = 0; + + Dirty(uid, comp); + + var ratio = (float)(comp.LoveAmount / comp.MaxLoveAmount).Float(); + var hasEffect = HasComp(uid); + + if (ratio >= 0.33f && !hasEffect) + { + var newComp = AddComp(uid); + newComp.FromLoveSystem = true; + Dirty(uid, newComp); + } + else if (ratio < 0.33f && TryComp(uid, out var loveVisionComp) && loveVisionComp.FromLoveSystem) + { + RemComp(uid); + } + } + + private void TryOrgasm(EntityUid uid) + { + if (!TryComp(uid, out var comp)) + return; + + if (IsOnCooldown(uid, "orgasm")) + return; + + comp.LoveAmount = 0; + + _chatSystem.TrySendInGameICMessage(uid, "кончает", InGameICChatType.Emote, false); + _chatSystem.TryEmoteWithChat(uid, "Moan"); + + if (TryComp(uid, out var humanoidAppearanceComponent) && humanoidAppearanceComponent.Sex == Sex.Male) + SpawnSemen(uid, "Semen", Transform(uid).Coordinates); + + SetCooldown(uid, "orgasm", TimeSpan.FromSeconds(OrgasmCooldownSeconds)); + Dirty(uid, comp); + } + + public void ModifyLove(EntityUid uid, FixedPoint2 amount) + { + if (!TryComp(uid, out var comp)) + return; + + if (IsOnCooldown(uid, "orgasm")) + return; + + comp.LoveAmount += amount; + + if (comp.LoveAmount >= comp.MaxLoveAmount) + { + TryOrgasm(uid); + } + else if (comp.LoveAmount > comp.MaxLoveAmount) + { + comp.LoveAmount = comp.MaxLoveAmount; + } + + Dirty(uid, comp); + + var ratio = (float)(comp.LoveAmount / comp.MaxLoveAmount).Float(); + + if (ratio >= 0.33f && !HasComp(uid)) + { + var newComp = AddComp(uid); + newComp.FromLoveSystem = true; + Dirty(uid, newComp); + } + else if (ratio < 0.33f && TryComp(uid, out var loveVision) && loveVision.FromLoveSystem) + { + RemComp(uid); + } + } +} diff --git a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs index 26c8acd6e5d..86423944882 100644 --- a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs +++ b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs @@ -1,26 +1,13 @@ using System.Numerics; using Content.Server._Sunrise.PlayerCache; using Content.Server.Chat.Systems; -// Lust-Start -using Content.Server.Fluids.EntitySystems; -using Content.Shared._Sunrise.Aphrodisiac; -// Lust-End using Content.Shared._Sunrise.InteractionsPanel.Data.Components; using Content.Shared._Sunrise.InteractionsPanel.Data.Prototypes; using Content.Shared._Sunrise.InteractionsPanel.Data.UI; using Content.Shared.Chat; -// Lust-Start -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reagent; -// Lust-End using Content.Shared.Clothing; using Content.Shared.Database; -// Lust-Start -using Content.Shared.FixedPoint; -using Content.Shared.Forensics.Components; -// Lust-End using Content.Shared.Hands; -using Content.Shared.Humanoid; // Lust-Edit using Content.Shared.Input; using Content.Shared.Verbs; using Robust.Shared.Audio; @@ -35,12 +22,6 @@ namespace Content.Server._Sunrise.InteractionsPanel; public partial class InteractionsPanel { [Dependency] private readonly PlayerCacheManager _playerCacheManager = default!; - // Lust-Start - [Dependency] private readonly PuddleSystem _puddle = default!; - - private const float LoveDecayRate = 0.5f; - private const float OrgasmCooldownSeconds = 15f; - // Lust-End private void InitializeInteractions() { @@ -65,19 +46,6 @@ private void InitializeInteractions() .Register(); } - // Lust-Start - private void OnUndressMessageReceived(Entity ent, ref RequestUndressMessage args) - { - if (_inventory.TryGetSlots(ent, out var slots)) - { - foreach (var slot in slots) - { - _inventory.TryUnequip(ent, slot.Name, true, false, false); - } - } - } - // Lust-End - private void TryAutoInteraction(ICommonSession? session) { if (session?.AttachedEntity is not { Valid: true } player || !Exists(player)) @@ -266,133 +234,12 @@ private void OnInteractionMessageReceived(Entity ent, ref SetCooldown(ent.Owner, args.InteractionId, interactionPrototype.Cooldown); } - // Lust-Start - if (interactionPrototype.LoveUser > 0) - ModifyLove(ent.Owner, interactionPrototype.LoveUser); - - if (interactionPrototype.LoveTarget > 0) - ModifyLove(target.Value, interactionPrototype.LoveTarget); - - ProcessVirginityLoss(ent.Owner, target.Value, interactionPrototype); - - TryEmitMoan(ent.Owner, interactionPrototype.LoveUser, interactionPrototype.UserMoanChance); - TryEmitMoan(target.Value, interactionPrototype.LoveTarget, interactionPrototype.TargetMoanChance); - // Lust-End + ProcessInteractionLustEffects(ent.Owner, target.Value, interactionPrototype); // Lust-Edit _log.Add(LogType.Interactions, LogImpact.Medium, $"[InteractionsPanel] {ToPretty(ent.Owner)} использует \"{interactionPrototype.ID}\" на {ToPretty(target.Value)}"); } - // Lust-Start - private void TryEmitMoan(EntityUid uid, FixedPoint2 loveGain, float chance) - { - if (!_gameTiming.IsFirstTimePredicted) - return; - - if (!_random.Prob(chance)) - return; - - if (!TryComp(uid, out var component)) - return; - - var now = _gameTiming.CurTime; - if (now < component.LastMoanTime + TimeSpan.FromSeconds(5)) - return; - - component.LastMoanTime = now; - Dirty(uid, component); - - _chatSystem.TryEmoteWithChat(uid, "Moan"); - } - - private void ProcessVirginityLoss(EntityUid user, EntityUid target, InteractionPrototype proto) - { - TryLoseVirginity(user, proto.UserVirginityLoss); - TryLoseVirginity(target, proto.TargetVirginityLoss); - } - - private void TryLoseVirginity(EntityUid ent, string type) - { - if (!TryComp(ent, out var comp)) - return; - - if (string.IsNullOrWhiteSpace(type) || type == "none") - return; - - var sex = TryComp(ent, out var humanoid) - ? humanoid.Sex.ToString().ToLowerInvariant() - : "unknown"; - - switch (type.ToLowerInvariant()) - { - case "anal": - if (comp.AnalVirginity == Virginity.Yes) - { - comp.AnalVirginity = Virginity.No; - Dirty(ent, comp); - _chatSystem.TrySendInGameICMessage(ent, "теряет анальную девственность", InGameICChatType.Emote, false); - } - break; - - case "vaginal": - case "female": - if (comp.Virginity == Virginity.Yes && sex == "female") - { - comp.Virginity = Virginity.No; - Dirty(ent, comp); - _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); - } - break; - - case "male": - if (comp.Virginity == Virginity.Yes && sex == "male") - { - comp.Virginity = Virginity.No; - Dirty(ent, comp); - _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); - } - break; - - case "futanari": - if (comp.Virginity == Virginity.Yes && sex == "futanari") - { - comp.Virginity = Virginity.No; - Dirty(ent, comp); - _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); - } - break; - - case "any": - if (comp.Virginity == Virginity.Yes) - { - comp.Virginity = Virginity.No; - Dirty(ent, comp); - _chatSystem.TrySendInGameICMessage(ent, "теряет девственность", InGameICChatType.Emote, false); - } - break; - } - } - - private void SpawnSemen(EntityUid source, string prototype, EntityCoordinates coordinates) - { - var solution = new Solution(); - solution.AddReagent(new ReagentId(prototype, GetSemenDnaData(source)), 4f); - _puddle.TrySpillAt(coordinates, solution, out _, false); - } - - private List GetSemenDnaData(EntityUid source) - { - var dnaData = new DnaData(); - - if (TryComp(source, out var dnaComp) && dnaComp.DNA != null) - dnaData.DNA = dnaComp.DNA; - else - dnaData.DNA = Loc.GetString("forensics-dna-unknown"); - - return [dnaData]; - } - // Lust-End - private void HandleCustomInteraction( EntityUid user, EntityUid target, @@ -468,95 +315,6 @@ private void UpdateInteractions(float frameTime) } } - // Lust-Start - private void UpdateLove(EntityUid uid, InteractionsComponent comp, float frameTime) - { - if (comp.LoveAmount <= 0) - { - if (TryComp(uid, out var loveVisionComp) && loveVisionComp.FromLoveSystem) - { - RemComp(uid); - } - return; - } - - comp.LoveAmount -= LoveDecayRate * frameTime; - if (comp.LoveAmount < 0) - comp.LoveAmount = 0; - - Dirty(uid, comp); - - var ratio = (float)(comp.LoveAmount / comp.MaxLoveAmount).Float(); - var hasEffect = HasComp(uid); - - if (ratio >= 0.33f && !hasEffect) - { - var newComp = AddComp(uid); - newComp.FromLoveSystem = true; - Dirty(uid, newComp); - } - else if (ratio < 0.33f && TryComp(uid, out var loveVisionComp) && loveVisionComp.FromLoveSystem) - { - RemComp(uid); - } - } - - private void TryOrgasm(EntityUid uid) - { - if (!TryComp(uid, out var comp)) - return; - - if (IsOnCooldown(uid, "orgasm")) - return; - - comp.LoveAmount = 0; - - _chatSystem.TrySendInGameICMessage(uid, "кончает", InGameICChatType.Emote, false); - _chatSystem.TryEmoteWithChat(uid, "Moan"); - - if (TryComp(uid, out var humanoidAppearanceComponent) && humanoidAppearanceComponent.Sex == Sex.Male) - SpawnSemen(uid, "Semen", Transform(uid).Coordinates); - - SetCooldown(uid, "orgasm", TimeSpan.FromSeconds(OrgasmCooldownSeconds)); - Dirty(uid, comp); - } - - public void ModifyLove(EntityUid uid, FixedPoint2 amount) - { - if (!TryComp(uid, out var comp)) - return; - - if (IsOnCooldown(uid, "orgasm")) - return; - - comp.LoveAmount += amount; - - if (comp.LoveAmount >= comp.MaxLoveAmount) - { - TryOrgasm(uid); - } - else if (comp.LoveAmount > comp.MaxLoveAmount) - { - comp.LoveAmount = comp.MaxLoveAmount; - } - - Dirty(uid, comp); - - var ratio = (float)(comp.LoveAmount / comp.MaxLoveAmount).Float(); - - if (ratio >= 0.33f && !HasComp(uid)) - { - var newComp = AddComp(uid); - newComp.FromLoveSystem = true; - Dirty(uid, newComp); - } - else if (ratio < 0.33f && TryComp(uid, out var loveVision) && loveVision.FromLoveSystem) - { - RemComp(uid); - } - } - // Lust-End - private bool IsOnCooldown(EntityUid user, string interactionId) { if (!TryComp(user, out var component))