Files
OldThink/Content.Client/CombatMode/CombatModeSystem.cs

104 lines
3.1 KiB
C#
Raw Normal View History

using Content.Client.Hands.Systems;
2023-09-03 06:16:34 +10:00
using Content.Shared.Actions;
2021-06-09 22:19:39 +02:00
using Content.Shared.CombatMode;
using Content.Shared.Targeting;
using Content.Shared.CCVar;
using Robust.Client.Player;
using Robust.Client.Input;
using Robust.Client.Graphics;
using Robust.Shared.GameStates;
using Robust.Shared.Configuration;
namespace Content.Client.CombatMode;
public sealed class CombatModeSystem : SharedCombatModeSystem
{
[Dependency] private readonly IOverlayManager _overlayManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IInputManager _inputManager = default!;
[Dependency] private readonly IEyeManager _eye = default!;
2023-09-03 06:16:34 +10:00
/// <summary>
/// Raised whenever combat mode changes.
/// </summary>
public event Action<bool>? LocalPlayerCombatModeUpdated;
public override void Initialize()
{
base.Initialize();
2023-09-03 06:16:34 +10:00
SubscribeLocalEvent<CombatModeComponent, AfterAutoHandleStateEvent>(OnHandleState);
_cfg.OnValueChanged(CCVars.CombatModeIndicatorsPointShow, OnShowCombatIndicatorsChanged, true);
}
2023-09-03 06:16:34 +10:00
private void OnHandleState(EntityUid uid, CombatModeComponent component, ref AfterAutoHandleStateEvent args)
{
UpdateHud(uid);
}
public override void Shutdown()
{
2023-09-03 06:16:34 +10:00
_cfg.UnsubValueChanged(CCVars.CombatModeIndicatorsPointShow, OnShowCombatIndicatorsChanged);
_overlayManager.RemoveOverlay<CombatModeIndicatorsOverlay>();
base.Shutdown();
}
private void OnTargetingZoneChanged(TargetingZone obj)
{
EntityManager.RaisePredictiveEvent(new CombatModeSystemMessages.SetTargetZoneMessage(obj));
}
public bool IsInCombatMode()
{
var entity = _playerManager.LocalPlayer?.ControlledEntity;
if (entity == null)
return false;
return IsInCombatMode(entity.Value);
}
2023-09-03 06:16:34 +10:00
public override void SetInCombatMode(EntityUid entity, bool value, CombatModeComponent? component = null)
{
2023-09-03 06:16:34 +10:00
base.SetInCombatMode(entity, value, component);
UpdateHud(entity);
}
public override void SetActiveZone(EntityUid entity, TargetingZone zone, CombatModeComponent? component = null)
{
base.SetActiveZone(entity, zone, component);
UpdateHud(entity);
}
private void UpdateHud(EntityUid entity)
{
2023-09-03 06:16:34 +10:00
if (entity != _playerManager.LocalPlayer?.ControlledEntity || !Timing.IsFirstTimePredicted)
{
return;
}
2023-09-03 06:16:34 +10:00
var inCombatMode = IsInCombatMode();
LocalPlayerCombatModeUpdated?.Invoke(inCombatMode);
}
private void OnShowCombatIndicatorsChanged(bool isShow)
{
if (isShow)
{
_overlayManager.AddOverlay(new CombatModeIndicatorsOverlay(
_inputManager,
EntityManager,
_eye,
this,
EntityManager.System<HandsSystem>()));
}
else
{
_overlayManager.RemoveOverlay<CombatModeIndicatorsOverlay>();
}
}
}