diff --git a/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs b/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs index 5594677999..d2fd6acd48 100644 --- a/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs @@ -11,6 +11,7 @@ using Robust.Shared.IoC; namespace Content.Client.GameObjects.Components.Mobs { [RegisterComponent] + [ComponentReference(typeof(SharedCombatModeComponent))] public sealed class CombatModeComponent : SharedCombatModeComponent { #pragma warning disable 649 diff --git a/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs b/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs index d6895276b1..bdc5bc0a44 100644 --- a/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs +++ b/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs @@ -2,6 +2,7 @@ using Content.Client.GameObjects.Components.Mobs; using Content.Client.UserInterface; using Content.Client.Utility; using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystemMessages; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Input; using JetBrains.Annotations; @@ -13,6 +14,7 @@ using Robust.Client.Interfaces.Graphics.Overlays; using Robust.Client.Interfaces.Input; using Robust.Client.Player; using Robust.Shared.Input; +using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Maths; using Robust.Shared.Players; @@ -30,6 +32,7 @@ namespace Content.Client.GameObjects.EntitySystems [Dependency] private readonly IPlayerManager _playerManager; [Dependency] private readonly IInputManager _inputManager; [Dependency] private readonly IOverlayManager _overlayManager; + [Dependency] private readonly IGameTiming _gameTiming; #pragma warning restore 649 private InputSystem _inputSystem; @@ -47,21 +50,20 @@ namespace Content.Client.GameObjects.EntitySystems _inputSystem = EntitySystemManager.GetEntitySystem(); _inputSystem.BindMap.BindFunction(ContentKeyFunctions.UseOrAttack, new InputHandler(this)); _inputSystem.BindMap.BindFunction(ContentKeyFunctions.ToggleCombatMode, - InputCmdHandler.FromDelegate(CombatModeToggled, handle: false)); + InputCmdHandler.FromDelegate(CombatModeToggled)); _overlayManager.AddOverlay(new CombatModeOverlay(this)); } private void CombatModeToggled(ICommonSession session) { - var player = IoCManager.Resolve().LocalPlayer; - - if (player.ControlledEntity == null || - !player.ControlledEntity.TryGetComponent(out CombatModeComponent combatModeComponent)) + if (_gameTiming.IsFirstTimePredicted) { - return; - } + EntityManager.RaisePredictiveEvent( + new CombatModeSystemMessages.SetCombatModeActiveMessage(!IsInCombatMode())); - combatModeComponent.IsInCombatMode = !combatModeComponent.IsInCombatMode; + // Just in case. + UseOrAttackIsDown = false; + } } public override void Shutdown() @@ -84,12 +86,12 @@ namespace Content.Client.GameObjects.EntitySystems private void OnTargetingZoneChanged(TargetingZone obj) { - EntityManager.RaisePredictiveEvent(new SetTargetZoneMessage(obj)); + EntityManager.RaisePredictiveEvent(new CombatModeSystemMessages.SetTargetZoneMessage(obj)); } private void OnCombatModeChanged(bool obj) { - EntityManager.RaisePredictiveEvent(new SetCombatModeActiveMessage(obj)); + EntityManager.RaisePredictiveEvent(new CombatModeSystemMessages.SetCombatModeActiveMessage(obj)); // Just in case. UseOrAttackIsDown = false; diff --git a/Content.Server/GameObjects/Components/Mobs/CombatModeComponent.cs b/Content.Server/GameObjects/Components/Mobs/CombatModeComponent.cs index 334f8445cb..feeff6d44e 100644 --- a/Content.Server/GameObjects/Components/Mobs/CombatModeComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/CombatModeComponent.cs @@ -9,6 +9,7 @@ namespace Content.Server.GameObjects.Components.Mobs /// using *everything* as a weapon. /// [RegisterComponent] + [ComponentReference(typeof(SharedCombatModeComponent))] public sealed class CombatModeComponent : SharedCombatModeComponent { } diff --git a/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs b/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs index 4f72374ff3..926dbc15a2 100644 --- a/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs @@ -5,34 +5,16 @@ using JetBrains.Annotations; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.Player; using Robust.Shared.Input; +using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; +using Robust.Shared.Log; using Robust.Shared.Players; +using Robust.Shared.Random; namespace Content.Server.GameObjects.EntitySystems { [UsedImplicitly] public sealed class CombatModeSystem : SharedCombatModeSystem { - public override void Initialize() - { - base.Initialize(); - - var inputSystem = EntitySystemManager.GetEntitySystem(); - inputSystem.BindMap.BindFunction(ContentKeyFunctions.ToggleCombatMode, - InputCmdHandler.FromDelegate(CombatModeToggled)); - } - - private static void CombatModeToggled(ICommonSession session) - { - var playerSession = (IPlayerSession) session; - - if (playerSession.AttachedEntity == null || - !playerSession.AttachedEntity.TryGetComponent(out CombatModeComponent combatModeComponent)) - { - return; - } - - combatModeComponent.IsInCombatMode = !combatModeComponent.IsInCombatMode; - } } } diff --git a/Content.Shared/GameObjects/EntitySystems/SharedCombatModeSystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedCombatModeSystem.cs new file mode 100644 index 0000000000..3f7b9a9761 --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystems/SharedCombatModeSystem.cs @@ -0,0 +1,40 @@ +using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystemMessages; +using Content.Shared.Interfaces; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Random; +using Logger = Robust.Shared.Log.Logger; + +namespace Content.Shared.GameObjects.EntitySystems +{ + public abstract class SharedCombatModeSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(CombatModeActiveHandler); + SubscribeLocalEvent(CombatModeActiveHandler); + } + + private void CombatModeActiveHandler(CombatModeSystemMessages.SetCombatModeActiveMessage ev, EntitySessionEventArgs eventArgs) + { + var entity = eventArgs.SenderSession.AttachedEntity; + + if (!entity.TryGetComponent(out SharedCombatModeComponent combatModeComponent)) + { + return; + } + + if (IoCManager.Resolve().IsServerModule && IoCManager.Resolve().Prob(0.5f)) + { + Logger.Info("Mispredict!"); + return; + } + combatModeComponent.IsInCombatMode = ev.Active; + } + } +}