[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:
parent
be5022a069
commit
862675e71b
|
|
@ -4,6 +4,7 @@ using Content.Server.Destructible;
|
||||||
using Content.Server.Effects;
|
using Content.Server.Effects;
|
||||||
using Content.Server.Weapons.Ranged.Systems;
|
using Content.Server.Weapons.Ranged.Systems;
|
||||||
using Content.Shared.Camera;
|
using Content.Shared.Camera;
|
||||||
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Damage.Components;
|
using Content.Shared.Damage.Components;
|
||||||
using Content.Shared.Damage.Systems;
|
using Content.Shared.Damage.Systems;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
|
|
@ -69,52 +70,12 @@ public sealed class ProjectileSystem : SharedProjectileSystem
|
||||||
LogImpact.Medium,
|
LogImpact.Medium,
|
||||||
$"Projectile {ToPrettyString(uid):projectile} shot by {ToPrettyString(component.Shooter!.Value):user} hit {otherName:target} and dealt {damage:damage} damage");
|
$"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.
|
component.ProjectileSpent = !TryPenetrate((uid, component), damage, damageRequired, target); // DeltaV - Addition of the NT-3
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
component.ProjectileSpent = true;
|
component.ProjectileSpent = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!deleted)
|
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));
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue