diff --git a/Content.Shared/Blocking/BlockingSystem.User.cs b/Content.Shared/Blocking/BlockingSystem.User.cs index 106a06cc295..2f5c6c8cacd 100644 --- a/Content.Shared/Blocking/BlockingSystem.User.cs +++ b/Content.Shared/Blocking/BlockingSystem.User.cs @@ -4,6 +4,8 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Content.Shared.Blocking.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; namespace Content.Shared.Blocking; @@ -12,6 +14,8 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono [Dependency] private DamageableSystem _damageable = default!; [Dependency] private SharedAudioSystem _audio = default!; + [Dependency] private EntityQuery _physQuery = default!; + private void InitializeUser() { SubscribeLocalEvent(OnUserDamageModified); @@ -43,38 +47,43 @@ private void OnAnchorChanged(EntityUid uid, BlockingUserComponent component, ref private void OnUserDamageModified(EntityUid uid, BlockingUserComponent component, DamageModifyEvent args) { - if (TryComp(component.BlockingItem, out var blocking)) // Mono + if (!TryComp(component.BlockingItem, out var blocking)) // Mono + return; + + if (args.Origin is { } origin // mono + && Math.Abs(Angle.ShortestDistance(_transformSystem.GetWorldRotation(uid), _transformSystem.GetWorldRotation(origin).Opposite()).Degrees) >= blocking.BlockingArc/2) + return; + + if (args.Damage.GetTotal() <= 0) + return; + + // A shield should only block damage it can itself absorb. To determine that we need the Damageable component on it. + if (!TryComp(component.BlockingItem, out var dmgComp)) + return; + + if (TryComp(component.BlockingItem, out var toggleComponent) && !toggleComponent.Activated) // Mono + return; + + var blockFraction = blocking.IsBlocking ? blocking.ActiveBlockFraction : blocking.PassiveBlockFraction; + blockFraction = Math.Clamp(blockFraction, 0, 1); + _damageable.TryChangeDamage(component.BlockingItem, + blockFraction * args.OriginalDamage, + armorPenetration: args.ArmorPenetration); // Goob edit + + var modify = new DamageModifierSet(); + foreach (var key in dmgComp.Damage.DamageDict.Keys) + { + modify.Coefficients.TryAdd(key, 1 - blockFraction); + } + + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, + DamageSpecifier.PenetrateArmor(modify ,args.ArmorPenetration)); // Goob edit + + if (blocking.IsBlocking && !args.Damage.Equals(args.OriginalDamage)) { - if (args.Damage.GetTotal() <= 0) - return; - - // A shield should only block damage it can itself absorb. To determine that we need the Damageable component on it. - if (!TryComp(component.BlockingItem, out var dmgComp)) - return; - - if (TryComp(component.BlockingItem, out var toggleComponent) && !toggleComponent.Activated) // Mono - return; - - var blockFraction = blocking.IsBlocking ? blocking.ActiveBlockFraction : blocking.PassiveBlockFraction; - blockFraction = Math.Clamp(blockFraction, 0, 1); - _damageable.TryChangeDamage(component.BlockingItem, - blockFraction * args.OriginalDamage, - armorPenetration: args.ArmorPenetration); // Goob edit - - var modify = new DamageModifierSet(); - foreach (var key in dmgComp.Damage.DamageDict.Keys) - { - modify.Coefficients.TryAdd(key, 1 - blockFraction); - } - - args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, - DamageSpecifier.PenetrateArmor(modify ,args.ArmorPenetration)); // Goob edit - - if (blocking.IsBlocking && !args.Damage.Equals(args.OriginalDamage)) - { - _audio.PlayPvs(blocking.BlockSound, uid); - } + _audio.PlayPvs(blocking.BlockSound, uid); } + } private void OnDamageModified(EntityUid uid, BlockingComponent component, DamageModifyEvent args) diff --git a/Content.Shared/Blocking/Components/BlockingComponent.cs b/Content.Shared/Blocking/Components/BlockingComponent.cs index 1de29de8a52..af0b631fb9c 100644 --- a/Content.Shared/Blocking/Components/BlockingComponent.cs +++ b/Content.Shared/Blocking/Components/BlockingComponent.cs @@ -90,4 +90,11 @@ public sealed partial class BlockingComponent : Component /// [DataField] public bool IsClothing = false; + + /// + /// Mono - Projectiles will be blocked only + /// if it's in the arc of blocking user. + /// + [DataField] + public float BlockingArc = 105f; } diff --git a/Resources/Prototypes/Entities/Objects/Shields/shields.yml b/Resources/Prototypes/Entities/Objects/Shields/shields.yml index 5bef34f6b55..5fe0001f96a 100644 --- a/Resources/Prototypes/Entities/Objects/Shields/shields.yml +++ b/Resources/Prototypes/Entities/Objects/Shields/shields.yml @@ -430,6 +430,7 @@ reflects: - Energy - type: Blocking + blockingArc: 75 # Smaller than other shields. Mono edit. passiveBlockModifier: coefficients: Blunt: 1.0 @@ -459,9 +460,6 @@ autoRechargeRate: 5 - type: RechargeableBlocking # WD EDIT END - - type: ClothingSpeedModifier # Mono - sprintModifier: 0.9 - - type: HeldSpeedModifier - type: entity name: broken energy shield diff --git a/Resources/Prototypes/_Mono/Entities/Objects/Shields/shields.yml b/Resources/Prototypes/_Mono/Entities/Objects/Shields/shields.yml index 989e4fcbfab..2deb7eac5a3 100644 --- a/Resources/Prototypes/_Mono/Entities/Objects/Shields/shields.yml +++ b/Resources/Prototypes/_Mono/Entities/Objects/Shields/shields.yml @@ -95,7 +95,7 @@ sprite: _Mono/Objects/Weapons/Melee/shields.rsi state: heavy-icon - type: Item - size: Ginormous + size: Huge sprite: _Mono/Objects/Weapons/Melee/shields.rsi heldPrefix: heavy - type: Damageable @@ -106,18 +106,19 @@ Blunt: 0.35 Slash: 0.35 Piercing: 0.20 - Heat: 0.35 + Heat: 0.45 Shock: 0.35 passiveBlockFraction: 1 + blockingArc: 135 - type: ClothingSpeedModifier - sprintModifier: 0.3 - walkModifier: 0.5 + sprintModifier: 0.55 + walkModifier: 0.8 - type: HeldSpeedModifier - type: Destructible thresholds: - trigger: !type:DamageTrigger - damage: 200 + damage: 180 behaviors: - !type:DoActsBehavior acts: [ "Destruction" ]