From c775410370a650aa51a1feda99f45cefda0c811e Mon Sep 17 00:00:00 2001 From: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Date: Sat, 2 Mar 2024 08:57:44 -0500 Subject: [PATCH] Weight based AreaInsert and Dumpable delay, a janitor qol tweak (#24899) Weight based delay, retuned average, fixed comments --- .../Storage/Components/DumpableComponent.cs | 3 ++- .../Storage/EntitySystems/DumpableSystem.cs | 18 +++++++++++++++++- .../EntitySystems/SharedStorageSystem.cs | 10 ++++++++-- Content.Shared/Storage/StorageComponent.cs | 4 ++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Storage/Components/DumpableComponent.cs b/Content.Shared/Storage/Components/DumpableComponent.cs index f10a935fb925..ecf5f17ea994 100644 --- a/Content.Shared/Storage/Components/DumpableComponent.cs +++ b/Content.Shared/Storage/Components/DumpableComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.DoAfter; +using Content.Shared.Storage.EntitySystems; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -24,7 +25,7 @@ public sealed partial class DumpableComponent : Component /// How long each item adds to the doafter. /// [DataField("delayPerItem"), AutoNetworkedField] - public TimeSpan DelayPerItem = TimeSpan.FromSeconds(0.2); + public TimeSpan DelayPerItem = TimeSpan.FromSeconds(SharedStorageSystem.AreaInsertDelayPerItem); /// /// The multiplier modifier diff --git a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs index c87174ba88c4..04f7231416f3 100644 --- a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs +++ b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs @@ -2,11 +2,13 @@ using Content.Shared.Disposal; using Content.Shared.DoAfter; using Content.Shared.Interaction; +using Content.Shared.Item; using Content.Shared.Placeable; using Content.Shared.Storage.Components; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -14,6 +16,7 @@ namespace Content.Shared.Storage.EntitySystems; public sealed class DumpableSystem : EntitySystem { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedContainerSystem _container = default!; @@ -113,7 +116,20 @@ private void StartDoAfter(EntityUid storageUid, EntityUid? targetUid, EntityUid if (!TryComp(storageUid, out var storage)) return; - var delay = storage.Container.ContainedEntities.Count * (float) dumpable.DelayPerItem.TotalSeconds * dumpable.Multiplier; + var delay = 0f; + + foreach (var entity in storage.Container.ContainedEntities) + { + if (!TryComp(entity, out var itemComp) || + !_prototypeManager.TryIndex(itemComp.Size, out var itemSize)) + { + continue; + } + + delay += itemSize.Weight; + } + + delay *= (float) dumpable.DelayPerItem.TotalSeconds * dumpable.Multiplier; _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, userUid, delay, new DumpableDoAfterEvent(), storageUid, target: targetUid, used: storageUid) { diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 4be2b59ecef2..c26419998604 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -54,6 +54,8 @@ public abstract class SharedStorageSystem : EntitySystem [ValidatePrototypeId] public const string DefaultStorageMaxItemSize = "Normal"; + public const float AreaInsertDelayPerItem = 0.075f; + private ItemSizePrototype _defaultStorageMaxItemSize = default!; public bool CheckingCanInsert; @@ -258,11 +260,14 @@ private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInt if (storageComp.AreaInsert && (args.Target == null || !HasComp(args.Target.Value))) { var validStorables = new List(); + var delay = 0f; foreach (var entity in _entityLookupSystem.GetEntitiesInRange(args.ClickLocation, storageComp.AreaInsertRadius, LookupFlags.Dynamic | LookupFlags.Sundries)) { if (entity == args.User - || !_itemQuery.HasComponent(entity) + // || !_itemQuery.HasComponent(entity) + || !TryComp(entity, out var itemComp) // Need comp to get item size to get weight + || !_prototype.TryIndex(itemComp.Size, out var itemSize) || !CanInsert(uid, entity, out _, storageComp) || !_interactionSystem.InRangeUnobstructed(args.User, entity)) { @@ -270,12 +275,13 @@ private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInt } validStorables.Add(entity); + delay += itemSize.Weight * AreaInsertDelayPerItem; } //If there's only one then let's be generous if (validStorables.Count > 1) { - var doAfterArgs = new DoAfterArgs(EntityManager, args.User, 0.2f * validStorables.Count, new AreaPickupDoAfterEvent(GetNetEntityList(validStorables)), uid, target: uid) + var doAfterArgs = new DoAfterArgs(EntityManager, args.User, delay, new AreaPickupDoAfterEvent(GetNetEntityList(validStorables)), uid, target: uid) { BreakOnDamage = true, BreakOnUserMove = true, diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index 35f7955349cf..98e80de0253d 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -47,13 +47,13 @@ public sealed partial class StorageComponent : Component // TODO: Make area insert its own component. [DataField] - public bool QuickInsert; // Can insert storables by "attacking" them with the storage entity + public bool QuickInsert; // Can insert storables by clicking them with the storage entity [DataField] public bool ClickInsert = true; // Can insert stuff by clicking the storage entity with it [DataField] - public bool AreaInsert; // "Attacking" with the storage entity causes it to insert all nearby storables after a delay + public bool AreaInsert; // Clicking with the storage entity causes it to insert all nearby storables after a delay [DataField] public int AreaInsertRadius = 1;