From f0f1f552d0830690caa3530693f0c46bb5eccec2 Mon Sep 17 00:00:00 2001 From: Charlie Morley Date: Sat, 22 Nov 2025 12:32:37 -0600 Subject: [PATCH] Oracle "offer item" context menu verb (#4704) Adds context menu verb for offering items to Oracle --- .../Research/Oracle/OracleSystem.cs | 77 +++++++++++++++---- .../Locale/en-US/_DV/verbs/verb-system.ftl | 3 + 2 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 Resources/Locale/en-US/_DV/verbs/verb-system.ftl diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs index 2454759ff5..51583dbf26 100644 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs +++ b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs @@ -17,6 +17,7 @@ using Content.Shared.Mobs.Components; using Content.Shared.Psionics.Glimmer; using Content.Shared.Research.Prototypes; using Content.Shared.Silicons.Borgs.Components; +using Content.Shared.Verbs; using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -67,6 +68,7 @@ public sealed class OracleSystem : EntitySystem SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent>(AddInsertDesiredItemVerb); } private void OnInit(EntityUid uid, OracleComponent component, ComponentInit args) @@ -102,12 +104,15 @@ public sealed class OracleSystem : EntitySystem } } - private void OnInteractUsing(EntityUid uid, OracleComponent component, InteractUsingEvent args) + private void AddInsertDesiredItemVerb(Entity ent, ref GetVerbsEvent args) { - if (HasComp(args.Used)) + if (!args.CanAccess || !args.CanInteract || args.Using == null) return; - if (!TryComp(args.Used, out MetaDataComponent? meta)) + if (HasComp(args.Using)) + return; + + if (!TryComp(args.Using, out MetaDataComponent? meta)) return; if (HasComp(args.User)) @@ -116,49 +121,84 @@ public sealed class OracleSystem : EntitySystem if (meta.EntityPrototype == null) return; - var validItem = CheckValidity(meta.EntityPrototype, component.DesiredPrototype); + var argsUser = args.User; + var argsUsing = args.Using; + + Verb insertVerb = new() + { + Text = Name(argsUsing.Value), + Category = InsertDesiredItemVerbCategory, + Act = () => + { + DoOnInteractUsing(ent, argsUser, argsUsing.Value); + } + }; + + args.Verbs.Add(insertVerb); + } + + private void OnInteractUsing(EntityUid uid, OracleComponent component, InteractUsingEvent args) + { + DoOnInteractUsing((uid, component), args.User, args.Used); + } + + private void DoOnInteractUsing(Entity oracle, EntityUid user, EntityUid used) + { + if (HasComp(used)) + return; + + if (!TryComp(used, out MetaDataComponent? meta)) + return; + + if (HasComp(user)) + return; + + if (meta.EntityPrototype == null) + return; + + var validItem = CheckValidity(meta.EntityPrototype, oracle.Comp.DesiredPrototype); var nextItem = true; - if (component.LastDesiredPrototype != null && - CheckValidity(meta.EntityPrototype, component.LastDesiredPrototype)) + if (oracle.Comp.LastDesiredPrototype != null && + CheckValidity(meta.EntityPrototype, oracle.Comp.LastDesiredPrototype)) { nextItem = false; validItem = true; - component.LastDesiredPrototype = null; + oracle.Comp.LastDesiredPrototype = null; } if (!validItem) { - if (!HasComp(args.Used) && - component.RejectAccumulator >= component.RejectTime.TotalSeconds) + if (!HasComp(used) && + oracle.Comp.RejectAccumulator >= oracle.Comp.RejectTime.TotalSeconds) { - component.RejectAccumulator = 0; - _chat.TrySendInGameICMessage(uid, _random.Pick(component.RejectMessages), InGameICChatType.Speak, true); + oracle.Comp.RejectAccumulator = 0; + _chat.TrySendInGameICMessage(oracle.Owner, _random.Pick(oracle.Comp.RejectMessages), InGameICChatType.Speak, true); } return; } - QueueDel(args.Used); + QueueDel(used); _adminLog.Add(LogType.InteractHand, LogImpact.Medium, - $"{ToPrettyString(args.User):player} sold {ToPrettyString(args.Used)} to {ToPrettyString(uid)}."); + $"{ToPrettyString(user):player} sold {ToPrettyString(used)} to {ToPrettyString(oracle.Owner)}."); - Spawn("ResearchDisk5000", Transform(args.User).Coordinates); + Spawn("ResearchDisk5000", Transform(user).Coordinates); - DispenseLiquidReward(uid, component); + DispenseLiquidReward(oracle.Owner, oracle.Comp); var i = _random.Next(1, 4); while (i != 0) { - Spawn("MaterialBluespace1", Transform(args.User).Coordinates); + Spawn("MaterialBluespace1", Transform(user).Coordinates); i--; } if (nextItem) - NextItem(component); + NextItem(oracle.Comp); } private bool CheckValidity(EntityPrototype given, EntityPrototype target) @@ -280,4 +320,7 @@ public sealed class OracleSystem : EntitySystem return allProtos; } + + public static readonly VerbCategory InsertDesiredItemVerbCategory = new("verb-categories-oracle-insert-desired", null); + } diff --git a/Resources/Locale/en-US/_DV/verbs/verb-system.ftl b/Resources/Locale/en-US/_DV/verbs/verb-system.ftl new file mode 100644 index 0000000000..162df256d6 --- /dev/null +++ b/Resources/Locale/en-US/_DV/verbs/verb-system.ftl @@ -0,0 +1,3 @@ +# verb categories & common verbs. These appear across multiple systems, so they may as well go here. + +verb-categories-oracle-insert-desired = Offer