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:
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user