From bbc519c523d7ea3031d591830839e954449c835c Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 3 Jan 2026 11:33:28 -0800 Subject: [PATCH] [STAGING] Fix Disabler SMG bolts going through walls (#42195) * RAH RAH RASPUTIN LOVER OF THE RUSSIAN QUEEN! * delete if we do 0 damage * actually change that * dont get soaped into cleaning things up challenge impossible --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- .../Projectiles/ProjectileSystem.cs | 82 ++++++++++--------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/Content.Server/Projectiles/ProjectileSystem.cs b/Content.Server/Projectiles/ProjectileSystem.cs index 28df1eb42d..01fe80e094 100644 --- a/Content.Server/Projectiles/ProjectileSystem.cs +++ b/Content.Server/Projectiles/ProjectileSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Destructible; using Content.Server.Effects; using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Camera; +using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Database; @@ -68,45 +69,11 @@ public sealed class ProjectileSystem : SharedProjectileSystem LogImpact.Medium, $"Projectile {ToPrettyString(uid):projectile} shot by {ToPrettyString(component.Shooter!.Value):user} hit {otherName:target} and dealt {damage:damage} damage"); - // If penetration is to be considered, we need to do some checks to see if the projectile should stop. - if (component.PenetrationThreshold != 0) - { - // If a damage type is required, stop the bullet if the hit entity doesn't have that type. - if (component.PenetrationDamageTypeRequirement != null) - { - var stopPenetration = false; - foreach (var requiredDamageType in component.PenetrationDamageTypeRequirement) - { - if (!damage.DamageDict.Keys.Contains(requiredDamageType)) - { - stopPenetration = true; - break; - } - } - if (stopPenetration) - component.ProjectileSpent = true; - } - - // If the object won't be destroyed, it "tanks" the penetration hit. - if (damage.GetTotal() < damageRequired) - { - component.ProjectileSpent = true; - } - - if (!component.ProjectileSpent) - { - component.PenetrationAmount += damageRequired; - // The projectile has dealt enough damage to be spent. - if (component.PenetrationAmount >= component.PenetrationThreshold) - { - component.ProjectileSpent = true; - } - } - } - else - { - component.ProjectileSpent = true; - } + component.ProjectileSpent = !TryPenetrate((uid, component), damage, damageRequired); + } + else + { + component.ProjectileSpent = true; } if (!deleted) @@ -125,4 +92,41 @@ public sealed class ProjectileSystem : SharedProjectileSystem RaiseNetworkEvent(new ImpactEffectEvent(component.ImpactEffect, GetNetCoordinates(xform.Coordinates)), Filter.Pvs(xform.Coordinates, entityMan: EntityManager)); } } + + private bool TryPenetrate(Entity projectile, DamageSpecifier damage, FixedPoint2 damageRequired) + { + // If penetration is to be considered, we need to do some checks to see if the projectile should stop. + if (projectile.Comp.PenetrationThreshold == 0) + return false; + + // If a damage type is required, stop the bullet if the hit entity doesn't have that type. + if (projectile.Comp.PenetrationDamageTypeRequirement != null) + { + foreach (var requiredDamageType in projectile.Comp.PenetrationDamageTypeRequirement) + { + if (damage.DamageDict.Keys.Contains(requiredDamageType)) + continue; + + return false; + } + } + + // If the object won't be destroyed, it "tanks" the penetration hit. + if (damage.GetTotal() < damageRequired) + { + return false; + } + + if (!projectile.Comp.ProjectileSpent) + { + projectile.Comp.PenetrationAmount += damageRequired; + // The projectile has dealt enough damage to be spent. + if (projectile.Comp.PenetrationAmount >= projectile.Comp.PenetrationThreshold) + { + return false; + } + } + + return true; + } } -- 2.52.0