diff --git a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs index 15b2167631..4f6b309bf7 100644 --- a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs +++ b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs @@ -66,7 +66,7 @@ namespace Content.IntegrationTests.Tests.Disposal DisposalUnitComponent unit; DisposalEntryComponent entry; - server.Assert(() => + server.Assert(async () => { var mapManager = IoCManager.Resolve(); @@ -86,14 +86,14 @@ namespace Content.IntegrationTests.Tests.Disposal // Can't insert, unanchored and unpowered var disposalUnitAnchorable = disposalUnit.GetComponent(); - disposalUnitAnchorable.TryUnAnchor(human, null, true); + await disposalUnitAnchorable.TryUnAnchor(human, null, true); Assert.False(unit.Anchored); UnitInsertContains(unit, false, human, wrench, disposalUnit, disposalTrunk); // Anchor the disposal unit - disposalUnitAnchorable.TryAnchor(human, null, true); + await disposalUnitAnchorable.TryAnchor(human, null, true); Assert.True(disposalUnit.TryGetComponent(out AnchorableComponent anchorableUnit)); - Assert.True(anchorableUnit.TryAnchor(human, wrench)); + Assert.True(await anchorableUnit.TryAnchor(human, wrench)); Assert.True(unit.Anchored); // No power diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj index 0c9be50c54..9eae91acb0 100644 --- a/Content.Server/Content.Server.csproj +++ b/Content.Server/Content.Server.csproj @@ -9,6 +9,7 @@ ..\bin\Content.Server\ true Exe + 1998 diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index b1d07fbc60..5131dde457 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -1,5 +1,6 @@ #nullable enable using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.Interfaces.GameObjects.Components; @@ -21,12 +22,12 @@ namespace Content.Server.GameObjects.Components /// /// The user doing the action /// The tool being used, can be null if forcing it - /// The physics component of the owning entity + /// The collidable component of the owning entity /// Whether or not to check if the tool is valid /// true if it is valid, false otherwise - private bool Valid(IEntity user, IEntity? utilizing, [MaybeNullWhen(false)] out ICollidableComponent collidable, bool force = false) + private async Task Valid(IEntity user, IEntity? utilizing, [MaybeNullWhen(false)] bool force = false) { - if (!Owner.TryGetComponent(out collidable)) + if (!Owner.HasComponent()) { return false; } @@ -35,7 +36,7 @@ namespace Content.Server.GameObjects.Components { if (utilizing == null || !utilizing.TryGetComponent(out ToolComponent tool) || - !tool.UseTool(user, Owner, ToolQuality.Anchoring)) + !(await tool.UseTool(user, Owner, 0.5f, ToolQuality.Anchoring))) { return false; } @@ -51,13 +52,14 @@ namespace Content.Server.GameObjects.Components /// The tool being used, if any /// Whether or not to ignore valid tool checks /// true if anchored, false otherwise - public bool TryAnchor(IEntity user, IEntity? utilizing = null, bool force = false) + public async Task TryAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { - if (!Valid(user, utilizing, out var physics, force)) + if (!(await Valid(user, utilizing, force))) { return false; } + var physics = Owner.GetComponent(); physics.Anchored = true; return true; @@ -70,13 +72,14 @@ namespace Content.Server.GameObjects.Components /// The tool being used, if any /// Whether or not to ignore valid tool checks /// true if unanchored, false otherwise - public bool TryUnAnchor(IEntity user, IEntity? utilizing = null, bool force = false) + public async Task TryUnAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { - if (!Valid(user, utilizing, out var physics, force)) + if (!(await Valid(user, utilizing, force))) { return false; } + var physics = Owner.GetComponent(); physics.Anchored = false; return true; @@ -89,7 +92,7 @@ namespace Content.Server.GameObjects.Components /// The tool being used, if any /// Whether or not to ignore valid tool checks /// true if toggled, false otherwise - private bool TryToggleAnchor(IEntity user, IEntity? utilizing = null, bool force = false) + private async Task TryToggleAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { if (!Owner.TryGetComponent(out ICollidableComponent collidable)) { @@ -97,8 +100,8 @@ namespace Content.Server.GameObjects.Components } return collidable.Anchored ? - TryUnAnchor(user, utilizing, force) : - TryAnchor(user, utilizing, force); + await TryUnAnchor(user, utilizing, force) : + await TryAnchor(user, utilizing, force); } public override void Initialize() @@ -107,9 +110,9 @@ namespace Content.Server.GameObjects.Components Owner.EnsureComponent(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { - return TryToggleAnchor(eventArgs.User, eventArgs.Using); + return await TryToggleAnchor(eventArgs.User, eventArgs.Using); } } } diff --git a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs index 68551cc0e2..156b9efefb 100644 --- a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -376,7 +377,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Data relevant to the event such as the actor which triggered it. /// - bool IInteractUsing.InteractUsing(InteractUsingEventArgs args) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs args) { if (!args.User.TryGetComponent(out IHandsComponent hands)) { diff --git a/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs b/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs index 13fd1e2081..e11d7d7438 100644 --- a/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.Interfaces; +using System.Threading.Tasks; +using Content.Server.Interfaces; using Content.Shared.Chemistry; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; @@ -50,7 +51,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Attack event args /// - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { //Get target solution component if (!Owner.TryGetComponent(out var targetSolution)) diff --git a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs index ea864a4b40..d32ae288ad 100644 --- a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -290,7 +291,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Data relevant to the event such as the actor which triggered it. /// - bool IInteractUsing.InteractUsing(InteractUsingEventArgs args) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs args) { if (!args.User.TryGetComponent(out IHandsComponent hands)) { diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs index 6d6a192359..ab636c4fe4 100644 --- a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs +++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs @@ -1,6 +1,7 @@ #nullable enable using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -162,10 +163,10 @@ namespace Content.Server.GameObjects.Components.Conveyor } } - private bool ToolUsed(IEntity user, ToolComponent tool) + private async Task ToolUsed(IEntity user, ToolComponent tool) { if (!Owner.HasComponent() && - tool.UseTool(user, Owner, ToolQuality.Prying)) + await tool.UseTool(user, Owner, 0.5f, ToolQuality.Prying)) { State = ConveyorState.Loose; @@ -244,7 +245,7 @@ namespace Content.Server.GameObjects.Components.Conveyor Disconnect(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out ConveyorSwitchComponent conveyorSwitch)) { @@ -254,7 +255,7 @@ namespace Content.Server.GameObjects.Components.Conveyor if (eventArgs.Using.TryGetComponent(out ToolComponent tool)) { - return ToolUsed(eventArgs.User, tool); + return await ToolUsed(eventArgs.User, tool); } return false; diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs index 208b0ceeec..3c06575fd2 100644 --- a/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs +++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Conveyor; using Content.Shared.Interfaces; @@ -193,7 +194,7 @@ namespace Content.Server.GameObjects.Components.Conveyor return NextState(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out ConveyorComponent conveyor)) { diff --git a/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs b/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs index 034d92c9cf..72043c215a 100644 --- a/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Interactable; @@ -32,7 +33,7 @@ namespace Content.Server.GameObjects.Components.Damage Owner.EnsureComponent(); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out var tool)) { diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index 3fd51adb20..399ba6ffbd 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -568,7 +569,7 @@ namespace Content.Server.GameObjects.Components.Disposal return true; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryDrop(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs b/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs index ade77fb937..6f8f94d217 100644 --- a/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs +++ b/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.Components.VendingMachines; @@ -379,7 +380,7 @@ namespace Content.Server.GameObjects.Components.Doors return _powerReceiver.Powered; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out var tool)) return false; @@ -397,22 +398,27 @@ namespace Content.Server.GameObjects.Components.Doors } } - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Prying)) return false; - - if (IsBolted()) + bool AirlockCheck() { - var notify = IoCManager.Resolve(); - notify.PopupMessage(Owner, eventArgs.User, - Loc.GetString("The airlock's bolts prevent it from being forced!")); + if (IsBolted()) + { + var notify = IoCManager.Resolve(); + notify.PopupMessage(Owner, eventArgs.User, + Loc.GetString("The airlock's bolts prevent it from being forced!")); + return false; + } + + if (IsPowered()) + { + var notify = IoCManager.Resolve(); + notify.PopupMessage(Owner, eventArgs.User, Loc.GetString("The powered motors block your efforts!")); + return false; + } + return true; } - if (IsPowered()) - { - var notify = IoCManager.Resolve(); - notify.PopupMessage(Owner, eventArgs.User, Loc.GetString("The powered motors block your efforts!")); - return true; - } + if (!await tool.UseTool(eventArgs.User, Owner, 3f, ToolQuality.Prying, AirlockCheck)) return false; if (State == DoorState.Closed) Open(); diff --git a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs index f0e6c07018..11c3281a94 100644 --- a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Chemistry; using Content.Shared.Chemistry; using Content.Shared.Interfaces; @@ -70,7 +71,7 @@ namespace Content.Server.GameObjects.Components.Fluids return true; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out MopComponent mopComponent)) { diff --git a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs index d47f94fd93..55e6acfe92 100644 --- a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs +++ b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Damage; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.EntitySystems; @@ -98,12 +99,12 @@ namespace Content.Server.GameObjects.Components.Gravity return true; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out WelderComponent tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Welding, 5f)) + if (!await tool.UseTool(eventArgs.User, Owner, 2f, ToolQuality.Welding, 5f)) return false; // Repair generator diff --git a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs index f8b7bf1d47..908b01442e 100644 --- a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.GUI; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Clothing; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power; @@ -57,7 +58,7 @@ namespace Content.Server.GameObjects.Components.Interactable [ViewVariables] public bool Activated { get; private set; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) return false; diff --git a/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs b/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs index 2d3d59884b..b2d6cbb98c 100644 --- a/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs @@ -34,7 +34,7 @@ namespace Content.Server.GameObjects.Components.Interactable serializer.DataField(ref _toolComponentNeeded, "toolComponentNeeded", true); } - public void TryPryTile(IEntity user, GridCoordinates clickLocation) + public async void TryPryTile(IEntity user, GridCoordinates clickLocation) { if (!Owner.TryGetComponent(out var tool) && _toolComponentNeeded) return; @@ -51,7 +51,7 @@ namespace Content.Server.GameObjects.Components.Interactable if (!tileDef.CanCrowbar) return; - if (_toolComponentNeeded && !tool.UseTool(user, null, ToolQuality.Prying)) + if (_toolComponentNeeded && !await tool!.UseTool(user, null, 0f, ToolQuality.Prying)) return; var underplating = _tileDefinitionManager["underplating"]; diff --git a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs index 0b1b6ad0ab..7bc3c0739a 100644 --- a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; +using Content.Server.GameObjects.EntitySystems.DoAfter; using Content.Shared.Audio; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.GameObjects.EntitySystems; @@ -89,11 +91,31 @@ namespace Content.Server.GameObjects.Components.Interactable serializer.DataField(this, collection => UseSoundCollection, "useSoundCollection", string.Empty); } - public virtual bool UseTool(IEntity user, IEntity target, ToolQuality toolQualityNeeded) + public virtual async Task UseTool(IEntity user, IEntity target, float doAfterDelay, ToolQuality toolQualityNeeded, Func doAfterCheck = null) { if (!HasQuality(toolQualityNeeded) || !ActionBlockerSystem.CanInteract(user)) return false; + if (doAfterDelay > 0f) + { + var doAfterSystem = EntitySystem.Get(); + + var doAfterArgs = new DoAfterEventArgs(user, doAfterDelay / SpeedModifier, default, target) + { + ExtraCheck = doAfterCheck, + BreakOnDamage = false, // TODO: Change this to true once breathing is fixed. + BreakOnStun = true, + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true, + }; + + var result = await doAfterSystem.DoAfter(doAfterArgs); + + if (result == DoAfterStatus.Cancelled) + return false; + } + PlayUseSound(); return true; diff --git a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs index 3b96b57733..785e19e6b0 100644 --- a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs @@ -1,5 +1,6 @@ #nullable enable using System; +using System.Threading.Tasks; using Content.Server.Atmos; using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.Components.Items.Storage; @@ -97,16 +98,37 @@ namespace Content.Server.GameObjects.Components.Interactable return new WelderComponentState(FuelCapacity, Fuel, WelderLit); } - public override bool UseTool(IEntity user, IEntity target, ToolQuality toolQualityNeeded) + public override async Task UseTool(IEntity user, IEntity target, float doAfterDelay, ToolQuality toolQualityNeeded, Func? doAfterCheck = null) { - var canUse = base.UseTool(user, target, toolQualityNeeded); + bool ExtraCheck() + { + var extraCheck = doAfterCheck?.Invoke() ?? true; + + if (!CanWeld(DefaultFuelCost)) + { + _notifyManager.PopupMessage(target, user, "Can't weld!"); + + return false; + } + + return extraCheck; + } + + var canUse = await base.UseTool(user, target, doAfterDelay, toolQualityNeeded, ExtraCheck); return toolQualityNeeded.HasFlag(ToolQuality.Welding) ? canUse && TryWeld(DefaultFuelCost, user) : canUse; } - public bool UseTool(IEntity user, IEntity target, ToolQuality toolQualityNeeded, float fuelConsumed) + public async Task UseTool(IEntity user, IEntity target, float doAfterDelay, ToolQuality toolQualityNeeded, float fuelConsumed, Func? doAfterCheck = null) { - return base.UseTool(user, target, toolQualityNeeded) && TryWeld(fuelConsumed, user); + bool ExtraCheck() + { + var extraCheck = doAfterCheck?.Invoke() ?? true; + + return extraCheck && CanWeld(fuelConsumed); + } + + return await base.UseTool(user, target, doAfterDelay, toolQualityNeeded, ExtraCheck) && TryWeld(fuelConsumed, user); } private bool TryWeld(float value, IEntity? user = null, bool silent = false) @@ -236,7 +258,7 @@ namespace Content.Server.GameObjects.Components.Interactable if (TryWeld(5, victim, silent: true)) { PlaySoundCollection(WeldSoundCollection); - chat.EntityMe(victim, Loc.GetString("welds {0:their} every orifice closed! It looks like {0:theyre} trying to commit suicide!", victim)); //TODO: theyre macro + chat.EntityMe(victim, Loc.GetString("welds {0:their} every orifice closed! It looks like {0:theyre} trying to commit suicide!", victim)); return SuicideKind.Heat; } diff --git a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs index df502ee9aa..3bb2cd1161 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Body; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Interactable; @@ -359,7 +360,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage return Contents.CanInsert(entity); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (Open) @@ -377,10 +378,9 @@ namespace Content.Server.GameObjects.Components.Items.Storage if (!eventArgs.Using.TryGetComponent(out WelderComponent tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Welding, 1f)) + if (!await tool.UseTool(eventArgs.User, Owner, 1f, ToolQuality.Welding, 1f)) return false; - IsWeldedShut ^= true; return true; } diff --git a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs index 5359953f39..96aef95564 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects.Components.Items; @@ -435,7 +436,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage /// /// /// true if inserted, false otherwise - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { Logger.DebugS(LoggerName, $"Storage (UID {Owner.Uid}) attacked by user (UID {eventArgs.User.Uid}) with entity (UID {eventArgs.Using.Uid})."); diff --git a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs index 672f09c14a..470fb19ec6 100644 --- a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Body; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -206,7 +207,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _userInterface.Open(actor.playerSession); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!_powered) { diff --git a/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs b/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs index ec174cca63..08a4bffd48 100644 --- a/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs +++ b/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Weapon.Melee; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Weapon.Melee; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.Damage; using Content.Shared.Interfaces.GameObjects.Components; @@ -30,7 +31,7 @@ namespace Content.Server.GameObjects.Components.Mining spriteComponent.LayerSetState(0, _random.Pick(SpriteStates)); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { var item = eventArgs.Using; if (!item.TryGetComponent(out MeleeWeaponComponent meleeWeaponComponent)) return false; diff --git a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs index b3edacdfac..53f3543d62 100644 --- a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs +++ b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs @@ -3,6 +3,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Access; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; @@ -143,7 +144,7 @@ namespace Content.Server.GameObjects.Components.PDA _appearance?.SetData(PDAVisuals.ScreenLit, _lightOn); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { var item = eventArgs.Using; if (!IdSlotEmpty) diff --git a/Content.Server/GameObjects/Components/Paper/PaperComponent.cs b/Content.Server/GameObjects/Components/Paper/PaperComponent.cs index 0f2b48b905..54193918d9 100644 --- a/Content.Server/GameObjects/Components/Paper/PaperComponent.cs +++ b/Content.Server/GameObjects/Components/Paper/PaperComponent.cs @@ -1,4 +1,5 @@ -using Content.Shared.GameObjects.Components; +using System.Threading.Tasks; +using Content.Shared.GameObjects.Components; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; @@ -66,7 +67,7 @@ namespace Content.Server.GameObjects.Components.Paper UpdateUserInterface(); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) return false; diff --git a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs index 54469fb856..ae7947a800 100644 --- a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs +++ b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.GUI; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.GUI; using Content.Shared.GameObjects.Components; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; @@ -21,7 +22,8 @@ namespace Content.Server.GameObjects.Components serializer.DataField(ref _isPlaceable, "IsPlaceable", true); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!IsPlaceable) return false; diff --git a/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs b/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs index a25e6730b3..bd7dd1a28b 100644 --- a/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs +++ b/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.Interfaces.GameObjects.Components.Items; @@ -30,7 +31,7 @@ namespace Content.Server.GameObjects.Components ContainerManagerComponent.Ensure("potted_plant_hide", Owner, out _); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (_itemContainer.ContainedEntity != null) { diff --git a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs index 0bfc844474..674a33dd1f 100644 --- a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs +++ b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -65,7 +66,7 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerRece base.OnRemove(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { var result = TryInsertItem(eventArgs.Using); if (!result) diff --git a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs index a6d81eed88..5f6edb59e6 100644 --- a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs +++ b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; @@ -69,7 +70,7 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerRece } } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { return InsertBulb(eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Power/WireComponent.cs b/Content.Server/GameObjects/Components/Power/WireComponent.cs index 7b551c1727..ad9cf19602 100644 --- a/Content.Server/GameObjects/Components/Power/WireComponent.cs +++ b/Content.Server/GameObjects/Components/Power/WireComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Interactable; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Stack; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.Interfaces.GameObjects.Components; @@ -34,10 +35,10 @@ namespace Content.Server.GameObjects.Components.Power serializer.DataField(ref _wireType, "wireType", WireType.HighVoltage); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out ToolComponent tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Cutting)) return false; + if (!await tool.UseTool(eventArgs.User, Owner, 0.25f, ToolQuality.Cutting)) return false; Owner.Delete(); var droppedEnt = Owner.EntityManager.SpawnEntity(_wireDroppedOnCutPrototype, eventArgs.ClickLocation); diff --git a/Content.Server/GameObjects/Components/Research/LatheComponent.cs b/Content.Server/GameObjects/Components/Research/LatheComponent.cs index e848cb66ee..55b2ddbbcb 100644 --- a/Content.Server/GameObjects/Components/Research/LatheComponent.cs +++ b/Content.Server/GameObjects/Components/Research/LatheComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.Components.Stack; using Content.Shared.GameObjects.Components.Materials; @@ -149,7 +150,8 @@ namespace Content.Server.GameObjects.Components.Research OpenUserInterface(actor.playerSession); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!Owner.TryGetComponent(out MaterialStorageComponent storage) || !eventArgs.Using.TryGetComponent(out MaterialComponent material)) return false; diff --git a/Content.Server/GameObjects/Components/Stack/StackComponent.cs b/Content.Server/GameObjects/Components/Stack/StackComponent.cs index aedff7d2df..e38af7a857 100644 --- a/Content.Server/GameObjects/Components/Stack/StackComponent.cs +++ b/Content.Server/GameObjects/Components/Stack/StackComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Shared.GameObjects.Components; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces; @@ -61,7 +62,7 @@ namespace Content.Server.GameObjects.Components.Stack return false; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out var stack)) { diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs index 4d52c9382e..2a3fc9df37 100644 --- a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; @@ -192,7 +193,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee return true; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) return false; diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs index 14d433e616..839c356ecf 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -119,7 +120,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition return true; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.HasComponent()) { diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs index 594d1d6689..5747132bb8 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -136,7 +137,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition return ammo; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertAmmo(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs index 25696a9e0d..e5bd9de782 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -204,7 +205,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition } } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertAmmo(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs index 75130f5246..913b56027f 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.GameObjects.EntitySystems; @@ -291,7 +292,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertBullet(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs index 3c4acb1e04..2139767dc0 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.Interfaces; @@ -206,7 +207,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertBullet(eventArgs); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs index fe8488952c..004e742b71 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.GameObjects.EntitySystems; @@ -231,7 +232,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertBullet(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs index f68aa0758c..486d2071b1 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power; @@ -260,7 +261,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) { diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs index 3623c4b5db..ef8b35ca90 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; @@ -344,7 +345,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels UpdateAppearance(); } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { // Insert magazine if (eventArgs.Using.TryGetComponent(out RangedMagazineComponent magazineComponent)) diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs index 0d1188505b..7c53360eb1 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Projectiles; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; @@ -186,7 +187,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } public abstract bool UseEntity(UseEntityEventArgs eventArgs); - public abstract bool InteractUsing(InteractUsingEventArgs eventArgs); + + public abstract Task InteractUsing(InteractUsingEventArgs eventArgs); public void ChangeFireSelector(FireRateSelector rateSelector) { diff --git a/Content.Server/GameObjects/Components/WiresComponent.cs b/Content.Server/GameObjects/Components/WiresComponent.cs index cc9b0aba06..d8abb14bc7 100644 --- a/Content.Server/GameObjects/Components/WiresComponent.cs +++ b/Content.Server/GameObjects/Components/WiresComponent.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.VendingMachines; using Content.Server.GameObjects.EntitySystems; @@ -468,11 +469,11 @@ namespace Content.Server.GameObjects.Components serializer.DataField(ref _layoutId, "LayoutId", null); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out var tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Screwing)) + if (!await tool.UseTool(eventArgs.User, Owner, 0.5f, ToolQuality.Screwing)) return false; IsPanelOpen = !IsPanelOpen; diff --git a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs index 8c6e8f1912..d607e79d59 100644 --- a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Movement; @@ -438,7 +439,7 @@ namespace Content.Server.GameObjects.EntitySystems.Click /// Uses a weapon/object on an entity /// Finds components with the InteractUsing interface and calls their function /// - public void Interaction(IEntity user, IEntity weapon, IEntity attacked, GridCoordinates clickLocation) + public async Task Interaction(IEntity user, IEntity weapon, IEntity attacked, GridCoordinates clickLocation) { var attackMsg = new InteractUsingMessage(user, weapon, attacked, clickLocation); RaiseLocalEvent(attackMsg); @@ -458,7 +459,7 @@ namespace Content.Server.GameObjects.EntitySystems.Click { foreach (var attackBy in attackBys) { - if (attackBy.InteractUsing(attackByEventArgs)) + if (await attackBy.InteractUsing(attackByEventArgs)) { // If an InteractUsing returns a status completion we finish our attack return; diff --git a/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs b/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs index b054fd5401..2138e559dc 100644 --- a/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Construction; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Interactable; @@ -76,7 +77,7 @@ namespace Content.Server.GameObjects.EntitySystems TryStartItemConstruction(placingEnt, msg.PrototypeName); } - private void HandleToolInteraction(AfterInteractMessage msg) + private async void HandleToolInteraction(AfterInteractMessage msg) { if(msg.Handled) return; @@ -104,7 +105,7 @@ namespace Content.Server.GameObjects.EntitySystems // the target entity is in the process of being constructed/deconstructed if (msg.Attacked.TryGetComponent(out var constructComp)) { - var result = TryConstructEntity(constructComp, handEnt, msg.User); + var result = await TryConstructEntity(constructComp, handEnt, msg.User); // TryConstructEntity may delete the existing entity @@ -367,7 +368,7 @@ namespace Content.Server.GameObjects.EntitySystems } } - private bool TryConstructEntity(ConstructionComponent constructionComponent, IEntity handTool, IEntity user) + private async Task TryConstructEntity(ConstructionComponent constructionComponent, IEntity handTool, IEntity user) { var constructEntity = constructionComponent.Owner; var spriteComponent = constructEntity.GetComponent(); @@ -384,7 +385,7 @@ namespace Content.Server.GameObjects.EntitySystems var stage = constructPrototype.Stages[constructionComponent.Stage]; - if (TryProcessStep(constructEntity, stage.Forward, handTool, user, transformComponent.GridPosition)) + if (await TryProcessStep(constructEntity, stage.Forward, handTool, user, transformComponent.GridPosition)) { constructionComponent.Stage++; if (constructionComponent.Stage == constructPrototype.Stages.Count - 1) @@ -406,7 +407,7 @@ namespace Content.Server.GameObjects.EntitySystems } } - else if (TryProcessStep(constructEntity, stage.Backward, handTool, user, transformComponent.GridPosition)) + else if (await TryProcessStep(constructEntity, stage.Backward, handTool, user, transformComponent.GridPosition)) { constructionComponent.Stage--; stage = constructPrototype.Stages[constructionComponent.Stage]; @@ -443,7 +444,7 @@ namespace Content.Server.GameObjects.EntitySystems } } - private bool TryProcessStep(IEntity constructEntity, ConstructionStep step, IEntity slapped, IEntity user, GridCoordinates gridCoords) + private async Task TryProcessStep(IEntity constructEntity, ConstructionStep step, IEntity slapped, IEntity user, GridCoordinates gridCoords) { if (step == null) { @@ -473,9 +474,9 @@ namespace Content.Server.GameObjects.EntitySystems // Handle welder manually since tool steps specify fuel amount needed, for some reason. if (toolStep.ToolQuality.HasFlag(ToolQuality.Welding)) return slapped.TryGetComponent(out var welder) - && welder.UseTool(user, constructEntity, toolStep.ToolQuality, toolStep.Amount); + && await welder.UseTool(user, constructEntity, toolStep.DoAfterDelay, toolStep.ToolQuality, toolStep.Amount); - return tool.UseTool(user, constructEntity, toolStep.ToolQuality); + return await tool.UseTool(user, constructEntity, toolStep.DoAfterDelay, toolStep.ToolQuality); default: throw new NotImplementedException(); diff --git a/Content.Shared/Construction/ConstructionPrototype.cs b/Content.Shared/Construction/ConstructionPrototype.cs index 04dd6829df..c32960bf63 100644 --- a/Content.Shared/Construction/ConstructionPrototype.cs +++ b/Content.Shared/Construction/ConstructionPrototype.cs @@ -181,11 +181,13 @@ namespace Content.Shared.Construction public abstract class ConstructionStep { - public readonly int Amount = 1; + public readonly int Amount; + public readonly float DoAfterDelay; - protected ConstructionStep(int amount) + protected ConstructionStep(int amount, float doAfterDelay = 0f) { Amount = amount; + DoAfterDelay = doAfterDelay; } } diff --git a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs index 21c0dacedb..5b28a693e0 100644 --- a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs +++ b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using System.Collections.Generic; using JetBrains.Annotations; using Robust.Shared.GameObjects; @@ -22,7 +23,7 @@ namespace Content.Shared.Interfaces.GameObjects.Components /// /// Called when using one object on another when user is in range of the target entity. /// - bool InteractUsing(InteractUsingEventArgs eventArgs); + Task InteractUsing(InteractUsingEventArgs eventArgs); } public class InteractUsingEventArgs : EventArgs, ITargetedInteractEventArgs