Revert "Fix unintentional inventory relayed event handling " (#12182)

This commit is contained in:
Emisse
2022-10-24 09:06:04 -06:00
committed by GitHub
parent 145471be2d
commit 80fd37041f
9 changed files with 15 additions and 53 deletions

View File

@@ -1,8 +1,7 @@
using Content.Shared.Damage; using Content.Shared.Damage;
using Content.Server.Examine; using Content.Server.Examine;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Robust.Shared.Utility; using Robust.Shared.Utility;
using Content.Shared.Inventory;
namespace Content.Server.Armor namespace Content.Server.Armor
{ {
@@ -15,13 +14,13 @@ namespace Content.Server.Armor
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<ArmorComponent, InventoryRelayedEvent<DamageModifyEvent>>(OnDamageModify); SubscribeLocalEvent<ArmorComponent, DamageModifyEvent>(OnDamageModify);
SubscribeLocalEvent<ArmorComponent, GetVerbsEvent<ExamineVerb>>(OnArmorVerbExamine); SubscribeLocalEvent<ArmorComponent, GetVerbsEvent<ExamineVerb>>(OnArmorVerbExamine);
} }
private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent<DamageModifyEvent> args) private void OnDamageModify(EntityUid uid, ArmorComponent component, DamageModifyEvent args)
{ {
args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers); args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, component.Modifiers);
} }
private void OnArmorVerbExamine(EntityUid uid, ArmorComponent component, GetVerbsEvent<ExamineVerb> args) private void OnArmorVerbExamine(EntityUid uid, ArmorComponent component, GetVerbsEvent<ExamineVerb> args)

View File

@@ -8,7 +8,6 @@ using Content.Shared.Damage;
using Content.Shared.Database; using Content.Shared.Database;
using Content.Shared.Explosion; using Content.Shared.Explosion;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Inventory;
using Content.Shared.Throwing; using Content.Shared.Throwing;
using Robust.Server.Player; using Robust.Server.Player;
using Robust.Shared.Audio; using Robust.Shared.Audio;
@@ -64,10 +63,6 @@ public sealed partial class ExplosionSystem : EntitySystem
SubscribeLocalEvent<GridRemovalEvent>(OnGridRemoved); SubscribeLocalEvent<GridRemovalEvent>(OnGridRemoved);
SubscribeLocalEvent<GridStartupEvent>(OnGridStartup); SubscribeLocalEvent<GridStartupEvent>(OnGridStartup);
SubscribeLocalEvent<ExplosionResistanceComponent, GetExplosionResistanceEvent>(OnGetResistance); SubscribeLocalEvent<ExplosionResistanceComponent, GetExplosionResistanceEvent>(OnGetResistance);
// as long as explosion-resistance mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer).
SubscribeLocalEvent<ExplosionResistanceComponent, InventoryRelayedEvent<GetExplosionResistanceEvent>>((e, c, ev) => OnGetResistance(e, c, ev.Args));
SubscribeLocalEvent<TileChangedEvent>(OnTileChanged); SubscribeLocalEvent<TileChangedEvent>(OnTileChanged);
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnReset); SubscribeLocalEvent<RoundRestartCleanupEvent>(OnReset);

View File

@@ -1,5 +1,4 @@
using Content.Shared.Examine; using Content.Shared.Examine;
using Content.Shared.Inventory;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Robust.Shared.Containers; using Robust.Shared.Containers;
@@ -20,7 +19,7 @@ public sealed class ClothingSpeedModifierSystem : EntitySystem
SubscribeLocalEvent<ClothingSpeedModifierComponent, ComponentGetState>(OnGetState); SubscribeLocalEvent<ClothingSpeedModifierComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<ClothingSpeedModifierComponent, ComponentHandleState>(OnHandleState); SubscribeLocalEvent<ClothingSpeedModifierComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<ClothingSpeedModifierComponent, InventoryRelayedEvent<RefreshMovementSpeedModifiersEvent>>(OnRefreshMoveSpeed); SubscribeLocalEvent<ClothingSpeedModifierComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMoveSpeed);
SubscribeLocalEvent<ClothingSpeedModifierComponent, GetVerbsEvent<ExamineVerb>>(OnClothingVerbExamine); SubscribeLocalEvent<ClothingSpeedModifierComponent, GetVerbsEvent<ExamineVerb>>(OnClothingVerbExamine);
} }
@@ -66,12 +65,12 @@ public sealed class ClothingSpeedModifierSystem : EntitySystem
} }
} }
private void OnRefreshMoveSpeed(EntityUid uid, ClothingSpeedModifierComponent component, InventoryRelayedEvent<RefreshMovementSpeedModifiersEvent> args) private void OnRefreshMoveSpeed(EntityUid uid, ClothingSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args)
{ {
if (!component.Enabled) if (!component.Enabled)
return; return;
args.Args.ModifySpeed(component.WalkModifier, component.SprintModifier); args.ModifySpeed(component.WalkModifier, component.SprintModifier);
} }
private void OnClothingVerbExamine(EntityUid uid, ClothingSpeedModifierComponent component, GetVerbsEvent<ExamineVerb> args) private void OnClothingVerbExamine(EntityUid uid, ClothingSpeedModifierComponent component, GetVerbsEvent<ExamineVerb> args)

View File

@@ -24,7 +24,7 @@ public abstract class SharedMagbootsSystem : EntitySystem
base.Initialize(); base.Initialize();
SubscribeLocalEvent<MagbootsComponent, GetVerbsEvent<ActivationVerb>>(AddToggleVerb); SubscribeLocalEvent<MagbootsComponent, GetVerbsEvent<ActivationVerb>>(AddToggleVerb);
SubscribeLocalEvent<MagbootsComponent, InventoryRelayedEvent<SlipAttemptEvent>>(OnSlipAttempt); SubscribeLocalEvent<MagbootsComponent, SlipAttemptEvent>(OnSlipAttempt);
SubscribeLocalEvent<MagbootsComponent, GetItemActionsEvent>(OnGetActions); SubscribeLocalEvent<MagbootsComponent, GetItemActionsEvent>(OnGetActions);
SubscribeLocalEvent<MagbootsComponent, ToggleActionEvent>(OnToggleAction); SubscribeLocalEvent<MagbootsComponent, ToggleActionEvent>(OnToggleAction);
} }
@@ -72,10 +72,10 @@ public abstract class SharedMagbootsSystem : EntitySystem
args.Verbs.Add(verb); args.Verbs.Add(verb);
} }
private void OnSlipAttempt(EntityUid uid, MagbootsComponent component, InventoryRelayedEvent<SlipAttemptEvent> args) private void OnSlipAttempt(EntityUid uid, MagbootsComponent component, SlipAttemptEvent args)
{ {
if (component.On) if (component.On)
args.Args.Cancel(); args.Cancel();
} }
private void OnGetActions(EntityUid uid, MagbootsComponent component, GetItemActionsEvent args) private void OnGetActions(EntityUid uid, MagbootsComponent component, GetItemActionsEvent args)

View File

@@ -1,4 +1,3 @@
using Content.Shared.Inventory;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
namespace Content.Shared.Electrocution namespace Content.Shared.Electrocution
@@ -10,8 +9,6 @@ namespace Content.Shared.Electrocution
base.Initialize(); base.Initialize();
SubscribeLocalEvent<InsulatedComponent, ElectrocutionAttemptEvent>(OnInsulatedElectrocutionAttempt); SubscribeLocalEvent<InsulatedComponent, ElectrocutionAttemptEvent>(OnInsulatedElectrocutionAttempt);
// as long as legally distinct electric-mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer).
SubscribeLocalEvent<InsulatedComponent, InventoryRelayedEvent<ElectrocutionAttemptEvent>>((e, c, ev) => OnInsulatedElectrocutionAttempt(e, c, ev.Args));
SubscribeLocalEvent<InsulatedComponent, ComponentGetState>(OnInsulatedGetState); SubscribeLocalEvent<InsulatedComponent, ComponentGetState>(OnInsulatedGetState);
SubscribeLocalEvent<InsulatedComponent, ComponentHandleState>(OnInsulatedHandleState); SubscribeLocalEvent<InsulatedComponent, ComponentHandleState>(OnInsulatedHandleState);
} }

View File

@@ -1,5 +1,4 @@
using Content.Shared.IdentityManagement.Components; using Content.Shared.IdentityManagement.Components;
using Content.Shared.Inventory;
using Robust.Shared.Containers; using Robust.Shared.Containers;
namespace Content.Shared.IdentityManagement; namespace Content.Shared.IdentityManagement;
@@ -15,7 +14,6 @@ public abstract class SharedIdentitySystem : EntitySystem
SubscribeLocalEvent<IdentityComponent, ComponentInit>(OnComponentInit); SubscribeLocalEvent<IdentityComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<IdentityBlockerComponent, SeeIdentityAttemptEvent>(OnSeeIdentity); SubscribeLocalEvent<IdentityBlockerComponent, SeeIdentityAttemptEvent>(OnSeeIdentity);
SubscribeLocalEvent<IdentityBlockerComponent, InventoryRelayedEvent<SeeIdentityAttemptEvent>>((e, c, ev) => OnSeeIdentity(e, c, ev.Args));
} }
private void OnSeeIdentity(EntityUid uid, IdentityBlockerComponent component, SeeIdentityAttemptEvent args) private void OnSeeIdentity(EntityUid uid, IdentityBlockerComponent component, SeeIdentityAttemptEvent args)

View File

@@ -23,38 +23,15 @@ public partial class InventorySystem
protected void RelayInventoryEvent<T>(EntityUid uid, InventoryComponent component, T args) where T : EntityEventArgs, IInventoryRelayEvent protected void RelayInventoryEvent<T>(EntityUid uid, InventoryComponent component, T args) where T : EntityEventArgs, IInventoryRelayEvent
{ {
if (args.TargetSlots == SlotFlags.NONE)
return;
var containerEnumerator = new ContainerSlotEnumerator(uid, component.TemplateId, _prototypeManager, this, args.TargetSlots); var containerEnumerator = new ContainerSlotEnumerator(uid, component.TemplateId, _prototypeManager, this, args.TargetSlots);
var ev = new InventoryRelayedEvent<T>(args); while(containerEnumerator.MoveNext(out var container))
while (containerEnumerator.MoveNext(out var container))
{ {
if (!container.ContainedEntity.HasValue) continue; if(!container.ContainedEntity.HasValue) continue;
RaiseLocalEvent(container.ContainedEntity.Value, ev, false); RaiseLocalEvent(container.ContainedEntity.Value, args, false);
} }
} }
} }
/// <summary>
/// Event wrapper for relayed events.
/// </summary>
/// <remarks>
/// This avoids nested inventory relays, and makes it easy to have certain events only handled by the initial
/// target entity. E.g. health based movement speed modifiers should not be handled by a hat, even if that hat
/// happens to be a dead mouse. Clothing that wishes to modify movement speed must subscribe to
/// InventoryRelayedEvent<RefreshMovementSpeedModifiersEvent>
/// </remarks>
public sealed class InventoryRelayedEvent<TEvent> : EntityEventArgs where TEvent : EntityEventArgs, IInventoryRelayEvent
{
public readonly TEvent Args;
public InventoryRelayedEvent(TEvent args)
{
Args = args;
}
}
/// <summary> /// <summary>
/// Events that should be relayed to inventory slots should implement this interface. /// Events that should be relayed to inventory slots should implement this interface.
/// </summary> /// </summary>

View File

@@ -30,8 +30,6 @@ namespace Content.Shared.Slippery
SubscribeLocalEvent<SlipperyComponent, StepTriggerAttemptEvent>(HandleAttemptCollide); SubscribeLocalEvent<SlipperyComponent, StepTriggerAttemptEvent>(HandleAttemptCollide);
SubscribeLocalEvent<SlipperyComponent, StepTriggeredEvent>(HandleStepTrigger); SubscribeLocalEvent<SlipperyComponent, StepTriggeredEvent>(HandleStepTrigger);
SubscribeLocalEvent<NoSlipComponent, SlipAttemptEvent>(OnNoSlipAttempt); SubscribeLocalEvent<NoSlipComponent, SlipAttemptEvent>(OnNoSlipAttempt);
// as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer).
SubscribeLocalEvent<NoSlipComponent, InventoryRelayedEvent<SlipAttemptEvent>>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args));
SubscribeLocalEvent<SlipperyComponent, ComponentGetState>(OnSlipperyGetState); SubscribeLocalEvent<SlipperyComponent, ComponentGetState>(OnSlipperyGetState);
SubscribeLocalEvent<SlipperyComponent, ComponentHandleState>(OnSlipperyHandleState); SubscribeLocalEvent<SlipperyComponent, ComponentHandleState>(OnSlipperyHandleState);
} }

View File

@@ -11,7 +11,6 @@ public sealed class ThievingSystem : EntitySystem
base.Initialize(); base.Initialize();
SubscribeLocalEvent<ThievingComponent, BeforeStripEvent>(OnBeforeStrip); SubscribeLocalEvent<ThievingComponent, BeforeStripEvent>(OnBeforeStrip);
SubscribeLocalEvent<ThievingComponent, InventoryRelayedEvent<BeforeStripEvent>>((e, c, ev) => OnBeforeStrip(e, c, ev.Args));
} }
private void OnBeforeStrip(EntityUid uid, ThievingComponent component, BeforeStripEvent args) private void OnBeforeStrip(EntityUid uid, ThievingComponent component, BeforeStripEvent args)