Files
wwdpublic/Content.Client/UserInterface/Systems/Targeting/TargetingUIController.cs
2024-11-21 17:49:04 +07:00

83 lines
2.7 KiB
C#

using Content.Client.Gameplay;
using Content.Client.UserInterface.Systems.Targeting.Widgets;
using Content.Shared.Targeting;
using Content.Client.Targeting;
using Content.Shared.Targeting.Events;
using Robust.Client.UserInterface.Controllers;
using Robust.Client.Player;
namespace Content.Client.UserInterface.Systems.Targeting;
public sealed class TargetingUIController : UIController, IOnStateEntered<GameplayState>, IOnSystemChanged<TargetingSystem>
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IEntityNetworkManager _net = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
private TargetingComponent? _targetingComponent;
private TargetingControl? TargetingControl => UIManager.GetActiveUIWidgetOrNull<TargetingControl>();
public void OnSystemLoaded(TargetingSystem system)
{
system.TargetingStartup += AddTargetingControl;
system.TargetingShutdown += RemoveTargetingControl;
system.TargetChange += CycleTarget;
}
public void OnSystemUnloaded(TargetingSystem system)
{
system.TargetingStartup -= AddTargetingControl;
system.TargetingShutdown -= RemoveTargetingControl;
system.TargetChange -= CycleTarget;
}
public void OnStateEntered(GameplayState state)
{
if (TargetingControl == null)
return;
TargetingControl.SetTargetDollVisible(_targetingComponent != null);
if (_targetingComponent != null)
TargetingControl.SetBodyPartsVisible(_targetingComponent.Target);
}
public void AddTargetingControl(TargetingComponent component)
{
_targetingComponent = component;
if (TargetingControl != null)
{
TargetingControl.SetTargetDollVisible(_targetingComponent != null);
if (_targetingComponent != null)
TargetingControl.SetBodyPartsVisible(_targetingComponent.Target);
}
}
public void RemoveTargetingControl()
{
if (TargetingControl != null)
TargetingControl.SetTargetDollVisible(false);
_targetingComponent = null;
}
public void CycleTarget(TargetBodyPart bodyPart)
{
if (_playerManager.LocalEntity is not { } user
|| _entManager.GetComponent<TargetingComponent>(user) is not { } targetingComponent
|| TargetingControl == null)
return;
var player = _entManager.GetNetEntity(user);
if (bodyPart != targetingComponent.Target)
{
var msg = new TargetChangeEvent(player, bodyPart);
_net.SendSystemNetworkMessage(msg);
TargetingControl?.SetBodyPartsVisible(bodyPart);
}
}
}