[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 BarryNorfolk
parent be5022a069
commit 862675e71b
1 changed files with 51 additions and 45 deletions

View File

@ -4,6 +4,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;
@ -69,52 +70,12 @@ 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;
}
var pierceEv = new ProjectilePierceEvent(target, damageRequired); // DeltaV - Addition of the NT-3
RaiseLocalEvent(uid, ref pierceEv);
// 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;
}
}
if (component.ProjectileSpent && pierceEv.Pierced) // DeltaV - Addition of the NT-3
component.ProjectileSpent = false;
component.ProjectileSpent = !TryPenetrate((uid, component), damage, damageRequired, target); // DeltaV - Addition of the NT-3
}
else
{
component.ProjectileSpent = true;
}
}
if (!deleted)
{
@ -132,4 +93,49 @@ 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, EntityUid target) // DeltaV - Addition of the NT-3
{
// 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;
}
}
var pierceEv = new ProjectilePierceEvent(target, damageRequired); // DeltaV - Addition of the NT-3
RaiseLocalEvent(projectile, ref pierceEv);
// 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;
}
if (projectile.Comp.ProjectileSpent && pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
return true;
}
}
return true;
}
}