diff --git a/Content.Server/Power/EntitySystems/CableSystem.cs b/Content.Server/Power/EntitySystems/CableSystem.cs index bb5927a7ca..7da6d3e0e1 100644 --- a/Content.Server/Power/EntitySystems/CableSystem.cs +++ b/Content.Server/Power/EntitySystems/CableSystem.cs @@ -26,8 +26,8 @@ public class CableSystem : EntitySystem if (args.Handled) return; - var ev = new CuttingFinishedEvent(uid, args.User); - _toolSystem.UseTool(args.Used, args.User, uid, 0, cable.CuttingDelay, new[] { cable.CuttingQuality }, doAfterCompleteEvent: ev); + var ev = new CuttingFinishedEvent(args.User); + _toolSystem.UseTool(args.Used, args.User, uid, 0, cable.CuttingDelay, new[] { cable.CuttingQuality }, doAfterCompleteEvent: ev, doAfterEventTarget: uid); args.Handled = true; } @@ -57,15 +57,12 @@ public class CableSystem : EntitySystem } } -// TODO: if #5887 gets merged, just use a directed event instead of broadcast-with-target public class CuttingFinishedEvent : EntityEventArgs { - public EntityUid Target; public EntityUid User; - public CuttingFinishedEvent(EntityUid target, EntityUid user) + public CuttingFinishedEvent(EntityUid user) { - Target = target; User = user; } } diff --git a/Content.Server/Tools/ToolSystem.cs b/Content.Server/Tools/ToolSystem.cs index 6d94e3c7fb..aceb354dff 100644 --- a/Content.Server/Tools/ToolSystem.cs +++ b/Content.Server/Tools/ToolSystem.cs @@ -41,15 +41,27 @@ namespace Content.Server.Tools { // Actually finish the tool use! Depending on whether that succeeds or not, either event will be broadcast. if(ToolFinishUse(ev.Uid, ev.UserUid, ev.Fuel)) - RaiseLocalEvent(ev.CompletedEvent); + { + if (ev.EventTarget != null) + RaiseLocalEvent(ev.EventTarget.Value, ev.CompletedEvent, false); + else + RaiseLocalEvent(ev.CompletedEvent); + } else if(ev.CancelledEvent != null) - RaiseLocalEvent(ev.CancelledEvent); + { + if (ev.EventTarget != null) + RaiseLocalEvent(ev.EventTarget.Value, ev.CancelledEvent, false); + else + RaiseLocalEvent(ev.CancelledEvent); + } } private void OnDoAfterCancelled(ToolDoAfterCancelled ev) { - // Broadcast wrapped event. - RaiseLocalEvent(ev.Event); + if (ev.EventTarget != null) + RaiseLocalEvent(ev.EventTarget.Value, ev.Event, false); + else + RaiseLocalEvent(ev.Event); } /// @@ -77,8 +89,9 @@ namespace Content.Server.Tools /// An optional amount of fuel or energy to consume- /// A doAfter delay in seconds. /// The tool qualities needed to use the tool. - /// An event to broadcast once the doAfter is completed successfully. - /// An event to broadcast once the doAfter is cancelled. + /// An event to raise once the doAfter is completed successfully. + /// An event to raise once the doAfter is canceled. + /// Where to direct the do-after events. If null, events are broadcast /// An optional check to perform for the doAfter. /// The tool component. /// Whether initially, using the tool succeeded. If there's a doAfter delay, you'll need to listen to @@ -87,7 +100,7 @@ namespace Content.Server.Tools /// this simply returns whether using the tool succeeded or not. public bool UseTool(EntityUid tool, EntityUid user, EntityUid? target, float fuel, float doAfterDelay, IEnumerable toolQualitiesNeeded, - object? doAfterCompleteEvent = null, object? doAfterCancelledEvent = null, + object? doAfterCompleteEvent = null, object? doAfterCancelledEvent = null, EntityUid? doAfterEventTarget = null, Func? doAfterCheck = null, ToolComponent? toolComponent = null) { // No logging here, after all that'd mean the caller would need to check if the component is there or not. @@ -107,8 +120,8 @@ namespace Content.Server.Tools BreakOnTargetMove = true, BreakOnUserMove = true, NeedHand = true, - BroadcastFinishedEvent = doAfterCompleteEvent != null ? new ToolDoAfterComplete(doAfterCompleteEvent, doAfterCancelledEvent, tool, user, fuel) : null, - BroadcastCancelledEvent = doAfterCancelledEvent != null ? new ToolDoAfterCancelled(doAfterCancelledEvent) : null, + BroadcastFinishedEvent = doAfterCompleteEvent != null ? new ToolDoAfterComplete(doAfterCompleteEvent, doAfterCancelledEvent, tool, user, fuel, doAfterEventTarget) : null, + BroadcastCancelledEvent = doAfterCancelledEvent != null ? new ToolDoAfterCancelled(doAfterCancelledEvent, doAfterEventTarget) : null, }; _doAfterSystem.DoAfter(doAfterArgs); @@ -121,11 +134,11 @@ namespace Content.Server.Tools // This is hilariously long. /// public bool UseTool(EntityUid tool, EntityUid user, EntityUid? target, float fuel, - float doAfterDelay, string toolQualityNeeded, object doAfterCompleteEvent, object doAfterCancelledEvent, + float doAfterDelay, string toolQualityNeeded, object doAfterCompleteEvent, object doAfterCancelledEvent, EntityUid? doAfterEventTarget = null, Func? doAfterCheck = null, ToolComponent? toolComponent = null) { return UseTool(tool, user, target, fuel, doAfterDelay, new[] { toolQualityNeeded }, - doAfterCompleteEvent, doAfterCancelledEvent, doAfterCheck, toolComponent); + doAfterCompleteEvent, doAfterCancelledEvent, doAfterEventTarget, doAfterCheck, toolComponent); } /// @@ -239,24 +252,28 @@ namespace Content.Server.Tools public readonly EntityUid Uid; public readonly EntityUid UserUid; public readonly float Fuel; + public readonly EntityUid? EventTarget; - public ToolDoAfterComplete(object completedEvent, object? cancelledEvent, EntityUid uid, EntityUid userUid, float fuel) + public ToolDoAfterComplete(object completedEvent, object? cancelledEvent, EntityUid uid, EntityUid userUid, float fuel, EntityUid? eventTarget = null) { CompletedEvent = completedEvent; Uid = uid; UserUid = userUid; Fuel = fuel; CancelledEvent = cancelledEvent; + EventTarget = eventTarget; } } private class ToolDoAfterCancelled : EntityEventArgs { public readonly object Event; + public readonly EntityUid? EventTarget; - public ToolDoAfterCancelled(object @event) + public ToolDoAfterCancelled(object @event, EntityUid? eventTarget = null) { Event = @event; + EventTarget = eventTarget; } } }