From 6fb12233d48de476c2b06415031fa2e9c9a1d327 Mon Sep 17 00:00:00 2001 From: juniwoofs Date: Sun, 22 Dec 2024 11:24:58 -0800 Subject: [PATCH 01/10] Plushies! (#1369) # Description Added two new plushies to the game! A harpy plushie and a plushie for the beloved station pet Morty! ![image](https://github.com/user-attachments/assets/3e202da2-3571-4c67-82c9-54a6aaf3c91f) ![mortplush](https://github.com/user-attachments/assets/9f131eb9-ed89-4818-b54c-e9da949e8ce2) ![harpyplushie](https://github.com/user-attachments/assets/47aa5b91-0747-4a2c-8c5c-18c5429ab570) --- # Changelog :cl: - add: two new cuddly friends to the station! (harpy and morty plush) --------- Signed-off-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> Co-authored-by: juniwoofs Co-authored-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> --- .../Entities/Markers/Spawners/Random/toy.yml | 2 + .../Prototypes/Entities/Objects/Fun/toys.yml | 60 ++++++++++++++++++ .../Objects/Fun/toys.rsi/harpyplushie.png | Bin 0 -> 1083 bytes .../Textures/Objects/Fun/toys.rsi/meta.json | 6 ++ .../Objects/Fun/toys.rsi/mortplush.png | Bin 0 -> 832 bytes 5 files changed, 68 insertions(+) create mode 100644 Resources/Textures/Objects/Fun/toys.rsi/harpyplushie.png create mode 100644 Resources/Textures/Objects/Fun/toys.rsi/mortplush.png diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml index 96b5f7aa8c..62c9e48ca6 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml @@ -69,6 +69,8 @@ - PlushieTrystan - PlushieSlips - PlushieJester + - PlushieHarpy + - PlushieMort chance: 0.5 offset: 0.2 diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index a547f33b59..d5ee3e0b4d 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1966,3 +1966,63 @@ - type: Sprite sprite: Objects/Fun/toys.rsi state: shadowkin + +- type: entity + parent: BasePlushie + id: PlushieMort + name: morty plushie + description: A plushie of the lovely Morty. It's a resilient, yet sensitive type of plush. + components: + - type: Sprite + sprite: Objects/Fun/toys.rsi + state: mortplush + +- type: entity + parent: BasePlushie + id: PlushieHarpy + name: harpy plushie + description: A soft plushie of a harpy! A small tag on it guarantees that all feathers are ethically sourced. + components: + - type: Sprite + sprite: Objects/Fun/toys.rsi + state: harpyplushie + - type: StaminaDamageOnHit + damage: 0.8 + - type: EmitSoundOnActivate + sound: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + params: + variation: 0.05 + - type: EmitSoundOnUse + sound: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + - type: EmitSoundOnCollide + sound: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + params: + variation: 0.05 + - type: EmitSoundOnLand + sound: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + params: + variation: 0.05 + - type: UseDelay + delay: 0.8 + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 0.5 + damage: + types: + Blunt: 0 + soundHit: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + params: + variation: 0.05 + soundSwing: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + params: + variation: 0.05 + soundNoDamage: + path: /Audio/DeltaV/Voice/Harpy/caw1.ogg + params: + variation: 0.05 \ No newline at end of file diff --git a/Resources/Textures/Objects/Fun/toys.rsi/harpyplushie.png b/Resources/Textures/Objects/Fun/toys.rsi/harpyplushie.png new file mode 100644 index 0000000000000000000000000000000000000000..d93178d3f7b18e3363bb1de16b5768aa81feaa63 GIT binary patch literal 1083 zcmV-B1jPG^P)L64HGlD#J2!e#DNIO(y9x8~k$e%tsD^TK2A>dzs3<_gc#v2jxYlD7P_?80n#QYr% z@MUl4TRTE51w1K(vNc@;CP7jZ32WB^Jw2MQ&yQ>+!j=Gx3&dq&g#=fsdmabVGFsK6|=DNW;nbUYZp-{VaFEqss*$$Fw#fB~8N}=mXw}eZA-CX@h|N!8WWOZ&H2eFRvTUMo-eT0yhq5Lz61{D8YD7 z^5JP zg5CiKW;jUr)XbdZyYJmpJJ})^EMQ_n%tkw8XG~L9>fonDGs%K9l0x-!Divr)mkXdQ9MWgUuFH7eHYq zyE3(*dq1K{tZRYeWKpJ)oFMA#??11c0lf`(wX3)5k~LyhkhVn3hP3hrK`|lGER!rX z0Z8tf5v9#2Q)AO`A5uVgIY%ahYGHjSgnOViAc8-L$@w_bWUNBS3{V++$!r-Y$>T*P zT%+-YkVJX`e8zWN^z)>Ysj;$p=f!dC)twFcSi=xX^7^q{)OQ*cGeZ*U7oX93dY%Wc z8A}l_{AZTL4X>Q(VU(MjtK{Vs(^s8bx7!7eXD|?ZwXr*-bwx#m3dtGM+X zEP-$V5zm6k$_s&Q)6o$mZ)~hJjnVsGyjW#<#)Jzoz1M@<37D(DB_>;8>7;X*tN&cE z|C;Y_8ndKVRQ5Cq0000EWmrjOO-%qQ00008000000002eQs(5XvUh_VD7 zji5Re6kV*m1Y#Ye0>dDv4hzvCyyQ_R2*e<$SPCy&X1CC!A9?t--{d#Gnf?89yY9d; zzc+8@ec$`u+ZmdAE~ zfFg6uusP10I<40+ID?Q&Dvd%_tdTju{xr6zMt?NrK>9CkfaDmfxEpVU>U~7lyBDEGXdnzMe6-F3Z6Z$a2WCB$dG; zAU8K0AJXQQww-#WofMFMkiajgFDwGTSA7$IX#YN4cMQz1Ipn@1LLgBX?2o+MtR8s% zVk+3)++<>+2RP7xlECeU&s6h{4ZkEJ8&a02`21y6(_0E09T@gxb_9(BU;VW~4BxUT zB{+OkLMjq^dALfrnbVdE03hGhZSIAz(qIqHNF^d~FP8+Axjueh$NgUZq32vr&fqLB z|5UB5Z3=UyBU^<}a5_jLk^tU?=|_)EpmR5`S>SYlgaikPsNTStfxQ`3xHD;RV+qJK zGTB`wb9bFKm4Tf<-20F4V%aD&IoQvwUial&`aAM53aKH;R{fo3-@MaF$d?p0UQUq4 zfI=6K^o4|sAyAweGY5DBa*Z}0ulZL`4Key88Z&?YZAmXzN?_cvPpAx>KXKOkboYj( zKt)D#UhdT;sO-mFIfF@_GxEcc`VB8$Ij@5p+TE_%BO8265;AL&TF0000< KMNUMnLSTYDOKL;_ literal 0 HcmV?d00001 From 5293b92007f7ca81375d9806cccf9be38846c8d3 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 22 Dec 2024 19:25:31 +0000 Subject: [PATCH 02/10] Automatic Changelog Update (#1369) --- Resources/Changelog/Changelog.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 186a28f65b..3a624ecb1c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8757,3 +8757,10 @@ Entries: id: 6587 time: '2024-12-22T10:26:41.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1366 +- author: juniwoofs + changes: + - type: Add + message: two new cuddly friends to the station! (harpy and morty plush) + id: 6588 + time: '2024-12-22T19:24:58.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1369 From 2fc1f25bc0daa29e2017490adbdf41f9db4f4927 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 22 Dec 2024 14:55:22 -0500 Subject: [PATCH 03/10] Traits System Anticheat (#1358) # Description It turns out that there was no system in place for serverside fact checking of whether or not people have a legal traits list. Last night a bug was reported whereby a player used Cheat Engine to give himself every trait in the game, bypassing the points system entirely. It's not actually possible to reduce a trait selection down to a legal list without creating interesting race conditions, which limits my options on how to deal with it. So I made it a vote on the Einstein Engines discord, and the vote was unanimous. PUNISH THE CHEATERS.

Media

https://www.youtube.com/watch?v=X2QMN0a_TrA

# Changelog :cl: - add: Implemented Anti-cheat for Traits. Attempting to join a round with an illegal traits list will result in hilarious consequences. --- Content.Server/Traits/TraitSystem.cs | 61 ++++++++++++++++++++++++++++ Content.Shared/CCVar/CCVars.cs | 7 ++++ 2 files changed, 68 insertions(+) diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index 75771a5743..7a028b381a 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -1,14 +1,23 @@ using System.Linq; +using Content.Server.Administration.Logs; +using Content.Server.Administration.Systems; +using Content.Server.Chat.Managers; using Content.Server.GameTicking; using Content.Server.Players.PlayTimeTracking; +using Content.Shared.CCVar; +using Content.Shared.Chat; using Content.Shared.Customization.Systems; +using Content.Shared.Database; using Content.Shared.Players; using Content.Shared.Roles; using Content.Shared.Traits; +using Robust.Server.Player; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; +using Robust.Shared.Random; using Robust.Shared.Serialization.Manager; using Robust.Shared.Utility; +using Timer = Robust.Shared.Timing.Timer; namespace Content.Server.Traits; @@ -20,6 +29,11 @@ public sealed class TraitSystem : EntitySystem [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!; [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly IComponentFactory _componentFactory = default!; + [Dependency] private readonly IAdminLogManager _adminLog = default!; + [Dependency] private readonly AdminSystem _adminSystem = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IChatManager _chatManager = default!; public override void Initialize() { @@ -31,6 +45,9 @@ public override void Initialize() // When the player is spawned in, add all trait components selected during character creation private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) { + var pointsTotal = _configuration.GetCVar(CCVars.GameTraitsDefaultPoints); + var traitSelections = _configuration.GetCVar(CCVars.GameTraitsMax); + foreach (var traitId in args.Profile.TraitPreferences) { if (!_prototype.TryIndex(traitId, out var traitPrototype)) @@ -47,8 +64,15 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) out _)) continue; + // To check for cheaters. :FaridaBirb.png: + pointsTotal += traitPrototype.Points; + --traitSelections; + AddTrait(args.Mob, traitPrototype); } + + if (pointsTotal < 0 || traitSelections < 0) + PunishCheater(args.Mob); } /// @@ -59,4 +83,41 @@ public void AddTrait(EntityUid uid, TraitPrototype traitPrototype) foreach (var function in traitPrototype.Functions) function.OnPlayerSpawn(uid, _componentFactory, EntityManager, _serialization); } + + /// + /// On a non-cheating client, it's not possible to save a character with a negative number of traits. This can however + /// trigger incorrectly if a character was saved, and then at a later point in time an admin changes the traits Cvars to reduce the points. + /// Or if the points costs of traits is increased. + /// + private void PunishCheater(EntityUid uid) + { + _adminLog.Add(LogType.AdminMessage, LogImpact.High, + $"{ToPrettyString(uid):entity} attempted to spawn with an invalid trait list. This might be a mistake, or they might be cheating"); + + if (!_configuration.GetCVar(CCVars.TraitsPunishCheaters) + || !_playerManager.TryGetSessionByEntity(uid, out var targetPlayer)) + return; + + // For maximum comedic effect, this is plenty of time for the cheater to get on station and start interacting with people. + var timeToDestroy = _random.NextFloat(120, 360); + + Timer.Spawn(TimeSpan.FromSeconds(timeToDestroy), () => VaporizeCheater(targetPlayer)); + } + + /// + /// https://www.youtube.com/watch?v=X2QMN0a_TrA + /// + private void VaporizeCheater (Robust.Shared.Player.ICommonSession targetPlayer) + { + _adminSystem.Erase(targetPlayer); + + var feedbackMessage = $"[font size=24][color=#ff0000]{"You have spawned in with an illegal trait point total. If this was a result of cheats, then your nonexistence is a skill issue. Otherwise, feel free to click 'Return To Lobby', and fix your trait selections."}[/color][/font]"; + _chatManager.ChatMessageToOne( + ChatChannel.Emotes, + feedbackMessage, + feedbackMessage, + EntityUid.Invalid, + false, + targetPlayer.Channel); + } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index ef63d89af9..05a0a7f188 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -381,6 +381,13 @@ public static readonly CVarDef public static readonly CVarDef GameTraitsDefaultPoints = CVarDef.Create("game.traits_default_points", 10, CVar.REPLICATED); + /// + /// Whether the game will SMITE people who used cheat engine to spawn with all of the traits. + /// Illegal trait totals will still be logged even if this is disabled. + /// If you are intending to decrease the trait points availability, or modify the costs of traits, consider temporarily disabling this. + /// + public static readonly CVarDef TraitsPunishCheaters = + CVarDef.Create("game.traits_punish_cheaters", true, CVar.REPLICATED); /// /// Whether to allow characters to select loadout items. From 9d738c8f36c0762e0ba3942fb26ef25735ade327 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 22 Dec 2024 19:55:48 +0000 Subject: [PATCH 04/10] Automatic Changelog Update (#1358) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3a624ecb1c..a4f23cfc50 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8764,3 +8764,12 @@ Entries: id: 6588 time: '2024-12-22T19:24:58.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1369 +- author: VMSolidus + changes: + - type: Add + message: >- + Implemented Anti-cheat for Traits. Attempting to join a round with an + illegal traits list will result in hilarious consequences. + id: 6589 + time: '2024-12-22T19:55:22.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1358 From 7f8d76ea6f63d334c894fc0f7ada6fd1359408f1 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 22 Dec 2024 14:56:20 -0500 Subject: [PATCH 05/10] Make Prisoner Not Shitter Role (#1341) # Description Prisoner is consistently the most problematic role in this entire game, being seen as "The Self Antagging Role", which produces endless amounts of administrative burden. This is especially a problem with lowpop servers, or servers that are understaffed with admins. Players just join as Prisoner, *immediately* break out of the permabrig, and then go on a self antagging spree. The solution to this was staring us in the face the whole time. Just give them the same Pacified component that the Thief antag has. Now it's impossible for them to smash the permabrig windows, someone has to intentionally let them out, and even if they do, they will be hard pressed to selfantag when they can't turn on harm intent. # Changelog :cl: - add: Prisoners now spawn with a Pacifier Implant. --- .../Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml index 0ca1794742..638aaecd2c 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml @@ -22,6 +22,10 @@ - !type:CharacterTraitRequirement traits: - ShadowkinBlackeye + special: + - !type:AddComponentSpecial + components: + - type: Pacified - type: startingGear id: PrisonerGear From 68cb9ea4888c16056c6cfe9fea17de1a78420374 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 22 Dec 2024 19:56:48 +0000 Subject: [PATCH 06/10] Automatic Changelog Update (#1341) --- Resources/Changelog/Changelog.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a4f23cfc50..29eb52436c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8773,3 +8773,10 @@ Entries: id: 6589 time: '2024-12-22T19:55:22.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1358 +- author: VMSolidus + changes: + - type: Add + message: Prisoners now spawn with a Pacifier Implant. + id: 6590 + time: '2024-12-22T19:56:21.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1341 From a13d9640ec77e07b532b729ac540dc95b689c557 Mon Sep 17 00:00:00 2001 From: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> Date: Sun, 22 Dec 2024 15:57:10 -0400 Subject: [PATCH 07/10] Fix Jittering (#1334) # Description Title. Ported from https://github.com/Fansana/floofstation1/pull/393 Resolves #1277 --- # Changelog :cl: - fix: Fixed jittering displacing your character when shaken. --- Content.Client/Jittering/JitteringSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Jittering/JitteringSystem.cs b/Content.Client/Jittering/JitteringSystem.cs index 185bd490d3..aafaf318bb 100644 --- a/Content.Client/Jittering/JitteringSystem.cs +++ b/Content.Client/Jittering/JitteringSystem.cs @@ -45,7 +45,7 @@ private void OnShutdown(EntityUid uid, JitteringComponent jittering, ComponentSh private void OnAnimationCompleted(EntityUid uid, JitteringComponent jittering, AnimationCompletedEvent args) { - if(args.Key != _jitterAnimationKey) + if (args.Key != _jitterAnimationKey || jittering.LifeStage >= ComponentLifeStage.Stopping) return; if (TryComp(uid, out AnimationPlayerComponent? animationPlayer) From bfb32cf24eda47ff3dbd5d4b15b58e25ae597947 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 22 Dec 2024 19:57:37 +0000 Subject: [PATCH 08/10] Automatic Changelog Update (#1334) --- Resources/Changelog/Changelog.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 29eb52436c..95604a1e21 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8780,3 +8780,10 @@ Entries: id: 6590 time: '2024-12-22T19:56:21.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1341 +- author: sleepyyapril + changes: + - type: Fix + message: Fixed jittering displacing your character when shaken. + id: 6591 + time: '2024-12-22T19:57:10.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1334 From dff8c69f2afff6714b893a7c9572a84bd384ff89 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 25 Dec 2024 21:50:09 -0600 Subject: [PATCH 09/10] Basic Soft-Crit Implementation (#1370) # Description This PR adds a simple server configuration option for enabling basic "Soft-Crit", and not much else because oh my god this system is horribly complicated. When enabled, characters can crawl around very slowly while in crit, and really not much else. This more or less mirrors how crit affects character movement in SS13, where you can at least crawl to relative safety while bleeding to death. # Changelog :cl: - add: Added server config options for basic "Soft-Crit". When enabled, characters who are critically injured can still slowly crawl, but are otherwise still helpless and dying. --- Content.Shared/CCVar/CCVars.cs | 23 +++++++++++++++ .../Systems/MobStateSystem.Subscribers.cs | 28 +++++++++++++++++-- .../Systems/SharedMoverController.Input.cs | 7 +++-- .../Movement/Systems/SharedMoverController.cs | 7 +++-- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 05a0a7f188..a02cbb6419 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2820,5 +2820,28 @@ public static readonly CVarDef /// public static readonly CVarDef UseDynamicHostname = CVarDef.Create("game.use_dynamic_hostname", false, CVar.SERVERONLY); + + #region SoftCrit + + /// + /// Used for basic Soft-Crit implementation. Entities are allowed to crawl when in crit, as this CVar intercepts the mover controller check for incapacitation, + /// and prevents it from stopping movement if this CVar is set to true and the user is Crit but Not Dead. This is only for movement, + /// you still can't stand up while crit, and you're still more or less helpless. + /// + public static readonly CVarDef AllowMovementWhileCrit = + CVarDef.Create("mobstate.allow_movement_while_crit", true, CVar.REPLICATED); + + public static readonly CVarDef AllowTalkingWhileCrit = + CVarDef.Create("mobstate.allow_talking_while_crit", true, CVar.REPLICATED); + + /// + /// Currently does nothing because I would have to figure out WHERE I would even put this check, and the mover controller is fairly complicated. + /// The goal is to make it so that attempting to move while in 'soft crit' can potentially cause further injury, causing you to die faster. Ideally there would be special + /// actions that can be performed in soft crit, such as applying pressure to your own injuries to slow down the bleedout, or other varieties of "Will To Live". + /// + public static readonly CVarDef DamageWhileCritMove = + CVarDef.Create("mobstate.damage_while_crit_move", false, CVar.REPLICATED); + + #endregion } } diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs index 2088bd4161..3728813406 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs @@ -1,5 +1,6 @@ using Content.Shared.Bed.Sleep; using Content.Shared.Buckle.Components; +using Content.Shared.CCVar; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage.ForceSay; using Content.Shared.Emoting; @@ -16,17 +17,20 @@ using Content.Shared.Standing; using Content.Shared.Strip.Components; using Content.Shared.Throwing; +using Robust.Shared.Configuration; using Robust.Shared.Physics.Components; namespace Content.Shared.Mobs.Systems; public partial class MobStateSystem { + [Dependency] private readonly IConfigurationManager _configurationManager = default!; + //General purpose event subscriptions. If you can avoid it register these events inside their own systems private void SubscribeEvents() { SubscribeLocalEvent(OnGettingStripped); - SubscribeLocalEvent(CheckAct); + SubscribeLocalEvent(OnDirectionAttempt); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); @@ -38,7 +42,7 @@ private void SubscribeEvents() SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); - SubscribeLocalEvent(CheckAct); + SubscribeLocalEvent(OnMoveAttempt); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(OnSleepAttempt); @@ -48,6 +52,23 @@ private void SubscribeEvents() SubscribeLocalEvent(OnUnbuckleAttempt); } + private void OnDirectionAttempt(Entity ent, ref ChangeDirectionAttemptEvent args) + { + if (ent.Comp.CurrentState is MobState.Critical && _configurationManager.GetCVar(CCVars.AllowMovementWhileCrit)) + return; + + CheckAct(ent.Owner, ent.Comp, args); + } + + private void OnMoveAttempt(Entity ent, ref UpdateCanMoveEvent args) + { + if (ent.Comp.CurrentState is MobState.Critical && _configurationManager.GetCVar(CCVars.AllowMovementWhileCrit)) + return; + + CheckAct(ent.Owner, ent.Comp, args); + } + + private void OnUnbuckleAttempt(Entity ent, ref UnbuckleAttemptEvent args) { // TODO is this necessary? @@ -145,6 +166,9 @@ private void OnSpeakAttempt(EntityUid uid, MobStateComponent component, SpeakAtt return; } + if (component.CurrentState is MobState.Critical && _configurationManager.GetCVar(CCVars.AllowTalkingWhileCrit)) + return; + CheckAct(uid, component, args); } diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index 1c097ce17b..2ea6015557 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -305,8 +305,11 @@ private void HandleDirChange(EntityUid entity, Direction dir, ushort subTick, bo if (MoverQuery.TryGetComponent(entity, out var mover)) SetMoveInput(mover, MoveButtons.None); - if (!_mobState.IsIncapacitated(entity)) - HandleDirChange(relayMover.RelayEntity, dir, subTick, state); + if (_mobState.IsDead(entity) + || _mobState.IsCritical(entity) && !_configManager.GetCVar(CCVars.AllowMovementWhileCrit)) + return; + + HandleDirChange(relayMover.RelayEntity, dir, subTick, state); return; } diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 43a63068cf..46ee949a4e 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -125,9 +125,10 @@ protected void HandleMobMovement( var canMove = mover.CanMove; if (RelayTargetQuery.TryGetComponent(uid, out var relayTarget)) { - if (_mobState.IsIncapacitated(relayTarget.Source) || - TryComp(relayTarget.Source, out _) || - !MoverQuery.TryGetComponent(relayTarget.Source, out var relayedMover)) + if (_mobState.IsDead(relayTarget.Source) + || TryComp(relayTarget.Source, out _) + || !MoverQuery.TryGetComponent(relayTarget.Source, out var relayedMover) + || _mobState.IsCritical(relayTarget.Source) && !_configManager.GetCVar(CCVars.AllowMovementWhileCrit)) { canMove = false; } From 9430b9046a9a40cc2f96bb3c66251aabbaf9e80a Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 26 Dec 2024 03:50:37 +0000 Subject: [PATCH 10/10] Automatic Changelog Update (#1370) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 95604a1e21..1e832dea29 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8787,3 +8787,13 @@ Entries: id: 6591 time: '2024-12-22T19:57:10.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1334 +- author: VMSolidus + changes: + - type: Add + message: >- + Added server config options for basic "Soft-Crit". When enabled, + characters who are critically injured can still slowly crawl, but are + otherwise still helpless and dying. + id: 6592 + time: '2024-12-26T03:50:10.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1370