Shards damage barefoot users + steptrigger-related general cleanup (#9585)
This commit is contained in:
@@ -5,6 +5,7 @@ using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Slippery;
|
||||
using Content.Shared.StepTrigger;
|
||||
using Content.Shared.StepTrigger.Systems;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Map;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ using Content.Shared.Damage;
|
||||
namespace Content.Server.Damage.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed class DamageOnTriggerComponent : Component
|
||||
public sealed class DamageUserOnTriggerComponent : Component
|
||||
{
|
||||
[DataField("ignoreResistances")] public bool IgnoreResistances;
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
using Content.Server.Damage.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.StepTrigger;
|
||||
|
||||
namespace Content.Server.Damage.Systems;
|
||||
|
||||
// System for damage that occurs on specific triggers.
|
||||
// This is originally meant for mousetraps, but could
|
||||
// probably be extended to fit other triggers as well.
|
||||
public sealed class DamageOnTriggerSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<DamageOnTriggerComponent, StepTriggeredEvent>(OnStepTrigger);
|
||||
}
|
||||
|
||||
private void OnStepTrigger(EntityUid uid, DamageOnTriggerComponent component, ref StepTriggeredEvent args)
|
||||
{
|
||||
OnDamageTrigger(uid, args.Tripper, component);
|
||||
}
|
||||
|
||||
private void OnDamageTrigger(EntityUid source, EntityUid target, DamageOnTriggerComponent? component = null)
|
||||
{
|
||||
if (!Resolve(source, ref component))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var damage = new DamageSpecifier(component.Damage);
|
||||
var ev = new BeforeDamageOnTriggerEvent(damage, target);
|
||||
RaiseLocalEvent(source, ev, true);
|
||||
|
||||
_damageableSystem.TryChangeDamage(target, ev.Damage, component.IgnoreResistances);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class BeforeDamageOnTriggerEvent : EntityEventArgs
|
||||
{
|
||||
public DamageSpecifier Damage { get; set; }
|
||||
public EntityUid Tripper { get; }
|
||||
|
||||
public BeforeDamageOnTriggerEvent(DamageSpecifier damage, EntityUid target)
|
||||
{
|
||||
Damage = damage;
|
||||
Tripper = target;
|
||||
}
|
||||
}
|
||||
52
Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs
Normal file
52
Content.Server/Damage/Systems/DamageUserOnTriggerSystem.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using Content.Server.Damage.Components;
|
||||
using Content.Server.Explosion.EntitySystems;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.StepTrigger;
|
||||
using Content.Shared.StepTrigger.Systems;
|
||||
|
||||
namespace Content.Server.Damage.Systems;
|
||||
|
||||
// System for damage that occurs on specific trigger, towards the user..
|
||||
public sealed class DamageUserOnTriggerSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<DamageUserOnTriggerComponent, TriggerEvent>(OnTrigger);
|
||||
}
|
||||
|
||||
private void OnTrigger(EntityUid uid, DamageUserOnTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
if (args.User is null)
|
||||
return;
|
||||
|
||||
args.Handled |= OnDamageTrigger(uid, args.User.Value, component);
|
||||
}
|
||||
|
||||
private bool OnDamageTrigger(EntityUid source, EntityUid target, DamageUserOnTriggerComponent? component = null)
|
||||
{
|
||||
if (!Resolve(source, ref component))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var damage = new DamageSpecifier(component.Damage);
|
||||
var ev = new BeforeDamageUserOnTriggerEvent(damage, target);
|
||||
RaiseLocalEvent(source, ev);
|
||||
|
||||
return _damageableSystem.TryChangeDamage(target, ev.Damage, component.IgnoreResistances) is not null;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class BeforeDamageUserOnTriggerEvent : EntityEventArgs
|
||||
{
|
||||
public DamageSpecifier Damage { get; set; }
|
||||
public EntityUid Tripper { get; }
|
||||
|
||||
public BeforeDamageUserOnTriggerEvent(DamageSpecifier damage, EntityUid target)
|
||||
{
|
||||
Damage = damage;
|
||||
Tripper = target;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Content.Server.Explosion.Components;
|
||||
|
||||
/// <summary>
|
||||
/// This is used for entities that want the more generic 'trigger' behavior after a step trigger occurs.
|
||||
/// Not done by default, since it's not useful for everything and might cause weird behavior. But it is useful for a lot of stuff like mousetraps.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed class TriggerOnStepTriggerComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -14,6 +14,7 @@ using Content.Shared.Trigger;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Explosion;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.StepTrigger.Systems;
|
||||
|
||||
namespace Content.Server.Explosion.EntitySystems
|
||||
{
|
||||
@@ -52,6 +53,7 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
|
||||
SubscribeLocalEvent<TriggerOnCollideComponent, StartCollideEvent>(OnTriggerCollide);
|
||||
SubscribeLocalEvent<TriggerOnActivateComponent, ActivateInWorldEvent>(OnActivate);
|
||||
SubscribeLocalEvent<TriggerOnStepTriggerComponent, StepTriggeredEvent>(OnStepTriggered);
|
||||
|
||||
SubscribeLocalEvent<DeleteOnTriggerComponent, TriggerEvent>(HandleDeleteTrigger);
|
||||
SubscribeLocalEvent<ExplodeOnTriggerComponent, TriggerEvent>(HandleExplodeTrigger);
|
||||
@@ -91,6 +93,11 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredEvent args)
|
||||
{
|
||||
Trigger(uid, args.Tripper);
|
||||
}
|
||||
|
||||
public bool Trigger(EntityUid trigger, EntityUid? user = null)
|
||||
{
|
||||
var triggerEvent = new TriggerEvent(trigger, user);
|
||||
|
||||
@@ -5,6 +5,8 @@ using Content.Shared.Examine;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Fluids;
|
||||
using Content.Shared.StepTrigger;
|
||||
using Content.Shared.StepTrigger.Components;
|
||||
using Content.Shared.StepTrigger.Systems;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
@@ -3,6 +3,4 @@
|
||||
[RegisterComponent]
|
||||
public sealed class LandMineComponent : Component
|
||||
{
|
||||
[DataField("deleteOnActivate")]
|
||||
public bool DeleteOnActivate = true;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Server.Explosion.EntitySystems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.StepTrigger;
|
||||
using Content.Shared.StepTrigger.Systems;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Server.LandMines;
|
||||
@@ -27,6 +28,8 @@ public sealed class LandMineSystem : EntitySystem
|
||||
|
||||
private void HandleTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredEvent args)
|
||||
{
|
||||
// This doesn't use TriggerOnStepTrigger since we don't want to display the popup if nothing happens
|
||||
// and I didn't feel like making an `AfterTrigger` event
|
||||
if (_trigger.Trigger(uid, args.Tripper))
|
||||
{
|
||||
_popupSystem.PopupCoordinates(
|
||||
@@ -35,9 +38,6 @@ public sealed class LandMineSystem : EntitySystem
|
||||
Filter.Entities(args.Tripper),
|
||||
PopupType.LargeCaution);
|
||||
}
|
||||
|
||||
if (component.DeleteOnActivate)
|
||||
QueueDel(uid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,4 @@ public sealed class MousetrapComponent : Component
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("massBalance")]
|
||||
public int MassBalance = 10;
|
||||
|
||||
[DataField("ignoreDamageIfInventorySlotsFilled")]
|
||||
public List<string> IgnoreDamageIfSlotFilled = new();
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Mousetrap;
|
||||
using Content.Shared.StepTrigger;
|
||||
using Content.Shared.StepTrigger.Systems;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Server.Mousetrap;
|
||||
@@ -18,9 +19,9 @@ public sealed class MousetrapSystem : EntitySystem
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<MousetrapComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<MousetrapComponent, BeforeDamageOnTriggerEvent>(BeforeDamageOnTrigger);
|
||||
SubscribeLocalEvent<MousetrapComponent, BeforeDamageUserOnTriggerEvent>(BeforeDamageOnTrigger);
|
||||
SubscribeLocalEvent<MousetrapComponent, StepTriggerAttemptEvent>(OnStepTriggerAttempt);
|
||||
SubscribeLocalEvent<MousetrapComponent, StepTriggeredEvent>(OnStepTrigger);
|
||||
SubscribeLocalEvent<MousetrapComponent, TriggerEvent>(OnTrigger);
|
||||
}
|
||||
|
||||
private void OnUseInHand(EntityUid uid, MousetrapComponent component, UseInHandEvent args)
|
||||
@@ -37,27 +38,11 @@ public sealed class MousetrapSystem : EntitySystem
|
||||
|
||||
private void OnStepTriggerAttempt(EntityUid uid, MousetrapComponent component, ref StepTriggerAttemptEvent args)
|
||||
{
|
||||
args.Continue = component.IsActive;
|
||||
args.Continue |= component.IsActive;
|
||||
}
|
||||
|
||||
private void BeforeDamageOnTrigger(EntityUid uid, MousetrapComponent component, BeforeDamageOnTriggerEvent args)
|
||||
private void BeforeDamageOnTrigger(EntityUid uid, MousetrapComponent component, BeforeDamageUserOnTriggerEvent args)
|
||||
{
|
||||
foreach (var slot in component.IgnoreDamageIfSlotFilled)
|
||||
{
|
||||
if (!_inventorySystem.TryGetSlotContainer(args.Tripper, slot, out var container, out _))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// This also means that wearing slippers won't
|
||||
// hurt the entity.
|
||||
if (container.ContainedEntity != null)
|
||||
{
|
||||
args.Damage *= 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (TryComp(args.Tripper, out PhysicsComponent? physics) && physics.Mass != 0)
|
||||
{
|
||||
// The idea here is inverse,
|
||||
@@ -69,11 +54,9 @@ public sealed class MousetrapSystem : EntitySystem
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStepTrigger(EntityUid uid, MousetrapComponent component, ref StepTriggeredEvent args)
|
||||
private void OnTrigger(EntityUid uid, MousetrapComponent component, TriggerEvent args)
|
||||
{
|
||||
component.IsActive = false;
|
||||
_triggerSystem.Trigger(uid);
|
||||
|
||||
UpdateVisuals(uid);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user