From 335c4614421cdd4f6a209a57d710149059bbf39c Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto Date: Thu, 28 Oct 2021 11:21:43 +0200 Subject: [PATCH] Fix sync UseTool not calling ToolFinishUse when there's a DoAfter. Fixes #5060 --- Content.Server/Tools/ToolSystem.cs | 47 ++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/Content.Server/Tools/ToolSystem.cs b/Content.Server/Tools/ToolSystem.cs index 2d5e0e8785..c8a7337c34 100644 --- a/Content.Server/Tools/ToolSystem.cs +++ b/Content.Server/Tools/ToolSystem.cs @@ -33,6 +33,21 @@ namespace Content.Server.Tools InitializeWelders(); InitializeMultipleTools(); + + SubscribeLocalEvent(OnDoAfterComplete); + SubscribeLocalEvent(OnDoAfterCancelled); + } + + private void OnDoAfterComplete(ToolDoAfterComplete ev) + { + // Actually finish the tool use! Depending on whether that succeeds or not, either event will be broadcast. + RaiseLocalEvent(ToolFinishUse(ev.Uid, ev.UserUid, ev.Fuel) ? ev.CompletedEvent : ev.CancelledEvent); + } + + private void OnDoAfterCancelled(ToolDoAfterCancelled ev) + { + // Broadcast wrapped event. + RaiseLocalEvent(ev.Event); } /// @@ -89,8 +104,8 @@ namespace Content.Server.Tools BreakOnTargetMove = true, BreakOnUserMove = true, NeedHand = true, - BroadcastFinishedEvent = doAfterCompleteEvent, - BroadcastCancelledEvent = doAfterCancelledEvent, + BroadcastFinishedEvent = new ToolDoAfterComplete(doAfterCompleteEvent, doAfterCancelledEvent, tool, user, fuel), + BroadcastCancelledEvent = new ToolDoAfterCancelled(doAfterCancelledEvent), }; _doAfterSystem.DoAfter(doAfterArgs); @@ -213,6 +228,34 @@ namespace Content.Server.Tools UpdateWelders(frameTime); } + + private class ToolDoAfterComplete : EntityEventArgs + { + public readonly object CompletedEvent; + public readonly object CancelledEvent; + public readonly EntityUid Uid; + public readonly EntityUid UserUid; + public readonly float Fuel; + + public ToolDoAfterComplete(object completedEvent, object cancelledEvent, EntityUid uid, EntityUid userUid, float fuel) + { + CompletedEvent = completedEvent; + Uid = uid; + UserUid = userUid; + Fuel = fuel; + CancelledEvent = cancelledEvent; + } + } + + private class ToolDoAfterCancelled : EntityEventArgs + { + public readonly object Event; + + public ToolDoAfterCancelled(object @event) + { + Event = @event; + } + } } ///