From 1f4dfcdcf94dc327b5de2d016dba2fe18c3acbe2 Mon Sep 17 00:00:00 2001 From: Winkarst-cpu <74284083+Winkarst-cpu@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:54:02 +0300 Subject: [PATCH] Predict GetVerbsEvent in PowerSwitchableSystem (#39589) * Prediction * Update --- .../Power/Generator/GeneratorSystem.cs | 1 + .../Generator/PortableGeneratorSystem.cs | 8 --- .../Power/Generator/PowerSwitchableSystem.cs | 56 ++----------------- .../SharedPortableGeneratorSystem.cs | 12 ++++ .../Generator/SharedPowerSwitchableSystem.cs | 45 +++++++++++++++ 5 files changed, 62 insertions(+), 60 deletions(-) diff --git a/Content.Server/Power/Generator/GeneratorSystem.cs b/Content.Server/Power/Generator/GeneratorSystem.cs index 72b99d59af..97491ddbf4 100644 --- a/Content.Server/Power/Generator/GeneratorSystem.cs +++ b/Content.Server/Power/Generator/GeneratorSystem.cs @@ -198,6 +198,7 @@ public sealed class GeneratorSystem : SharedGeneratorSystem generator.On = on; UpdateState(uid, generator); + Dirty(uid, generator); } public override void Update(float frameTime) diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs index a2d506f6c2..d8fca4e48a 100644 --- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs +++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs @@ -42,8 +42,6 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem SubscribeLocalEvent(GeneratorStartMessage); SubscribeLocalEvent(GeneratorStopMessage); SubscribeLocalEvent(GeneratorSwitchOutputMessage); - - SubscribeLocalEvent(OnSwitchPowerCheck); } private void GeneratorSwitchOutputMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorSwitchOutputMessage args) @@ -195,12 +193,6 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem } } - private void OnSwitchPowerCheck(EntityUid uid, FuelGeneratorComponent comp, ref SwitchPowerCheckEvent args) - { - if (comp.On) - args.DisableMessage = Loc.GetString("fuel-generator-verb-disable-on"); - } - public override void Update(float frameTime) { var query = EntityQueryEnumerator(); diff --git a/Content.Server/Power/Generator/PowerSwitchableSystem.cs b/Content.Server/Power/Generator/PowerSwitchableSystem.cs index 25de3bd293..1a89f20627 100644 --- a/Content.Server/Power/Generator/PowerSwitchableSystem.cs +++ b/Content.Server/Power/Generator/PowerSwitchableSystem.cs @@ -1,5 +1,4 @@ -using Content.Server.NodeContainer; -using Content.Server.NodeContainer.EntitySystems; +using Content.Server.NodeContainer.EntitySystems; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.Nodes; @@ -7,9 +6,7 @@ using Content.Shared.NodeContainer; using Content.Shared.Power; using Content.Shared.Power.Generator; using Content.Shared.Timing; -using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; -using Robust.Shared.Utility; namespace Content.Server.Power.Generator; @@ -26,47 +23,9 @@ public sealed class PowerSwitchableSystem : SharedPowerSwitchableSystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent>(GetVerbs); - } - - private void GetVerbs(EntityUid uid, PowerSwitchableComponent comp, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - var voltage = VoltageColor(GetNextVoltage(uid, comp)); - var msg = Loc.GetString("power-switchable-switch-voltage", ("voltage", voltage)); - - InteractionVerb verb = new() - { - Act = () => - { - // don't need to check it again since if its disabled server wont let the verb act - Cycle(uid, args.User, comp); - }, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/zap.svg.192dpi.png")), - Text = msg - }; - - var ev = new SwitchPowerCheckEvent(); - RaiseLocalEvent(uid, ref ev); - if (ev.DisableMessage != null) - { - verb.Message = ev.DisableMessage; - verb.Disabled = true; - } - - args.Verbs.Add(verb); - } - - /// - /// Cycles voltage then updates nodes and optionally power supplier to match it. - /// - public void Cycle(EntityUid uid, EntityUid user, PowerSwitchableComponent? comp = null) + // TODO: Prediction + /// + public override void Cycle(EntityUid uid, EntityUid user, PowerSwitchableComponent? comp = null) { if (!Resolve(uid, ref comp)) return; @@ -115,10 +74,3 @@ public sealed class PowerSwitchableSystem : SharedPowerSwitchableSystem _useDelay.TryResetDelay((uid, useDelay)); } } - -/// -/// Raised on a to see if its verb should work. -/// If is non-null, the verb is disabled with that as the message. -/// -[ByRefEvent] -public record struct SwitchPowerCheckEvent(string? DisableMessage = null); diff --git a/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs b/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs index e8ccc85166..4ed911c296 100644 --- a/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs +++ b/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs @@ -9,6 +9,18 @@ namespace Content.Shared.Power.Generator; /// public abstract class SharedPortableGeneratorSystem : EntitySystem { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSwitchPowerCheck); + } + + private void OnSwitchPowerCheck(EntityUid uid, FuelGeneratorComponent comp, ref SwitchPowerCheckEvent args) + { + if (comp.On) + args.DisableMessage = Loc.GetString("fuel-generator-verb-disable-on"); + } } /// diff --git a/Content.Shared/Power/Generator/SharedPowerSwitchableSystem.cs b/Content.Shared/Power/Generator/SharedPowerSwitchableSystem.cs index c1787b6078..00d2b1d7a0 100644 --- a/Content.Shared/Power/Generator/SharedPowerSwitchableSystem.cs +++ b/Content.Shared/Power/Generator/SharedPowerSwitchableSystem.cs @@ -1,4 +1,6 @@ using Content.Shared.Examine; +using Content.Shared.Verbs; +using Robust.Shared.Utility; namespace Content.Shared.Power.Generator; @@ -11,6 +13,7 @@ public abstract class SharedPowerSwitchableSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent>(GetVerbs); } private void OnExamined(EntityUid uid, PowerSwitchableComponent comp, ExaminedEvent args) @@ -20,6 +23,41 @@ public abstract class SharedPowerSwitchableSystem : EntitySystem args.PushMarkup(Loc.GetString(comp.ExamineText, ("voltage", voltage))); } + private void GetVerbs(EntityUid uid, PowerSwitchableComponent comp, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + var voltage = VoltageColor(GetNextVoltage(uid, comp)); + var msg = Loc.GetString("power-switchable-switch-voltage", ("voltage", voltage)); + + InteractionVerb verb = new() + { + Act = () => + { + // don't need to check it again since if its disabled server wont let the verb act + Cycle(uid, args.User, comp); + }, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/zap.svg.192dpi.png")), + Text = msg + }; + + var ev = new SwitchPowerCheckEvent(); + RaiseLocalEvent(uid, ref ev); + if (ev.DisableMessage != null) + { + verb.Message = ev.DisableMessage; + verb.Disabled = true; + } + + args.Verbs.Add(verb); + } + + /// + /// Cycles voltage then updates nodes and optionally power supplier to match it. + /// + public virtual void Cycle(EntityUid uid, EntityUid user, PowerSwitchableComponent? comp = null) { } + /// /// Helper to get the colored markup string for a voltage type. /// @@ -70,3 +108,10 @@ public abstract class SharedPowerSwitchableSystem : EntitySystem return comp.Cables[NextIndex(uid, comp)].Voltage; } } + +/// +/// Raised on a to see if its verb should work. +/// If is non-null, the verb is disabled with that as the message. +/// +[ByRefEvent] +public record struct SwitchPowerCheckEvent(string? DisableMessage = null);