]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
uplink ringtone code + minor cleanup (#15277)
authordeltanedas <39013340+deltanedas@users.noreply.github.com>
Sun, 23 Apr 2023 21:00:42 +0000 (21:00 +0000)
committerGitHub <noreply@github.com>
Sun, 23 Apr 2023 21:00:42 +0000 (17:00 -0400)
* uplink ringtone code + minor cleanup

* show uplink code in character menu

* no log

* rgbee

* no red

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Content.Server/GameTicking/Rules/TraitorRuleSystem.cs
Content.Server/PDA/PDASystem.cs
Content.Server/PDA/Ringer/RingerSystem.cs
Content.Server/PDA/Ringer/RingerUplinkComponent.cs [new file with mode: 0644]
Content.Server/Traitor/TraitorRole.cs
Content.Server/Traitor/Uplink/UplinkSystem.cs
Resources/Locale/en-US/game-ticking/game-presets/preset-traitor.ftl

index e005357f1f43093549b405cdcdf87288b18f8dee..9edfe80d20e7446a2114d9839bd7f72ab64f0376 100644 (file)
@@ -1,12 +1,13 @@
 using System.Linq;
 using Content.Server.Chat.Managers;
+using Content.Server.NPC.Systems;
 using Content.Server.Objectives.Interfaces;
+using Content.Server.PDA.Ringer;
 using Content.Server.Players;
 using Content.Server.Roles;
+using Content.Server.Shuttles.Components;
 using Content.Server.Traitor;
 using Content.Server.Traitor.Uplink;
-using Content.Server.NPC.Systems;
-using Content.Server.Shuttles.Components;
 using Content.Shared.CCVar;
 using Content.Shared.Dataset;
 using Content.Shared.Preferences;
@@ -18,8 +19,8 @@ using Robust.Shared.Configuration;
 using Robust.Shared.Player;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Random;
-using Robust.Shared.Utility;
 using Robust.Shared.Timing;
+using Robust.Shared.Utility;
 
 namespace Content.Server.GameTicking.Rules;
 
@@ -249,14 +250,18 @@ public sealed class TraitorRuleSystem : GameRuleSystem
         if (mind.CurrentJob != null)
             startingBalance = Math.Max(startingBalance - mind.CurrentJob.Prototype.AntagAdvantage, 0);
 
-        if (!_uplink.AddUplink(mind.OwnedEntity!.Value, startingBalance))
+        var pda = _uplink.FindUplinkTarget(mind.OwnedEntity!.Value);
+        if (pda == null || !_uplink.AddUplink(mind.OwnedEntity.Value, startingBalance))
             return false;
 
+        // add the ringtone uplink and get its code for greeting
+        var code = AddComp<RingerUplinkComponent>(pda.Value).Code;
+
         var antagPrototype = _prototypeManager.Index<AntagPrototype>(TraitorPrototypeID);
         var traitorRole = new TraitorRole(mind, antagPrototype);
         mind.AddRole(traitorRole);
         Traitors.Add(traitorRole);
-        traitorRole.GreetTraitor(Codewords);
+        traitorRole.GreetTraitor(Codewords, code);
 
         _faction.RemoveFaction(entity, "NanoTrasen", false);
         _faction.AddFaction(entity, "Syndicate");
@@ -274,8 +279,9 @@ public sealed class TraitorRuleSystem : GameRuleSystem
                 difficulty += objective.Difficulty;
         }
 
-        //give traitors their codewords to keep in their character info menu
-        traitorRole.Mind.Briefing = Loc.GetString("traitor-role-codewords", ("codewords", string.Join(", ", Codewords)));
+        //give traitors their codewords and uplink code to keep in their character info menu
+        traitorRole.Mind.Briefing = Loc.GetString("traitor-role-codewords-short", ("codewords", string.Join(", ", Codewords)))
+            + "\n" + Loc.GetString("traitor-role-uplink-code-short", ("code", string.Join("", code)));
 
         _audioSystem.PlayGlobal(_addedSound, Filter.Empty().AddPlayer(traitor), false, AudioParams.Default);
         return true;
index fd8626cf74374e90cc7848b664e05771fe3d5bbd..8362142c83663d688293540a55797d0279a39bfa 100644 (file)
@@ -5,8 +5,6 @@ using Content.Server.Light.Components;
 using Content.Server.Light.EntitySystems;
 using Content.Server.Light.Events;
 using Content.Server.PDA.Ringer;
-using Content.Server.Store.Components;
-using Content.Server.Store.Systems;
 using Content.Server.Station.Systems;
 using Content.Server.UserInterface;
 using Content.Shared.PDA;
@@ -26,16 +24,12 @@ namespace Content.Server.PDA
         [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
         [Dependency] private readonly StationSystem _stationSystem = default!;
         [Dependency] private readonly CartridgeLoaderSystem _cartridgeLoaderSystem = default!;
-        [Dependency] private readonly StoreSystem _storeSystem = default!;
 
         public override void Initialize()
         {
             base.Initialize();
 
             SubscribeLocalEvent<PDAComponent, LightToggleEvent>(OnLightToggle);
-            SubscribeLocalEvent<PDAComponent, AfterActivatableUIOpenEvent>(AfterUIOpen);
-            SubscribeLocalEvent<PDAComponent, StoreAddedEvent>(OnUplinkInit);
-            SubscribeLocalEvent<PDAComponent, StoreRemovedEvent>(OnUplinkRemoved);
             SubscribeLocalEvent<PDAComponent, GridModifiedEvent>(OnGridChanged);
         }
 
@@ -76,16 +70,6 @@ namespace Content.Server.PDA
             UpdatePDAUserInterface(pda);
         }
 
-        private void OnUplinkInit(EntityUid uid, PDAComponent pda, ref StoreAddedEvent args)
-        {
-            UpdatePDAUserInterface(pda);
-        }
-
-        private void OnUplinkRemoved(EntityUid uid, PDAComponent pda, ref StoreRemovedEvent args)
-        {
-            UpdatePDAUserInterface(pda);
-        }
-
         private void OnGridChanged(EntityUid uid, PDAComponent pda, GridModifiedEvent args)
         {
             UpdateStationName(pda);
@@ -109,25 +93,6 @@ namespace Content.Server.PDA
             var state = new PDAUpdateState(pda.FlashlightOn, pda.PenSlot.HasItem, ownerInfo, pda.StationName, false, hasInstrument, address);
 
             _cartridgeLoaderSystem?.UpdateUiState(pda.Owner, state);
-
-            // TODO UPLINK RINGTONES/SECRETS This is just a janky placeholder way of hiding uplinks from non syndicate
-            // players. This should really use a sort of key-code entry system that selects an account which is not directly tied to
-            // a player entity.
-
-            if (!TryComp<StoreComponent>(pda.Owner, out var storeComponent))
-                return;
-
-            var uplinkState = new PDAUpdateState(pda.FlashlightOn, pda.PenSlot.HasItem, ownerInfo, pda.StationName, true, hasInstrument, address);
-
-            foreach (var session in ui.SubscribedSessions)
-            {
-                if (session.AttachedEntity is not { Valid: true } user)
-                    continue;
-
-                if (storeComponent.AccountOwner == user || (TryComp<MindComponent>(session.AttachedEntity, out var mindcomp) && mindcomp.Mind != null &&
-                    mindcomp.Mind.HasRole<TraitorRole>()))
-                    _cartridgeLoaderSystem?.UpdateUiState(pda.Owner, uplinkState, session);
-            }
         }
 
         private void OnUIMessage(PDAComponent pda, ServerBoundUserInterfaceMessage msg)
@@ -145,14 +110,6 @@ namespace Content.Server.PDA
                             _unpoweredFlashlight.ToggleLight(pdaEnt, flashlight);
                         break;
                     }
-
-                case PDAShowUplinkMessage _:
-                    {
-                        if (msg.Session.AttachedEntity != null &&
-                            TryComp<StoreComponent>(pdaEnt, out var store))
-                            _storeSystem.ToggleUi(msg.Session.AttachedEntity.Value, pdaEnt, store);
-                        break;
-                    }
                 case PDAShowRingtoneMessage _:
                     {
                         if (EntityManager.TryGetComponent(pdaEnt, out RingerComponent? ringer))
@@ -174,32 +131,6 @@ namespace Content.Server.PDA
             pda.StationName = station is null ? null : Name(station.Value);
         }
 
-        private void AfterUIOpen(EntityUid uid, PDAComponent pda, AfterActivatableUIOpenEvent args)
-        {
-            //TODO: this is awful
-            // A new user opened the UI --> Check if they are a traitor and should get a user specific UI state override.
-            if (!TryComp<StoreComponent>(pda.Owner, out var storeComp))
-                return;
-
-            if (storeComp.AccountOwner != args.User &&
-                !(TryComp<MindComponent>(args.User, out var mindcomp) && mindcomp.Mind != null && mindcomp.Mind.HasRole<TraitorRole>()))
-                return;
-
-            if (!_uiSystem.TryGetUi(pda.Owner, PDAUiKey.Key, out var ui))
-                return;
-
-            var ownerInfo = new PDAIdInfoText
-            {
-                ActualOwnerName = pda.OwnerName,
-                IdOwner = pda.ContainedID?.FullName,
-                JobTitle = pda.ContainedID?.JobTitle
-            };
-
-            var state = new PDAUpdateState(pda.FlashlightOn, pda.PenSlot.HasItem, ownerInfo, pda.StationName, true, HasComp<InstrumentComponent>(pda.Owner), GetDeviceNetAddress(pda.Owner));
-
-            _cartridgeLoaderSystem?.UpdateUiState(uid, state, args.Session);
-        }
-
         private string? GetDeviceNetAddress(EntityUid uid)
         {
             string? address = null;
index eb5e38e5a8ee42d8a568e063519aafb69dce3af6..b0b56bc740f6e35587fa049627d985d9f5ad98c5 100644 (file)
@@ -1,17 +1,21 @@
+using Content.Server.Store.Components;
+using Content.Server.Store.Systems;
 using Content.Server.UserInterface;
+using Content.Shared.PDA;
 using Content.Shared.PDA.Ringer;
-using Robust.Shared.Audio;
 using Robust.Server.Player;
+using Robust.Shared.Audio;
 using Robust.Shared.Player;
-using Content.Shared.PDA;
 using Robust.Shared.Random;
 using Robust.Shared.Utility;
+using System.Linq;
 
 namespace Content.Server.PDA.Ringer
 {
     public sealed class RingerSystem : SharedRingerSystem
     {
         [Dependency] private readonly IRobustRandom _random = default!;
+        [Dependency] private readonly StoreSystem _store = default!;
 
         public override void Initialize()
         {
@@ -19,10 +23,13 @@ namespace Content.Server.PDA.Ringer
 
             // General Event Subscriptions
             SubscribeLocalEvent<RingerComponent, MapInitEvent>(RandomizeRingtone);
+            SubscribeLocalEvent<RingerUplinkComponent, ComponentInit>(RandomizeUplinkCode);
             // RingerBoundUserInterface Subscriptions
             SubscribeLocalEvent<RingerComponent, RingerSetRingtoneMessage>(OnSetRingtone);
+            SubscribeLocalEvent<RingerUplinkComponent, RingerSetRingtoneMessage>(OnSetUplinkRingtone);
             SubscribeLocalEvent<RingerComponent, RingerPlayRingtoneMessage>(RingerPlayRingtone);
             SubscribeLocalEvent<RingerComponent, RingerRequestUpdateInterfaceMessage>(UpdateRingerUserInterfaceDriver);
+
         }
 
         //Event Functions
@@ -46,7 +53,30 @@ namespace Content.Server.PDA.Ringer
             UpdateRingerRingtone(ringer, args.Ringtone);
         }
 
+        private void OnSetUplinkRingtone(EntityUid uid, RingerUplinkComponent uplink, RingerSetRingtoneMessage args)
+        {
+            if (uplink.Code.SequenceEqual(args.Ringtone) &&
+                args.Session.AttachedEntity != null &&
+                TryComp<StoreComponent>(uid, out var store))
+            {
+                var user = args.Session.AttachedEntity.Value;
+                _store.ToggleUi(args.Session.AttachedEntity.Value, uid, store);
+            }
+        }
+
         public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, MapInitEvent args)
+        {
+            UpdateRingerRingtone(ringer, GenerateRingtone());
+        }
+
+        public void RandomizeUplinkCode(EntityUid uid, RingerUplinkComponent uplink, ComponentInit args)
+        {
+            uplink.Code = GenerateRingtone();
+        }
+
+        //Non Event Functions
+
+        private Note[] GenerateRingtone()
         {
             // Default to using C pentatonic so it at least sounds not terrible.
             var notes = new[]
@@ -65,12 +95,9 @@ namespace Content.Server.PDA.Ringer
                 ringtone[i] = _random.Pick(notes);
             }
 
-            UpdateRingerRingtone(ringer, ringtone);
-
+            return ringtone;
         }
 
-        //Non Event Functions
-
         private bool UpdateRingerRingtone(RingerComponent ringer, Note[] ringtone)
         {
             // Assume validation has already happened.
diff --git a/Content.Server/PDA/Ringer/RingerUplinkComponent.cs b/Content.Server/PDA/Ringer/RingerUplinkComponent.cs
new file mode 100644 (file)
index 0000000..138c48f
--- /dev/null
@@ -0,0 +1,18 @@
+using Content.Shared.PDA;
+
+namespace Content.Server.PDA.Ringer;
+
+/// <summary>
+/// Opens the store ui when the ringstone is set to the secret code.
+/// Traitors are told the code when greeted.
+/// </summary>
+[RegisterComponent, Access(typeof(RingerSystem))]
+public sealed class RingerUplinkComponent : Component
+{
+    /// <summary>
+    /// Notes to set ringtone to in order to open the uplink.
+    /// Automatically initialized to random notes.
+    /// </summary>
+    [DataField("code")]
+    public Note[] Code = new Note[RingerSystem.RingtoneLength];
+}
index 4e23122e7d1a9cf00409b2f8b5ecff36fd631491..6717fcb4c69f8a9bd5105cc14b70c4826c77ec31 100644 (file)
@@ -1,5 +1,6 @@
 using Content.Server.Chat.Managers;
 using Content.Server.Roles;
+using Content.Shared.PDA;
 using Content.Shared.Roles;
 
 namespace Content.Server.Traitor
@@ -18,13 +19,15 @@ namespace Content.Server.Traitor
         public override string Name { get; }
         public override bool Antagonist { get; }
 
-        public void GreetTraitor(string[] codewords)
+        public void GreetTraitor(string[] codewords, Note[] code)
         {
             if (Mind.TryGetSession(out var session))
             {
                 var chatMgr = IoCManager.Resolve<IChatManager>();
+                var entMgr = IoCManager.Resolve<IEntityManager>();
                 chatMgr.DispatchServerMessage(session, Loc.GetString("traitor-role-greeting"));
-                chatMgr.DispatchServerMessage(session, Loc.GetString("traitor-role-codewords", ("codewords", string.Join(", ",codewords))));
+                chatMgr.DispatchServerMessage(session, Loc.GetString("traitor-role-codewords", ("codewords", string.Join(", ", codewords))));
+                chatMgr.DispatchServerMessage(session, Loc.GetString("traitor-role-uplink-code", ("code", string.Join("", code))));
             }
         }
     }
index 956db85fcf0be65475b44043ae24527c1d166882..6d2f3cd20c38b52111072e0d4e33e51d5038ff76 100644 (file)
@@ -61,7 +61,11 @@ namespace Content.Server.Traitor.Uplink
             return true;
         }
 
-        private EntityUid? FindUplinkTarget(EntityUid user)
+        /// <summary>
+        /// Finds the entity that can hold an uplink for a user.
+        /// Usually this is a pda in their pda slot, but can also be in their hands. (but not pockets or inside bag, etc.)
+        /// </summary>
+        public EntityUid? FindUplinkTarget(EntityUid user)
         {
             // Try to find PDA in inventory
             if (_inventorySystem.TryGetContainerSlotEnumerator(user, out var containerSlotEnumerator))
index 44c4a3cc32cdf17fb3bb2a87852480d312df4d7f..872636165bb21122be2747469b0e14440726cc1e 100644 (file)
@@ -51,3 +51,12 @@ traitor-role-codewords =
     {$codewords}.
     Codewords can be used in regular conversation to identify yourself discretely to other syndicate agents.
     Listen for them, and keep them secret.
+traitor-role-uplink-code =
+    Set your ringtone to the notes {$code} to lock or unlock your uplink.
+    Remember to lock it and change it, or the stations crew will easily open it too!
+
+# don't need all the flavour text for character menu
+traitor-role-codewords-short =
+    The codewords are:
+    {$codewords}.
+traitor-role-uplink-code-short = Your uplink code is {$code}.