[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>
This commit is contained in:
Princess Cheeseballs
2026-01-03 11:33:28 -08:00
committed by GitHub
parent 267357a4b0
commit bbc519c523

View File

@@ -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<ProjectileComponent> 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;
}
}