{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
- public static readonly int[] DefaultSplitAmounts = { 1, 5, 10, 20, 30, 50 };
-
public override void Initialize()
{
base.Initialize();
-
- SubscribeLocalEvent<StackComponent, GetVerbsEvent<AlternativeVerb>>(OnStackAlternativeInteract);
}
public override void SetCount(EntityUid uid, int amount, StackComponent? component = null)
return amounts;
}
- private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent<AlternativeVerb> args)
- {
- if (!args.CanAccess || !args.CanInteract || args.Hands == null || stack.Count == 1)
- return;
-
- AlternativeVerb halve = new()
- {
- Text = Loc.GetString("comp-stack-split-halve"),
- Category = VerbCategory.Split,
- Act = () => UserSplit(uid, args.User, stack.Count / 2, stack),
- Priority = 1
- };
- args.Verbs.Add(halve);
-
- var priority = 0;
- foreach (var amount in DefaultSplitAmounts)
- {
- if (amount >= stack.Count)
- continue;
-
- AlternativeVerb verb = new()
- {
- Text = amount.ToString(),
- Category = VerbCategory.Split,
- Act = () => UserSplit(uid, args.User, amount, stack),
- // we want to sort by size, not alphabetically by the verb text.
- Priority = priority
- };
-
- priority--;
-
- args.Verbs.Add(verb);
- }
- }
-
- private void UserSplit(EntityUid uid, EntityUid userUid, int amount,
+ protected override void UserSplit(EntityUid uid, EntityUid userUid, int amount,
StackComponent? stack = null,
TransformComponent? userTransform = null)
{
using Content.Shared.Nutrition;
using Content.Shared.Popups;
using Content.Shared.Storage.EntitySystems;
+using Content.Shared.Verbs;
using JetBrains.Annotations;
using Robust.Shared.GameStates;
using Robust.Shared.Physics.Systems;
[Dependency] protected readonly SharedPopupSystem Popup = default!;
[Dependency] private readonly SharedStorageSystem _storage = default!;
+ public static readonly int[] DefaultSplitAmounts = { 1, 5, 10, 20, 30, 50 };
+
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<StackComponent, InteractUsingEvent>(OnStackInteractUsing);
SubscribeLocalEvent<StackComponent, BeforeIngestedEvent>(OnBeforeEaten);
SubscribeLocalEvent<StackComponent, IngestedEvent>(OnEaten);
+ SubscribeLocalEvent<StackComponent, GetVerbsEvent<AlternativeVerb>>(OnStackAlternativeInteract);
_vvm.GetTypeHandler<StackComponent>()
.AddPath(nameof(StackComponent.Count), (_, comp) => comp.Count, SetCount);
// Here to tell the food system to do destroy stuff.
args.Destroy = true;
}
+
+ private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent<AlternativeVerb> args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null || stack.Count == 1)
+ return;
+
+ AlternativeVerb halve = new()
+ {
+ Text = Loc.GetString("comp-stack-split-halve"),
+ Category = VerbCategory.Split,
+ Act = () => UserSplit(uid, args.User, stack.Count / 2, stack),
+ Priority = 1
+ };
+ args.Verbs.Add(halve);
+
+ var priority = 0;
+ foreach (var amount in DefaultSplitAmounts)
+ {
+ if (amount >= stack.Count)
+ continue;
+
+ AlternativeVerb verb = new()
+ {
+ Text = amount.ToString(),
+ Category = VerbCategory.Split,
+ Act = () => UserSplit(uid, args.User, amount, stack),
+ // we want to sort by size, not alphabetically by the verb text.
+ Priority = priority
+ };
+
+ priority--;
+
+ args.Verbs.Add(verb);
+ }
+ }
+
+ /// <remarks>
+ /// OnStackAlternativeInteract() was moved to shared in order to faciliate prediction of stack splitting verbs.
+ /// However, prediction of interacitons with spawned entities is non-functional (or so i'm told)
+ /// So, UserSplit() and Split() should remain on the server for the time being.
+ /// This empty virtual method allows for UserSplit() to be called on the server from the client.
+ /// When prediction is improved, those two methods should be moved to shared, in order to predict the splitting itself (not just the verbs)
+ /// </remarks>
+ protected virtual void UserSplit(EntityUid uid, EntityUid userUid, int amount,
+ StackComponent? stack = null,
+ TransformComponent? userTransform = null)
+ {
+
+ }
}
/// <summary>