* Fix TransformComponent.MapPosition warnings in Content.Client * Fix TransformComponent.MapPosition warnings in Content.IntegrationTests * Fix TransformComponent.MapPosition warnings in Content.Shared * Fix TransformComponent.MapPosition warnings in Content.Server * Fix TransformComponent.WorldPosition warnings in Content.Shared * Fix TransformComponent.WorldPosition warnings in Content.Client Excepts ClickableComponent b/c that needs to be ECS'd entirely later * Fix TransformComponent.WorldPosition warnings in Content.Server * Fix TransformComponent.WorldRotation warnings in Content.* * Fix TransformComponent.MapPosition warnings I missed * Fix TransformComponent.WorldMatrix warnings in Content.* * Fix TransformComponent.InvWorldMatrix warnings in Content.* * Fix TransformComponent.GetWorldPositionRotationMatrixWithInv warnings in Content.* * Fix TransformComponent.GetWorldPositionRotationMatrix warnings in Content.* * Fix TransformComponent.GetWorldPositionRotation warnings in Content.* * Fix TransformComponent.Anchored.set warnings in Content.* * Fix TransformComponent.Coordinates.set warnings in Content.* * Fix TransformComponent.LocalPosition.set warnings in Content.* * Fix TransformComponent.AttachToGridOrMap warnings in Content.* * Fix TransformComponent.AttachParent warnings in Content.* * Preempt TransformComponent.LocalRotation.set warnings in Content.Shared * Preempt TransformComponent.LocalRotation.set warnings in Content.Client * Preempt TransformComponent.LocalRotation.set warnings in Content.IntegrationTests * Preempt TransformComponent.LocalRotation.set warnings in Content.Server * Fix/Preempt the remaining obsolete TransformComponent properties/methods in Content.* * ECS ClickableComponent * Fix obsolete SharedTransformSystem methods in Content.* * Fix ExplosionOverlay `SharedTransformSystem` dependency * Maybe fix null eye position breaking tests * MGS requested changes
77 lines
2.6 KiB
C#
77 lines
2.6 KiB
C#
using System.Numerics;
|
|
using Content.Shared.CombatMode;
|
|
using Content.Shared.Weapons.Melee;
|
|
using Robust.Client.Graphics;
|
|
using Robust.Client.Input;
|
|
using Robust.Client.Player;
|
|
using Robust.Shared.Enums;
|
|
using Robust.Shared.Map;
|
|
|
|
namespace Content.Client.Weapons.Melee;
|
|
|
|
/// <summary>
|
|
/// Debug overlay showing the arc and range of a melee weapon.
|
|
/// </summary>
|
|
public sealed class MeleeArcOverlay : Overlay
|
|
{
|
|
private readonly IEntityManager _entManager;
|
|
private readonly IEyeManager _eyeManager;
|
|
private readonly IInputManager _inputManager;
|
|
private readonly IPlayerManager _playerManager;
|
|
private readonly MeleeWeaponSystem _melee;
|
|
private readonly SharedCombatModeSystem _combatMode;
|
|
private readonly SharedTransformSystem _xformSystem;
|
|
|
|
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
|
|
|
|
public MeleeArcOverlay(IEntityManager entManager, IEyeManager eyeManager, IInputManager inputManager, IPlayerManager playerManager, MeleeWeaponSystem melee, SharedCombatModeSystem combatMode)
|
|
{
|
|
_entManager = entManager;
|
|
_eyeManager = eyeManager;
|
|
_inputManager = inputManager;
|
|
_playerManager = playerManager;
|
|
_melee = melee;
|
|
_combatMode = combatMode;
|
|
_xformSystem = _entManager.System<SharedTransformSystem>();
|
|
}
|
|
|
|
protected override void Draw(in OverlayDrawArgs args)
|
|
{
|
|
var player = _playerManager.LocalEntity;
|
|
|
|
if (!_entManager.TryGetComponent<TransformComponent>(player, out var xform) ||
|
|
!_combatMode.IsInCombatMode(player))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!_melee.TryGetWeapon(player.Value, out _, out var weapon))
|
|
return;
|
|
|
|
var mousePos = _inputManager.MouseScreenPosition;
|
|
var mapPos = _eyeManager.PixelToMap(mousePos);
|
|
|
|
if (mapPos.MapId != args.MapId)
|
|
return;
|
|
|
|
var playerPos = _xformSystem.GetMapCoordinates((player.Value, xform));
|
|
|
|
if (mapPos.MapId != playerPos.MapId)
|
|
return;
|
|
|
|
var diff = mapPos.Position - playerPos.Position;
|
|
|
|
if (diff.Equals(Vector2.Zero))
|
|
return;
|
|
|
|
diff = diff.Normalized() * Math.Min(weapon.Range, diff.Length());
|
|
args.WorldHandle.DrawLine(playerPos.Position, playerPos.Position + diff, Color.Aqua);
|
|
|
|
if (weapon.Angle.Theta == 0)
|
|
return;
|
|
|
|
args.WorldHandle.DrawLine(playerPos.Position, playerPos.Position + new Angle(-weapon.Angle / 2).RotateVec(diff), Color.Orange);
|
|
args.WorldHandle.DrawLine(playerPos.Position, playerPos.Position + new Angle(weapon.Angle / 2).RotateVec(diff), Color.Orange);
|
|
}
|
|
}
|