mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-02-14 23:14:45 +01:00
[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:
committed by
GitHub
parent
267357a4b0
commit
bbc519c523
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user