Selectively revert gun penetration (#25551)
The collision layer check doesn't work and I don't have time to fix it.
This commit is contained in:
@@ -1,42 +0,0 @@
|
|||||||
using Content.Shared.FixedPoint;
|
|
||||||
using Content.Shared.Physics;
|
|
||||||
using Robust.Shared.GameStates;
|
|
||||||
|
|
||||||
namespace Content.Shared.Projectiles;
|
|
||||||
|
|
||||||
[RegisterComponent, NetworkedComponent]
|
|
||||||
public sealed partial class CanPenetrateComponent : Component
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Should the projectile keep the ability to deal damage after colliding.
|
|
||||||
/// </summary>
|
|
||||||
[DataField]
|
|
||||||
public bool DamageAfterCollide = true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The CollisionLayer, up to and including the one set, the projectile is allowed to penetrate.
|
|
||||||
/// </summary>
|
|
||||||
///<remarks>
|
|
||||||
/// Can penetrate everything if this value is not set.
|
|
||||||
/// </remarks>
|
|
||||||
[DataField]
|
|
||||||
public CollisionGroup? PenetrationLayer;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// How many times the projectile is allowed to deal damage.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// Can deal damage on every collision if this value is not set.
|
|
||||||
/// </remarks>
|
|
||||||
[DataField]
|
|
||||||
public float? PenetrationPower;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Modifies the damage of a projectile after it has penetrated an entity.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// Won't modify the projectile's damage if this value is not set.
|
|
||||||
/// </remarks>
|
|
||||||
[DataField]
|
|
||||||
public FixedPoint2? DamageModifier;
|
|
||||||
}
|
|
||||||
@@ -169,33 +169,6 @@ public abstract partial class SharedProjectileSystem : EntitySystem
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void AfterProjectileHit(EntityUid uid, ProjectileComponent component, ref AfterProjectileHitEvent args)
|
private void AfterProjectileHit(EntityUid uid, ProjectileComponent component, ref AfterProjectileHitEvent args)
|
||||||
{
|
{
|
||||||
if (!TryComp<CanPenetrateComponent>(uid, out var damageAfterCollide))
|
|
||||||
return;
|
|
||||||
|
|
||||||
//Delete the projectile if it hits an entity with a CollisionLayer that has a higher value than it's PenetrationLayer.
|
|
||||||
//This allows a projectile to only penetrate a specific set of entities.
|
|
||||||
if (damageAfterCollide.PenetrationLayer != null)
|
|
||||||
{
|
|
||||||
if (args.Fixture.CollisionLayer > (int) damageAfterCollide.PenetrationLayer ||
|
|
||||||
damageAfterCollide.PenetrationPower == 0)
|
|
||||||
{
|
|
||||||
QueueDel(uid);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Allow the projectile to deal damage again.
|
|
||||||
if(damageAfterCollide.DamageAfterCollide)
|
|
||||||
component.DamagedEntity = false;
|
|
||||||
|
|
||||||
//If the projectile has a limit on the amount of penetrations, reduce it.
|
|
||||||
if (damageAfterCollide.PenetrationPower != null)
|
|
||||||
damageAfterCollide.PenetrationPower -= 1;
|
|
||||||
|
|
||||||
//Apply the penetration damage modifier if the projectile has one.
|
|
||||||
if (damageAfterCollide.DamageModifier != null)
|
|
||||||
component.Damage *= damageAfterCollide.DamageModifier.Value;
|
|
||||||
|
|
||||||
//Overrides the original DeleteOnCollide if the projectile passes all penetration checks.
|
//Overrides the original DeleteOnCollide if the projectile passes all penetration checks.
|
||||||
//This is to prevent having to set DeleteOnCollide to false on every prototype
|
//This is to prevent having to set DeleteOnCollide to false on every prototype
|
||||||
//you want to give the ability to penetrate entities.
|
//you want to give the ability to penetrate entities.
|
||||||
|
|||||||
@@ -12,8 +12,6 @@
|
|||||||
damage:
|
damage:
|
||||||
types:
|
types:
|
||||||
Blunt: 4
|
Blunt: 4
|
||||||
- type: CanPenetrate
|
|
||||||
penetrationLayer: MobLayer
|
|
||||||
- type: StaminaDamageOnCollide
|
- type: StaminaDamageOnCollide
|
||||||
damage: 55
|
damage: 55
|
||||||
- type: TimedDespawn
|
- type: TimedDespawn
|
||||||
@@ -33,8 +31,6 @@
|
|||||||
damage:
|
damage:
|
||||||
types:
|
types:
|
||||||
Piercing: 45
|
Piercing: 45
|
||||||
- type: CanPenetrate
|
|
||||||
penetrationLayer: MobLayer
|
|
||||||
- type: TimedDespawn
|
- type: TimedDespawn
|
||||||
lifetime: 0.25
|
lifetime: 0.25
|
||||||
|
|
||||||
@@ -53,8 +49,6 @@
|
|||||||
types:
|
types:
|
||||||
Blunt: 1
|
Blunt: 1
|
||||||
Heat: 2
|
Heat: 2
|
||||||
- type: CanPenetrate
|
|
||||||
penetrationLayer: MobLayer
|
|
||||||
- type: IgniteOnCollide
|
- type: IgniteOnCollide
|
||||||
fireStacks: 3
|
fireStacks: 3
|
||||||
count: 10
|
count: 10
|
||||||
|
|||||||
@@ -738,7 +738,7 @@
|
|||||||
- type: PointLight
|
- type: PointLight
|
||||||
radius: 3.5
|
radius: 3.5
|
||||||
color: blue
|
color: blue
|
||||||
energy: 0.5
|
energy: 0.5
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BulletCap
|
id: BulletCap
|
||||||
@@ -810,8 +810,6 @@
|
|||||||
mask:
|
mask:
|
||||||
- Impassable
|
- Impassable
|
||||||
- BulletImpassable
|
- BulletImpassable
|
||||||
- type: CanPenetrate
|
|
||||||
penetrationLayer: MobLayer
|
|
||||||
- type: Vapor
|
- type: Vapor
|
||||||
active: true
|
active: true
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
damage:
|
damage:
|
||||||
types:
|
types:
|
||||||
Radiation: 25
|
Radiation: 25
|
||||||
- type: CanPenetrate
|
|
||||||
- type: Physics
|
- type: Physics
|
||||||
- type: Fixtures
|
- type: Fixtures
|
||||||
fixtures:
|
fixtures:
|
||||||
|
|||||||
Reference in New Issue
Block a user