allow syringes to set transfer amount (#12173)

* allow syringes to set transfer amount

* stripped custom transfer logic, and added delay per additional 5u transfered

* touch up

* another touch
This commit is contained in:
Justin Trotter
2022-10-26 01:40:06 -05:00
committed by GitHub
parent 52a7a733af
commit f2d05aa20a
2 changed files with 62 additions and 0 deletions

View File

@@ -1,6 +1,9 @@
using System.Threading; using System.Threading;
using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Server.UserInterface;
using Robust.Server.GameObjects;
using Content.Shared.Chemistry;
namespace Content.Server.Chemistry.Components namespace Content.Server.Chemistry.Components
{ {
@@ -22,6 +25,20 @@ namespace Content.Server.Chemistry.Components
[DataField("injectOnly")] [DataField("injectOnly")]
public bool InjectOnly; public bool InjectOnly;
/// <summary>
/// The minimum amount of solution that can be transferred at once from this solution.
/// </summary>
[DataField("minTransferAmount")]
[ViewVariables(VVAccess.ReadWrite)]
public FixedPoint2 MinimumTransferAmount { get; set; } = FixedPoint2.New(5);
/// <summary>
/// The maximum amount of solution that can be transferred at once from this solution.
/// </summary>
[DataField("maxTransferAmount")]
[ViewVariables(VVAccess.ReadWrite)]
public FixedPoint2 MaximumTransferAmount { get; set; } = FixedPoint2.New(50);
/// <summary> /// <summary>
/// Amount to inject or draw on each usage. If the injector is inject only, it will /// Amount to inject or draw on each usage. If the injector is inject only, it will
/// attempt to inject it's entire contents upon use. /// attempt to inject it's entire contents upon use.

View File

@@ -15,13 +15,22 @@ using Content.Shared.MobState.Components;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
using Robust.Shared.Player; using Robust.Shared.Player;
using System.Threading; using System.Threading;
using Content.Shared.Verbs;
using Robust.Server.GameObjects;
using Content.Shared.Popups;
namespace Content.Server.Chemistry.EntitySystems; namespace Content.Server.Chemistry.EntitySystems;
public sealed partial class ChemistrySystem public sealed partial class ChemistrySystem
{ {
/// <summary>
/// Default transfer amounts for the set-transfer verb.
/// </summary>
public static readonly List<int> TransferAmounts = new() { 5, 10, 15};
private void InitializeInjector() private void InitializeInjector()
{ {
SubscribeLocalEvent<InjectorComponent, GetVerbsEvent<AlternativeVerb>>(AddSetTransferVerbs);
SubscribeLocalEvent<InjectorComponent, SolutionChangedEvent>(OnSolutionChange); SubscribeLocalEvent<InjectorComponent, SolutionChangedEvent>(OnSolutionChange);
SubscribeLocalEvent<InjectorComponent, HandDeselectedEvent>(OnInjectorDeselected); SubscribeLocalEvent<InjectorComponent, HandDeselectedEvent>(OnInjectorDeselected);
SubscribeLocalEvent<InjectorComponent, ComponentStartup>(OnInjectorStartup); SubscribeLocalEvent<InjectorComponent, ComponentStartup>(OnInjectorStartup);
@@ -33,6 +42,38 @@ public sealed partial class ChemistrySystem
SubscribeLocalEvent<InjectionCancelledEvent>(OnInjectionCancelled); SubscribeLocalEvent<InjectionCancelledEvent>(OnInjectionCancelled);
} }
private void AddSetTransferVerbs(EntityUid uid, InjectorComponent component, GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanAccess || !args.CanInteract || args.Hands == null)
return;
if (!EntityManager.TryGetComponent<ActorComponent?>(args.User, out var actor))
return;
// Add specific transfer verbs according to the container's size
var priority = 0;
foreach (var amount in TransferAmounts)
{
if ( amount < component.MinimumTransferAmount.Int() || amount > component.MaximumTransferAmount.Int())
continue;
AlternativeVerb verb = new();
verb.Text = Loc.GetString("comp-solution-transfer-verb-amount", ("amount", amount));
verb.Category = VerbCategory.SetTransferAmount;
verb.Act = () =>
{
component.TransferAmount = FixedPoint2.New(amount);
args.User.PopupMessage(Loc.GetString("comp-solution-transfer-set-amount", ("amount", amount)));
};
// we want to sort by size, not alphabetically by the verb text.
verb.Priority = priority;
priority--;
args.Verbs.Add(verb);
}
}
private static void OnInjectionCancelled(InjectionCancelledEvent ev) private static void OnInjectionCancelled(InjectionCancelledEvent ev)
{ {
ev.Component.CancelToken = null; ev.Component.CancelToken = null;
@@ -196,6 +237,10 @@ public sealed partial class ChemistrySystem
return; return;
var actualDelay = MathF.Max(component.Delay, 1f); var actualDelay = MathF.Max(component.Delay, 1f);
// Injections take 1 second longer per additional 5u
actualDelay += (float) component.TransferAmount / component.Delay - 1;
if (user != target) if (user != target)
{ {
// Create a pop-up for the target // Create a pop-up for the target