diff --git a/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs b/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs index e003d99569..d2fd6acd48 100644 --- a/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/CombatModeComponent.cs @@ -1,4 +1,5 @@ -using Content.Client.UserInterface; +using System; +using Content.Client.UserInterface; using Content.Shared.GameObjects.Components.Mobs; using Robust.Client.GameObjects; using Robust.Client.Player; @@ -6,38 +7,34 @@ using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; -using Robust.Shared.ViewVariables; namespace Content.Client.GameObjects.Components.Mobs { [RegisterComponent] + [ComponentReference(typeof(SharedCombatModeComponent))] public sealed class CombatModeComponent : SharedCombatModeComponent { #pragma warning disable 649 [Dependency] private readonly IPlayerManager _playerManager; -#pragma warning restore 649 - - [ViewVariables(VVAccess.ReadWrite)] - public bool IsInCombatMode { get; private set; } - - [ViewVariables(VVAccess.ReadWrite)] - public TargetingZone ActiveZone { get; private set; } - -#pragma warning disable 649 [Dependency] private readonly IGameHud _gameHud; #pragma warning restore 649 - public override void HandleComponentState(ComponentState curState, ComponentState nextState) + public override bool IsInCombatMode { - base.HandleComponentState(curState, nextState); - - if (!(curState is CombatModeComponentState state)) - return; - - IsInCombatMode = state.IsInCombatMode; - ActiveZone = state.TargetingZone; - if (Owner == _playerManager.LocalPlayer.ControlledEntity) + get => base.IsInCombatMode; + set { + base.IsInCombatMode = value; + UpdateHud(); + } + } + + public override TargetingZone ActiveZone + { + get => base.ActiveZone; + set + { + base.ActiveZone = value; UpdateHud(); } } @@ -61,6 +58,11 @@ namespace Content.Client.GameObjects.Components.Mobs private void UpdateHud() { + if (Owner != _playerManager.LocalPlayer.ControlledEntity) + { + return; + } + _gameHud.CombatModeActive = IsInCombatMode; _gameHud.TargetingZone = ActiveZone; } diff --git a/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs b/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs index 8d73a4fa5a..bdc5bc0a44 100644 --- a/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs +++ b/Content.Client/GameObjects/EntitySystems/CombatModeSystem.cs @@ -3,15 +3,18 @@ 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; +using Robust.Client.GameObjects; using Robust.Client.GameObjects.EntitySystems; using Robust.Client.Graphics.Drawing; using Robust.Client.Graphics.Overlays; using Robust.Client.Interfaces.Graphics.Overlays; using Robust.Client.Interfaces.Input; using Robust.Client.Player; -using Robust.Shared.GameObjects.Systems; using Robust.Shared.Input; +using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Maths; using Robust.Shared.Players; @@ -19,7 +22,8 @@ using static Content.Client.StaticIoC; namespace Content.Client.GameObjects.EntitySystems { - public sealed class CombatModeSystem : EntitySystem + [UsedImplicitly] + public sealed class CombatModeSystem : SharedCombatModeSystem { private const float AttackTimeThreshold = 0.15f; @@ -28,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; @@ -44,10 +49,23 @@ namespace Content.Client.GameObjects.EntitySystems _inputSystem = EntitySystemManager.GetEntitySystem(); _inputSystem.BindMap.BindFunction(ContentKeyFunctions.UseOrAttack, new InputHandler(this)); - + _inputSystem.BindMap.BindFunction(ContentKeyFunctions.ToggleCombatMode, + InputCmdHandler.FromDelegate(CombatModeToggled)); _overlayManager.AddOverlay(new CombatModeOverlay(this)); } + private void CombatModeToggled(ICommonSession session) + { + if (_gameTiming.IsFirstTimePredicted) + { + EntityManager.RaisePredictiveEvent( + new CombatModeSystemMessages.SetCombatModeActiveMessage(!IsInCombatMode())); + + // Just in case. + UseOrAttackIsDown = false; + } + } + public override void Shutdown() { base.Shutdown(); @@ -68,12 +86,12 @@ namespace Content.Client.GameObjects.EntitySystems private void OnTargetingZoneChanged(TargetingZone obj) { - RaiseNetworkEvent(new CombatModeSystemMessages.SetTargetZoneMessage(obj)); + EntityManager.RaisePredictiveEvent(new CombatModeSystemMessages.SetTargetZoneMessage(obj)); } private void OnCombatModeChanged(bool obj) { - RaiseNetworkEvent(new CombatModeSystemMessages.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 f8547b0830..feeff6d44e 100644 --- a/Content.Server/GameObjects/Components/Mobs/CombatModeComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/CombatModeComponent.cs @@ -1,6 +1,5 @@ using Content.Shared.GameObjects.Components.Mobs; using Robust.Shared.GameObjects; -using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Mobs { @@ -10,36 +9,8 @@ namespace Content.Server.GameObjects.Components.Mobs /// using *everything* as a weapon. /// [RegisterComponent] + [ComponentReference(typeof(SharedCombatModeComponent))] public sealed class CombatModeComponent : SharedCombatModeComponent { - private bool _isInCombatMode; - private TargetingZone _activeZone; - - [ViewVariables(VVAccess.ReadWrite)] - public bool IsInCombatMode - { - get => _isInCombatMode; - set - { - _isInCombatMode = value; - Dirty(); - } - } - - [ViewVariables(VVAccess.ReadWrite)] - public TargetingZone ActiveZone - { - get => _activeZone; - set - { - _activeZone = value; - Dirty(); - } - } - - public override ComponentState GetComponentState() - { - return new CombatModeComponentState(IsInCombatMode, ActiveZone); - } } } diff --git a/Content.Server/GameObjects/EntitySystems/Click/ExamineSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/ExamineSystem.cs index 2f67454a90..b8f2d3cd76 100644 --- a/Content.Server/GameObjects/EntitySystems/Click/ExamineSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Click/ExamineSystem.cs @@ -1,6 +1,7 @@ using Content.Shared.GameObjects.EntitySystemMessages; using Content.Shared.GameObjects.EntitySystems; using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Maths; @@ -20,7 +21,6 @@ namespace Content.Server.GameObjects.EntitySystems { #pragma warning disable 649 [Dependency] private IEntityManager _entityManager; - [Dependency] private IPlayerManager _playerManager; #pragma warning restore 649 private static readonly FormattedMessage _entityNotFoundMessage; @@ -75,14 +75,12 @@ namespace Content.Server.GameObjects.EntitySystems return message; } - private void ExamineInfoRequest(ExamineSystemMessages.RequestExamineInfoMessage request) + private void ExamineInfoRequest(ExamineSystemMessages.RequestExamineInfoMessage request, EntitySessionEventArgs eventArgs) { - var channel = request.NetChannel; - if(channel == null) - return; - - var session = _playerManager.GetSessionByChannel(channel); + var player = (IPlayerSession) eventArgs.SenderSession; + var session = eventArgs.SenderSession; var playerEnt = session.AttachedEntity; + var channel = player.ConnectedClient; if (playerEnt == null || !_entityManager.TryGetEntity(request.EntityUid, out var entity) diff --git a/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs b/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs index ec560d9295..926dbc15a2 100644 --- a/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/CombatModeSystem.cs @@ -1,80 +1,20 @@ using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Input; using JetBrains.Annotations; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.Player; -using Robust.Shared.GameObjects; -using Robust.Shared.GameObjects.Systems; using Robust.Shared.Input; +using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; +using Robust.Shared.Log; using Robust.Shared.Players; -using static Content.Shared.GameObjects.EntitySystemMessages.CombatModeSystemMessages; +using Robust.Shared.Random; namespace Content.Server.GameObjects.EntitySystems { [UsedImplicitly] - public sealed class CombatModeSystem : EntitySystem + public sealed class CombatModeSystem : SharedCombatModeSystem { -#pragma warning disable 649 - [Dependency] private readonly IPlayerManager _playerManager; -#pragma warning restore 649 - - public override void Initialize() - { - base.Initialize(); - - SubscribeNetworkEvent(SetTargetZoneHandler); - SubscribeNetworkEvent(SetCombatModeActiveHandler); - - var inputSystem = EntitySystemManager.GetEntitySystem(); - inputSystem.BindMap.BindFunction(ContentKeyFunctions.ToggleCombatMode, - InputCmdHandler.FromDelegate(CombatModeToggled)); - } - - private void SetCombatModeActiveHandler(SetCombatModeActiveMessage ev) - { - if (!TryGetCombatComponent(ev, out var combatModeComponent)) - return; - - combatModeComponent.IsInCombatMode = ev.Active; - } - - private void SetTargetZoneHandler(SetTargetZoneMessage ev) - { - if (!TryGetCombatComponent(ev, out var combatModeComponent)) - return; - - combatModeComponent.ActiveZone = ev.TargetZone; - } - - private bool TryGetCombatComponent(EntitySystemMessage ev, out CombatModeComponent combatModeComponent) - { - if (ev.NetChannel == null) - { - combatModeComponent = default; - return false; - } - - var player = _playerManager.GetSessionByChannel(ev.NetChannel); - if (player.AttachedEntity != null && player.AttachedEntity.TryGetComponent(out combatModeComponent)) - return true; - - combatModeComponent = default; - return false; - - } - - 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.Server/GameObjects/EntitySystems/VerbSystem.cs b/Content.Server/GameObjects/EntitySystems/VerbSystem.cs index 95be3be1aa..f84d55bd00 100644 --- a/Content.Server/GameObjects/EntitySystems/VerbSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/VerbSystem.cs @@ -2,6 +2,7 @@ using System.Reflection; using Content.Shared.GameObjects; using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; @@ -13,7 +14,6 @@ namespace Content.Server.GameObjects.EntitySystems { #pragma warning disable 649 [Dependency] private readonly IEntityManager _entityManager; - [Dependency] private readonly IPlayerManager _playerManager; #pragma warning restore 649 public override void Initialize() @@ -26,18 +26,14 @@ namespace Content.Server.GameObjects.EntitySystems IoCManager.InjectDependencies(this); } - private void UseVerb(UseVerbMessage use) + private void UseVerb(UseVerbMessage use, EntitySessionEventArgs eventArgs) { - var channel = use.NetChannel; - if(channel == null) - return; - if (!_entityManager.TryGetEntity(use.EntityUid, out var entity)) { return; } - var session = _playerManager.GetSessionByChannel(channel); + var session = eventArgs.SenderSession; var userEntity = session.AttachedEntity; foreach (var (component, verb) in VerbUtility.GetVerbs(entity)) @@ -83,19 +79,16 @@ namespace Content.Server.GameObjects.EntitySystems } } - private void RequestVerbs(RequestVerbsMessage req) + private void RequestVerbs(RequestVerbsMessage req, EntitySessionEventArgs eventArgs) { - var channel = req.NetChannel; - if (channel == null) - return; + var player = (IPlayerSession) eventArgs.SenderSession; if (!_entityManager.TryGetEntity(req.EntityUid, out var entity)) { return; } - var session = _playerManager.GetSessionByChannel(channel); - var userEntity = session.AttachedEntity; + var userEntity = player.AttachedEntity; var data = new List(); //Get verbs, component dependent. @@ -125,7 +118,7 @@ namespace Content.Server.GameObjects.EntitySystems } var response = new VerbsResponseMessage(data, req.EntityUid); - RaiseNetworkEvent(response, channel); + RaiseNetworkEvent(response, player.ConnectedClient); } } } diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedCombatModeComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedCombatModeComponent.cs index 047d4c2cce..507a61e48d 100644 --- a/Content.Shared/GameObjects/Components/Mobs/SharedCombatModeComponent.cs +++ b/Content.Shared/GameObjects/Components/Mobs/SharedCombatModeComponent.cs @@ -1,6 +1,9 @@ using System; using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; namespace Content.Shared.GameObjects.Components.Mobs { @@ -9,6 +12,50 @@ namespace Content.Shared.GameObjects.Components.Mobs public sealed override uint? NetID => ContentNetIDs.COMBATMODE; public override string Name => "CombatMode"; + private bool _isInCombatMode; + private TargetingZone _activeZone; + + [ViewVariables(VVAccess.ReadWrite)] + public virtual bool IsInCombatMode + { + get => _isInCombatMode; + set + { + var gt = IoCManager.Resolve(); + + _isInCombatMode = value; + Dirty(); + } + } + + [ViewVariables(VVAccess.ReadWrite)] + public virtual TargetingZone ActiveZone + { + get => _activeZone; + set + { + _activeZone = value; + Dirty(); + } + } + + public override void HandleComponentState(ComponentState curState, ComponentState nextState) + { + base.HandleComponentState(curState, nextState); + + if (!(curState is CombatModeComponentState state)) + return; + + IsInCombatMode = state.IsInCombatMode; + ActiveZone = state.TargetingZone; + } + + + public override ComponentState GetComponentState() + { + return new CombatModeComponentState(IsInCombatMode, ActiveZone); + } + [Serializable, NetSerializable] protected sealed class CombatModeComponentState : ComponentState { diff --git a/Content.Shared/GameObjects/EntitySystems/SharedCombatModeSystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedCombatModeSystem.cs new file mode 100644 index 0000000000..53833a14d0 --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystems/SharedCombatModeSystem.cs @@ -0,0 +1,35 @@ +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; + } + + combatModeComponent.IsInCombatMode = ev.Active; + } + } +} diff --git a/RobustToolbox b/RobustToolbox index 12fb54904a..0c8f869cb4 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 12fb54904af95b7f2083fb51d649ffa3b2a817fd +Subproject commit 0c8f869cb4834fa7f03ce56bf3e74953c594e02b