| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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 (!_transformSystem.InRange(xform.Coordinates, 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;
- }
- }
|