* Get rid of a bunch of obsolete usages * position --------- Co-authored-by: plykiya <plykiya@protonmail.com>
118 lines
4.3 KiB
C#
118 lines
4.3 KiB
C#
using System.Numerics;
|
|
using Content.Client.Gameplay;
|
|
using Content.Shared.Hands.Components;
|
|
using Content.Shared.Interaction;
|
|
using Content.Shared.RCD.Components;
|
|
using Content.Shared.RCD.Systems;
|
|
using Robust.Client.Placement;
|
|
using Robust.Client.Player;
|
|
using Robust.Client.State;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Map.Components;
|
|
|
|
namespace Content.Client.RCD;
|
|
|
|
public sealed class AlignRCDConstruction : PlacementMode
|
|
{
|
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
|
private readonly SharedMapSystem _mapSystem;
|
|
private readonly RCDSystem _rcdSystem;
|
|
private readonly SharedTransformSystem _transformSystem;
|
|
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
|
[Dependency] private readonly IStateManager _stateManager = default!;
|
|
|
|
private const float SearchBoxSize = 2f;
|
|
private const float PlaceColorBaseAlpha = 0.5f;
|
|
|
|
private EntityCoordinates _unalignedMouseCoords = default;
|
|
|
|
/// <summary>
|
|
/// This placement mode is not on the engine because it is content specific (i.e., for the RCD)
|
|
/// </summary>
|
|
public AlignRCDConstruction(PlacementManager pMan) : base(pMan)
|
|
{
|
|
IoCManager.InjectDependencies(this);
|
|
_mapSystem = _entityManager.System<SharedMapSystem>();
|
|
_rcdSystem = _entityManager.System<RCDSystem>();
|
|
_transformSystem = _entityManager.System<SharedTransformSystem>();
|
|
|
|
ValidPlaceColor = ValidPlaceColor.WithAlpha(PlaceColorBaseAlpha);
|
|
}
|
|
|
|
public override void AlignPlacementMode(ScreenCoordinates mouseScreen)
|
|
{
|
|
_unalignedMouseCoords = ScreenToCursorGrid(mouseScreen);
|
|
MouseCoords = _unalignedMouseCoords.AlignWithClosestGridTile(SearchBoxSize, _entityManager, _mapManager);
|
|
|
|
var gridId = _transformSystem.GetGrid(MouseCoords);
|
|
|
|
if (!_entityManager.TryGetComponent<MapGridComponent>(gridId, out var mapGrid))
|
|
return;
|
|
|
|
CurrentTile = _mapSystem.GetTileRef(gridId.Value, mapGrid, MouseCoords);
|
|
|
|
float tileSize = mapGrid.TileSize;
|
|
GridDistancing = tileSize;
|
|
|
|
if (pManager.CurrentPermission!.IsTile)
|
|
{
|
|
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, new Vector2(CurrentTile.X + tileSize / 2,
|
|
CurrentTile.Y + tileSize / 2));
|
|
}
|
|
else
|
|
{
|
|
MouseCoords = new EntityCoordinates(MouseCoords.EntityId, new Vector2(CurrentTile.X + tileSize / 2 + pManager.PlacementOffset.X,
|
|
CurrentTile.Y + tileSize / 2 + pManager.PlacementOffset.Y));
|
|
}
|
|
}
|
|
|
|
public override bool IsValidPosition(EntityCoordinates position)
|
|
{
|
|
var player = _playerManager.LocalSession?.AttachedEntity;
|
|
|
|
// If the destination is out of interaction range, set the placer alpha to zero
|
|
if (!_entityManager.TryGetComponent<TransformComponent>(player, out var xform))
|
|
return false;
|
|
|
|
if (!xform.Coordinates.InRange(_entityManager, _transformSystem, position, SharedInteractionSystem.InteractionRange))
|
|
{
|
|
InvalidPlaceColor = InvalidPlaceColor.WithAlpha(0);
|
|
return false;
|
|
}
|
|
|
|
// Otherwise restore the alpha value
|
|
else
|
|
{
|
|
InvalidPlaceColor = InvalidPlaceColor.WithAlpha(PlaceColorBaseAlpha);
|
|
}
|
|
|
|
// Determine if player is carrying an RCD in their active hand
|
|
if (!_entityManager.TryGetComponent<HandsComponent>(player, out var hands))
|
|
return false;
|
|
|
|
var heldEntity = hands.ActiveHand?.HeldEntity;
|
|
|
|
if (!_entityManager.TryGetComponent<RCDComponent>(heldEntity, out var rcd))
|
|
return false;
|
|
|
|
// Retrieve the map grid data for the position
|
|
if (!_rcdSystem.TryGetMapGridData(position, out var mapGridData))
|
|
return false;
|
|
|
|
// Determine if the user is hovering over a target
|
|
var currentState = _stateManager.CurrentState;
|
|
|
|
if (currentState is not GameplayStateBase screen)
|
|
return false;
|
|
|
|
var target = screen.GetClickedEntity(_transformSystem.ToMapCoordinates(_unalignedMouseCoords));
|
|
|
|
// Determine if the RCD operation is valid or not
|
|
if (!_rcdSystem.IsRCDOperationStillValid(heldEntity.Value, rcd, mapGridData.Value, target, player.Value, false))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
}
|