From c09c9176ef0f5294398ded497662f0e690f940ea Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Fri, 28 Aug 2020 09:31:17 +0200 Subject: [PATCH] Add do_after to TryInsert (#1938) Add delay to flushing Co-authored-by: Julian Giebel --- .../Tests/Disposal/DisposalUnitTest.cs | 15 +++-- .../Disposal/DisposalUnitComponent.cs | 57 +++++++++++++++---- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs index 3eb3821634..b4296daded 100644 --- a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs +++ b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs @@ -22,14 +22,17 @@ namespace Content.IntegrationTests.Tests.Disposal { foreach (var entity in entities) { + var insertTask = unit.TryInsert(entity); Assert.That(unit.CanInsert(entity), Is.EqualTo(result)); - Assert.That(unit.TryInsert(entity), Is.EqualTo(result)); - - if (result) + insertTask.ContinueWith(task => { - // Not in a tube yet - Assert.That(entity.Transform.Parent == unit.Owner.Transform); - } + Assert.That(task.Result, Is.EqualTo(result)); + if (result) + { + // Not in a tube yet + Assert.That(entity.Transform.Parent, Is.EqualTo(unit.Owner.Transform)); + } + }); } } diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index 521615f4b9..d67721987a 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; +using Content.Server.GameObjects.EntitySystems.DoAfter; using Content.Server.Interfaces; using Content.Server.Interfaces.GameObjects.Components.Items; using Content.Server.Utility; @@ -68,6 +69,12 @@ namespace Content.Server.GameObjects.Components.Disposal [ViewVariables] private TimeSpan _automaticEngageTime; + [ViewVariables] + private TimeSpan _flushDelay; + + [ViewVariables] + private float _entryDelay; + /// /// Token used to cancel the automatic engage of a disposal unit /// after an entity enters it. @@ -174,13 +181,34 @@ namespace Content.Server.GameObjects.Components.Disposal UpdateVisualState(); } - public bool TryInsert(IEntity entity) + public async Task TryInsert(IEntity entity, IEntity? user = default) { - if (!CanInsert(entity) || !_container.Insert(entity)) - { + if (!CanInsert(entity)) return false; + + if (user != null && _entryDelay > 0f) + { + var doAfterSystem = EntitySystem.Get(); + + var doAfterArgs = new DoAfterEventArgs(user, _entryDelay, default, Owner) + { + BreakOnDamage = true, + BreakOnStun = true, + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = false, + }; + + var result = await doAfterSystem.DoAfter(doAfterArgs); + + if (result == DoAfterStatus.Cancelled) + return false; + } + if (!_container.Insert(entity)) + return false; + AfterInsert(entity); return true; @@ -225,9 +253,9 @@ namespace Content.Server.GameObjects.Components.Disposal { Engaged ^= true; - if (Engaged) + if (Engaged && CanFlush()) { - TryFlush(); + Timer.Spawn(_flushDelay, () => TryFlush()); } } @@ -487,10 +515,16 @@ namespace Content.Server.GameObjects.Components.Disposal () => (int) _automaticEngageTime.TotalSeconds); serializer.DataReadWriteFunction( - "automaticEngageTime", - 30, - seconds => _automaticEngageTime = TimeSpan.FromSeconds(seconds), - () => (int) _automaticEngageTime.TotalSeconds); + "flushDelay", + 3, + seconds => _flushDelay = TimeSpan.FromSeconds(seconds), + () => (int) _flushDelay.TotalSeconds); + + serializer.DataReadWriteFunction( + "entryDelay", + 0.5f, + seconds => _entryDelay = seconds, + () => (int) _entryDelay); } public override void Initialize() @@ -620,7 +654,8 @@ namespace Content.Server.GameObjects.Components.Disposal bool IDragDropOn.DragDropOn(DragDropEventArgs eventArgs) { - return TryInsert(eventArgs.Dropped); + _ = TryInsert(eventArgs.Dropped, eventArgs.User); + return true; } [Verb] @@ -642,7 +677,7 @@ namespace Content.Server.GameObjects.Components.Disposal protected override void Activate(IEntity user, DisposalUnitComponent component) { - component.TryInsert(user); + _ = component.TryInsert(user, user); } }